WeBinstruments

Инструментарий для веб-мастеров

 

на сайте на всех сайтах для веб разработчиков везде
 
 Скрипты
  PHP скрипты   
  Flash скрипты   
  Javascript скрипты   

 Софт
  Инструменты SEO   
  Разработка сайтов   
  Серверное ПО   

 Документация
  MySQL   
  PHP   
  HTML   
  Протоколы и сервисы Internet   

 Статьи
  PHP   
  MySQL   
  Сервер   
  еще...   

 Услуги и сервисы
  Домены   
  Хостинги   
  Блоки для сайта   

 Новости


 Контакты
  icq: 158325531
  email:
  все контакты: здесь




Atom все поступления
Раздел Файлы
Раздел Услуги и сервисы
Раздел Новости
Раздел Статьи
комментарии



 Партнеры


Главная / Статьи / PHP / Чтение почты с помощью php через pop3


Чтение почты с помощью php через pop3

02.09.2007
сайт автора: http://webi.ru
публикация данной статьи разрешена только со ссылкой на сайт автора статьи

Как получать почту с помощью php, через pop3 используя сокеты.

Читать всю статью


Комментарии

RSS комментарии


18.07.2010 Артем
Здравствуйте, уважаемый Автор!
У меня проблемка: когда помещаю код в цикл, для того что бы по очереди прочитать все письма из ящика и сохранить вложения каждого из писем в отдельные пронумерованные папки, то получаю одинаковое содержимое во всех папках (вложения из первого письма). Надеюсь понятно изложил суть проблемы. Вот мой код:

$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");
}
}





18.07.2010 Админ
Артем, скорее всего, потому что переменную $text вы не сбрасываете, а в каждом цикле добавляете к ней очередной текст.
$text.= get_data($pop_conn);



18.07.2010 Артем
Действительно.. теперь работает )
Огромное спасибо, Автор! :)



24.07.2010 Артем
Доброго времени суток!
Подскажите, пожалуйста, как можно проверить количество "новых писем"?

Зачем:
нужно что бы при соединении с ящиком выполнялась проверка на "новые письма".
Если таковые есть - выкачать из них вложения, в противном случае - закрывать соединение.



15.09.2010 Фил =)
Отличная статья! =) Сейчас как раз создаю для своего сервака web-обёртку, многое почерпнул из Вашего примера =)



13.10.2010 kiss
ф-ция get_data:

в $buffer имеем ответ от сервера "-ERR There's no message 1."
итог: ф-ция уходит в бесконечный цикл



20.10.2010 Alpon
дело в том что feof() не отрабатывает.
Я сделал у себя так:
function get_data($pop_conn)
{
$data="";
while (!feof($pop_conn)) {
$buffer = chop(fgets($pop_conn,1024));
if($buffer == false) break;
$data .= "$buffer\r\n";
}
return $data;
}


$pop_conn = fsockopen("SITE.MAIL.HOST", 110,$errno, $errstr, 2);

stream_set_timeout($pop_conn, 2); //ограничение времени ожидание ответа

// далее можно вызывать get_data без зависаний



20.10.2010 Alpon
Правда небольшие задержки все же будут.



21.10.2010 Alpon
Такая get_data неправильно работает (получает не все письмо).
Лучше всего использовать расширение imap если есть возможность и не мучиться. (работает и с pop3 прекрасно)



25.11.2010 Антон
У меня не работает на Яндексе. Коннектится нормально, а вот дальше при разборе письма лезут ошибки вида:
Notice: Undefined variable: lasthead in C:\apache\webmaster.ru\www\pop3server\test.php on line 83

Всего ошибок 30. адрес поп-сервера Яши - $pop_conn = fsockopen("pop.yandex.ru", 110,$errno, $errstr, 10);

Помогите разобраться, плиз...



25.11.2010 Админ
Антон, это какие то ошибки вашего скрипта.
Не видя его, нельзя ничего сказать.
Приведенная вами ошибка(предупреждение) говорит, что не установлена какая-то переменная, как же тут можно понять не видя скрипта.




