Чтение почты с помощью php через pop302.09.2007 сайт автора: http://webi.ru
публикация данной статьи разрешена только со ссылкой на сайт автора статьиКак получать почту с помощью php, через pop3 используя сокеты.
Комментарии
RSS комментарии
13.01.2011 denis
Большое спасибо за статью !
но у мея возникла проблема, письмо выводит аброкодаброй, хотя все кодировки уже перепробывал.
Как быть ?
13.01.2011 denis
Помогите разобраться ,я взял код Артема, но немогу понять где та часть которая записывает уже в папку т.е,папку создает , а запись не производит
$pop_conn = fsockopen("pop.email.ua", 110,$errno, $errstr, 10);
print fgets($pop_conn,1024);
fputs($pop_conn,"USER user\r\n");
print fgets($pop_conn,1024);
fputs($pop_conn,"PASS pass\r\n");
print fgets($pop_conn,1024);
fputs($pop_conn,"STAT\r\n");
$count = fgets($pop_conn,1024);
$count = explode(' ',$count);
$count = $count[1];
for ($j=1;$j<=$count;$j++) {
$number = "$j";
if (file_exists("$number")) {
echo "exists <br/>";
}
else
{
mkdir("$number");
echo "$number <br/>";
fputs($pop_conn,"RETR ".$number."\r\n");
$text.= get_data($pop_conn);
$struct=fetch_structure($text);
$mass_header=decode_header($struct['header']);
$mass_header["subject"] = decode_mime_string($mass_header["subject"]);
$type = $ctype = $mass_header['content-type'];
$ctype = split(";",$ctype);
$types = split("/",$ctype[0]);
$maintype = trim(strtolower($types[0]));
$subtype = trim(strtolower($types[1]));
if($maintype=="multipart" and ereg($subtype,"signed,mixed,related"))
{
$boundary=get_boundary($mass_header['content-type']);
$part = split_parts($boundary,$struct['body']);
for($i=0;$i<count($part);$i++) {
$email = fetch_structure($part[$i]);
$header = $email["header"];
$body = $email["body"];
$headers = decode_header($header);
$ctype = $headers["content-type"];
$cid = $headers["content-id"];
$Actype = split(";",$headers["content-type"]);
$types = split("/",$Actype[0]);
$rctype = strtolower($Actype[0]);
$is_download = (ereg("name=",$headers["content-disposition"].$headers["content-type"]) || $headers["content-id"] != "" || $rctype == "message/rfc822");
if($rctype == "text/plain" && !$is_download) {
$body = compile_body($body,$headers["content-transfer-encoding"],$headers["content-type"]);
print $body;
}
elseif($rctype == "text/html" && !$is_download) {
$body = compile_body($body,$headers["content-transfer-encoding"],$headers["content-type"]);
print $body;
}
elseif($is_download) {
$cdisp = $headers["content-disposition"];
$ctype = $headers["content-type"];
$ctype2 = explode(";",$ctype);
$ctype2 = $ctype2[0];
$Atype = split("/",$ctype);
$Acdisp = split(";",$ctype);
$fname = $Acdisp[1];
if(ereg("name=(.*)",$fname,$regs))
$filename = $regs[1];
if($filename == "" && ereg("name=(.*)",$ctype,$regs))
$filename = $regs[1];
$filename = ereg_replace("\"(.*)\"","\\1",$filename);
$filename = trim(decode_mime_string($filename));
$ext = explode('.',$filename);
$ext = $ext[1];
if ($ext=='xls') {
$body = compile_body($body,$headers["content-transfer-encoding"],$ctype2);
$ft=fopen("$number/$filename","wb");
fwrite($ft,$body);
fclose($ft);
}
$ext = explode('.',$filename);
$ext = $ext[1];
if ($ext=='xls') {
$objPHPExcel = PHPExcel_IOFactory::load("$number/$filename");
$objPHPExcel->setActiveSheetIndex(0);
$aSheet = $objPHPExcel->getActiveSheet();
$aSheet->getRowDimension('1')->setVisible(false);
$aSheet->getRowDimension('2')->setVisible(false);
$objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);
$objWriter->save("$number/$filename");
}
}
}
}
fputs($pop_conn,"QUIT\r\n");
}
}
13.01.2011 админ
denis, про кодировки тут нужно смотреть код, может он у вас не правильный? А может и само письмо нужно посмотреть, вдруг оно написано в непонятной кодировке. А вообще в нормальных письмах в заголовках указывается кодировка, посмотрите заголовок письма.
По вашему второму вопросу.
папка создается строкой
mkdir("$number");
Запись в эту папку проходит тут
$ft=fopen("$number/$filename","wb");
fwrite($ft,$body);
fclose($ft);
Но...
1. Код Артема специфический, заточен под какие-то его нужды.
2. Создавать папки с помощью PHP не рекомендуется, так как в большинстве случаев запись в эту папку будет невозможна. И даже если сейчас запись в такую папку будет работать, то при смене сервера(хостинга) возможно перестанет работать, а это уже не очень гибко.
Возможно как раз по этой причине у вас и не пишет скрипт в эти папки.
20.01.2011 denis
ЗДравствуйте у меня все та же проблема осталась ... уже разобрал скрипт, практически по строчно ... но не могу понять почему в папку ничго не записывает... устанавлиали права на сервере, для создания и записи, но и у меня на машине он тоже никуда ничего не пишет ...помогите пожалуйста
20.01.2011 denis
подскажите пожалуйста , я взял скрипты Администраторы , которые он показывал ... , но сохранять прикрепленные письма у меня не получается , в чем причина ?
за запись как я понимаю отвечает эта часть кода , но куда и что она сохраняет ?
// теперь читаем файл в переменную.
$body = compile_body($body,$headers["content-transfer-encoding"],$ctype);
// содержимое файла теперь в переменной $body и сейчас можно отдать содержимое файла в браузер или например сохранить на диске
$ft=fopen($filename,"wb");
fwrite($ft,$body);
fclose($ft);
21.01.2011 админ
denis, я так понимаю, в данном случае вы просто взяли кусок моего кода.
Если конкретно рассматривать весь мой скрипт, то в данной строке сохраняется прикрепленный к письму файл.
Сохраняться он должен именно там, от куда запущен сам скрипт.
А в то что хотите сохранить?
02.02.2011 denis
спасибо, с этим я разобрался ...
скажите пожалуйста как определить открыто ли письмо или оно все еще запечатано и не просматривалось...
02.02.2011 админ
denis, что то мне кажется, что по протоколу POP нет возможности ставить метки письмам, прочитанное оно или нет.
По моему это сами почтовые программы ставят такие метки и хранят эти данные в себе.
Но если я ошибаюсь, то может меня кто-то поправит?
10.02.2011 Илья
взял код из статьи.
выводит только последнее сообщение.
как выводить все сообщения?
15.02.2011 AlexBorg
Супер! Искал долго!
16.02.2011 Илья Захаров
Рекомендую добавить в функцию decode_mime_string для писем с кодировкой utf.
if(ereg("utf-8", $subject)) $result = iconv("UTF-8", "WINDOWS-1251", $result);
if(ereg("UTF-8", $subject)) $result = iconv("UTF-8", "WINDOWS-1251", $result);
Так же возможны ошибки при таком header:
[10] => DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex.ru; s=mail;
[11] => t=1297802717; bh=Mrgx0dRRCeYfbPhYrKWbWaUN01Hs8g+EN462gAU=;
[12] => h=From:To:In-Reply-To:References:Subject:MIME-Version:Message-Id:
[13] => Date:Content-Transfer-Encoding:Content-Type;
Так вот функция decode_header запишет строку 13 в новую перменную Date
Решение добавить в начало функции следующих строк:
$count=substr_count ($header, "\r\n\t");
for ($i=1; $i<=$count; $i++) $header=substr_replace ($header, " ", strpos ($header, "\r\n\t"), 3);
25.06.2011 code
а как вывести от кого письмо (адрес элкктронки)?
Заголовок такой не получается :(
28.06.2011 виктор
code,
В статье есть пример вывода заголовков.
Вот так показано получение массиве заголовков
$mass_header=decode_header($struct['header']);
И отправитель будет в заголовке from
26.07.2011 Андрей
пытаюсь использовать в своей работе, к сожалению не сохраняет файл.
вот что у меня выдает:
метка-разделитель частей письма: -- (здесь значок с 2 ноликами наверху и 01 - внизу)
разбиваем письмо на части: 1
Header Begin - --=_Part_2225477_263924035.1311606004367 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: 7bit - Header End
Заголовок Начало - [] --=_Part_2225477_263924035.1311606004367 - Заголовок Окончание
Заголовок Начало - [content-type]text/html; charset="UTF-8" - Заголовок Окончание
Заголовок Начало - [content-transfer-encoding]7bit - Заголовок Окончание
Вот здесь уже, судя по всему, не работает:
// теперь проверяем, является ли эта часть прикрепленным файлом
$is_download = (ereg("name=",$headers["content-disposition"].$headers["content-type"]) || $headers["content-id"] != "" || $rctype == "message/rfc822");
echo "File or not: ".$is_download."<br>";
Хелп
26.07.2011 Андрей
Ах да, забыл добавить: при выводе HTML содержимого видно, что дальше в письме есть:
// теперь проверяем, является ли эта часть прикрепленным файлом
$is_download = (ereg("name=",$headers["content-disposition"].$headers["content-type"]) || $headers["content-id"] != "" || $rctype == "message/rfc822");
echo "File or not: ".$is_download."<br>";
........
........
........
видимо, пыьается выдать вложение текстом
........
и в самом конце:
------=_Part_2225477_263924035.1311606004367--
26.07.2011 Андрей
Сорри, ошибка, дальше в письме идет:
------=_Part_2225477_263924035.1311606004367 Content-Type: application/pdf Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=pdf_1.pdf
.......
27.07.2011 Андрей
после письма с вложением зацикливается: файл сохраняет и снова возвращается к этому же письму. помошите найти ошибку.
код:
for ($i=1; $i<=$total_count; $i++) {
$text = '';
fputs($pop_conn,"LIST ".$i."\r\n");
$info = fgets($pop_conn);
echo "Info - Brief Nummer ".$i." - ".$info."<br>";
fputs($pop_conn,"RETR ".$i."\r\n");
$text .= get_data($pop_conn);
$struct = fetch_structure($text);
$mass_header = decode_header($struct['header']);
$mass_header["subject"] = decode_mime_string($mass_header["subject"]);
$type = $ctype = $mass_header['content-type'];
$ctype = split(";",$ctype);
$types = split("/",$ctype[0]);
$maintype = trim(strtolower($types[0])); // text или multipart
$subtype = trim(strtolower($types[1])); // а это подтип(plain, html, mixed)
if($maintype=="text")
{
$body = compile_body($struct['body'],$mass_header["content-transfer-encoding"],$mass_header["content-type"]);
}
elseif($maintype=="multipart" and ereg($subtype,"signed,mixed,related"))
{
$boundary=get_boundary($mass_header['content-type']);
$part = split_parts($boundary,$struct['body']);
for($i=0;$i<count($part);$i++) {
$email = fetch_structure($part[$i]);
$header = $email["header"];
$body = $email["body"];
$headers = decode_header($header);
$ctype = $headers["content-type"];
$cid = $headers["content-id"];
$Actype = split(";",$headers["content-type"]);
$types = split("/",$Actype[0]);
$rctype = strtolower($Actype[0]);
$is_download = (ereg("name=",$headers["content-disposition"].$headers["content-type"]) || $headers["content-id"] != "" || $rctype == "message/rfc822");
if($rctype == "text/plain" && !$is_download) {
$body = compile_body($body,$headers["content-transfer-encoding"],$headers["content-type"]);
}
elseif($rctype == "text/html" && !$is_download) {
$body = compile_body($body,$headers["content-transfer-encoding"],$headers["content-type"]);
}
elseif($is_download) {
$cdisp = $headers["content-disposition"];
$ctype = $headers["content-type"];
$ctype2 = explode(";",$ctype);
$ctype2 = $ctype2[0];
$Atype = split("/",$ctype);
$Acdisp = split(";",$cdisp);
$fname = $Acdisp[1];
if(ereg("filename=(.*)",$fname,$regs)) $filename = $regs[1];
if($filename == "" && ereg("name=(.*)",$ctype,$regs)) $filename = $regs[1];
$filename = ereg_replace("\"(.*)?(.*)\"", "\\1", $filename);
$filename = str_replace("=?utf-8?Q?", "", $filename);
$filename = str_replace("?", "", $filename);
$filename = str_replace("=5F", "_", $filename);
$filename = str_replace("=", "", $filename);
$filename = iconv('ISO-8859-1', 'UTF-8//TRANSLIT', $filename);
echo "Filename - ".$filename."<br>";
$body = compile_body($body,$headers["content-transfer-encoding"],$ctype);
$ft=fopen($filename,"wb");
fwrite($ft,$body);
fclose($ft);
}
}
}
}
29.08.2011 Влад
+1 к Андрею
неправильно разрывает файлы.
14.10.2011 Алекс
Скрипт супер, но лучше на его методе написать свой - а то есть по сокетам.
И скрипт свой. И с сокетами работать хорошо Научишься! Я лично искал функцию типа pop3() или pop() не думал что такое можно сделать по сокетам!
17.10.2011 Максим
За статью спасибо. Никто не пытался создать почтовый клиент на сайте. Сколько примерно времени ушло?
Добавить свой комментарий
|