20.12.2010 Андрей
Если точнее то не понял как вывсети заголовки в цикле
for ($j=1;$j<=$count;$j++)
{
$number = "$j";
echo "<a href='mes.php?id=$_GET[id]&idw=$number'>$number</a><br/>";

}



20.12.2010 Андрей
if($maintype=="text")
{
$body = compile_body($struct['body'],$mass_header["content-transfer-encoding"],$mass_header["content-type"]);
print $body;
}
Как $body разложить на тему письма , дату, и тд



20.12.2010 Андрей
Вот у меня такой вопрос. При каждой загрузке страницы, получается так, что с сервера выбираются все письма. А как сделать, чтоб старые письма не грузились постоянно и еще вопрос , как выделить новые письма, к примеру в strong



20.12.2010 виктор
андрей, помоему у протоколо pop нет возможности делать пометки письмам.
новое письмо или старое, это отмечают сами почтовые программы



20.12.2010 админ
андрей, но на данном этапе заголовки уже разложены.
Они находятся в массиве $mass_header.
А ваш приведенный в пример цикл совсем не понятен, что вы хотели этим сказать?



21.12.2010
По поводу цикла маленько поподробнее мне надо вывести заголовки писем

fputs($pop_connect,"STAT\r\n");
$text = fgets($pop_connect,1024);
preg_match('/(\d+)\s(\d+)/s', $text, $matches);

переменная $matches[1] у меня равно 825 писем
перебираю в цикле

for ($j=1;$j<=$matches[1];$j++)
{
echo $j."<br>";
}

этот цикл выведет номера писем
а мне необходимо их темы, то есть subjest

for ($j=1;$j<=$matches[1];$j++)
{
fputs($pop_connect,"RETR $j\r\n");
$text .= get_data($pop_connect);
$struct=fetch_structure($text);
$mass_header=decode_header($struct['header']);
$mass_header["subject"] = decode_mime_string($mass_header["subject"]);
echo '<p><a href="mes.php?id='.$_GET['id'].'&idw='.$j.'">'.$mass_header['subject'].'</a></p>';
}
}

эта конструкция очень тормозит, и работает через раз, чувчтвую что как-то не так делаю



21.12.2010 админ
Количество писем явно не для обработки php.
Обычно все письма на одной странице не выводят. Ведь как это происходит в веб интерфейсах почтовых, например 50 писем показывается на странице, а затем уже постраничное разбиение.

Но если вам все же надо выводить все 800 писем на одной странице....
Делаете вобщем-то все правильно, только вы читаете абсолютно всю почту в цикле, то есть каждое письмо загружаете целиком.
А для получения темы письма достаточно читать заголовки писем, все письмо читать не надо.
Попробуйте вместо RETR использовать ТОР 2 40
Эта команда получает не все письмо, а лишь его часть. В данном случае читается 40 строк второго письма.
40 строк считается вместе с заголовками.
Даже можете поставить 100 строк читать, чтобы наверняка влезли все заголовки. Хотя 100 строк наверное много.
Ну вобщем поэкспериментируйте с этой командой.



23.12.2010 Виктор
Вопрос по кодировке!
У меня все в utf-8
Есть 2 бага
1: в некоторых словах буквы заменяются на ? (пример: Григорье&#65533; &#65533;на) и появляются в некотрых словах пробелы (пример: плас тиковой)

и 2 очень странный:
если письмо в кодировки windows-1251, то в decode_mime_string преобразую в
utf-8 при помощи iconv. А странность в то, что если content-type: text/plain, то перекодируется нормально, а если content-type: text/html то появляются одни знаки вопросов (пример:&#65533;&#65533;&#65533;)



23.12.2010 Dr.Death
Как сохранять файлы из multipart/alternative писем?
Что поправить в скрипте? Помоги дорогой гуру...


1 2 3 4 5 6 7

Добавить свой комментарий


Ваше имя(* обязательно)


Текст сообщения(* обязательно)









 
 
  запомнить

 
Copyright © 2003-2024 WeBi Constructor
Rambler's Top100