Чтение почты с помощью php через pop302.09.2007 сайт автора: http://webi.ru
публикация данной статьи разрешена только со ссылкой на сайт автора статьиКак получать почту с помощью php, через pop3 используя сокеты.
Комментарии
RSS комментарии
16.04.2010 админ
размещение статей на ваших сайтах разрешено.
только соблюдайте копирайты (ссылайтесь на автора статьи или оригинал).
08.05.2010 Serge
Такое вот
Fatal error: Call to undefined function get_data() in /home/virtwww/w_glassonline-com-ua_de7c5483/http/tmp/mailphp.php on line 10
10.05.2010 ФыВа
Serge, для перевода с английского на русский существуют переводчики и словари.
Если не можете перевести, то тут написано, что в строке номер 10 происходит вызов не существующей функции get_data().
Эту функцию надо было включить в код, как написано в статье.
01.06.2010 Dmitry
отличная статья! ) спасибо ) но у меня почемуто $is_download = (ereg("name=",$headers["content-disposition"].$headers["content-type"])...
не работает. така как name= находится в $body. пытаюсь понять почему. (yandex)
02.06.2010 Dmitry
после замены функции get_boundary
<code>
$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);
</code>
и исправления строки коэрректировки названия файла:
<code>
$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);
</code>
стало значительно лучше ) спасибо за статью буду думать как выдернуть письмо по дате и времени )
02.06.2010 Dmitry
блин в буфере было непойми чо ))
1. function get_boundary($message) {
$headers = substr($message, 0, strpos($message, "\r\n\r\n"));
$boundary_regexp = '/boundary=\"(.*)\"/i';
preg_match_all($boundary_regexp, $headers, $out, PREG_PATTERN_ORDER);
$boundary = $out[1][0];
if($boundary)
return $boundary;
return false;
}
2. // $filename = ereg_replace("\"(.*)\"","\1",$filename);
$filename = str_replace("\"","",$filename);
03.06.2010 kostya
Статья суппер
Одна проблема - с удалением почты
приладил ваш пример к сортировщику писем в почтовом ящике.
Скрипт перебирает письма по некоторым признакам и удаляет их с сервера
Ели писем 5-10 - все Ок, а вот когда много - письма не удаляются.
Вот кусок скрипта, который чистит почтовый ящик
if ($intr[0]==0){fputs($pop_conn,"DELE ".$i."\r\n");echo "<br>deleting:".$i."DELE ".$i."\r\n";};;
$i - переменная цикла
$intr[0] - проверяется для каждого
скажите в чем трабл может быть?
03.06.2010 админ
kostya, скорее всего не хватает времени работы скрипта.
Вы отправляете пометку на удаление, но удаление писем произойдет только после завершения сессии (QUIT).
Возможно писем очень много и скрипт не успевает завершить работу командой QUIT.
Одно из решений, можно за один раз удалять не все письма, а часть. При следующем заходе удалять еще часть, и т.д.
04.06.2010 kostya
я тестирую скрипт на соей машине
В начале скрипта стоит
set_time_limit ( 36000);
пробовал частямивыкачивать почту - результат такой же.
Может есть какой-то таймуат у сервера pop3?
сама часть скрипта по удалению
<?php
for ($i=1;$i<=$let_num;$i++ )
{
echo"<tr>";
echo"<td>".$i."</td>";
if ((!isset($mail_stat[$i][2])) ||(strlen($mail_stat[$i][2])<5) ){$mail_stat[$i][1]=0;};
echo"<td>".$mail_stat[$i][0]."</td>";
echo"<td>".$mail_stat[$i][1]."</td>";
echo"<td>".$mail_stat[$i][2]."</td>";
echo"<td>".$mail_stat[$i][3]."</td>";
echo"<td>".$mail_stat[$i][4]."</td>";
echo"</tr>";
}
?>
</table>
<?php
//пишем в базу данных
$link = mysql_connect("localhost", "root", "")
or die ("Could not connect to MySQL");
mysql_select_db ("postman")
or die ("Could not select database");
for ($i=1;$i<=$let_num;$i++ )
{
if($mail_stat[$i][1]==1){
$intr=explode('_',$rederrull[$mail_stat[$i][0]]);
$qwe="insert into post_mailbase values('',
'".$user."',
NOW(),
'".$intr[2]."',
'".addslashes($mail_stat[$i][2])."',
'".$intr[1]."',
'".addslashes($mail_stat[$i][4])."',0
)
";
//echo $qwe;
$tabla = mysql_query($qwe);
//удаляем если отмечено на удаление
if ($intr[0]==0){fputs($pop_conn,"DELE ".$i."\r\n");echo "<br>deleting:".$i."DELE ".$i."\r\n";};;
}
}
?>
<?
//закрыть ящик
fputs($pop_conn,"QUIT \r\n");
?>
скрипт успевает отработать - я вижу по нумерации писем на удаление
04.06.2010 Дмитрий
Если не трудно скажите в кратце как быть с subtype alternative?
04.06.2010 админ
kostya, почему не получаешь ответы сервера?
после того, как посылаешь любую команду на сервер, получай ответ сервера и выводи его.
тогда сразу станет понятно, в чем дело.
04.06.2010 миха
Дмитрий, а какая проблема с alternative? Это тот же самый mixed, только выбираете один из вариантов вложения, например текстовое письмо, а html вложение можно отбросить.
05.06.2010 kostya
admin
Спасибо за совет - действительно проблема в том, что нужно подучить ответ в данном случае( хотя он очевиден).
06.06.2010 Дмив
Каким кодом мне вывести только текст сообщения??? Или текст темы
07.06.2010 Админ
Дмив, вроде в статье же все описано
$struct=fetch_structure($text);
$mass_header=decode_header($struct['header']); // тут тема
// а тут теперь текст письма.
$body = compile_body($struct['body'],$mass_header["content-transfer-encoding"],$mass_header["content-type"]);
19.06.2010 Виталий
Отлично!
Очень помогло
Осталось только с аттачем правильно разобраться
20.06.2010 Дмитрий
2 миха, бывают письма в которых 2 разных разделителя (boundary), более менее разобрался но не очень красиво получилось, еще как ктото писал ранее не до конца сохраняются файлы из attachment. можете сказать что может быть не так с сервером?
22.06.2010 Дмитрий
Может всетаки флаг 'b' в отдельных случаях проблемы создаёт?
$ft=fopen($filename,"wb");
14.07.2010 ctocopok
Не очень внимательно прочитывал код, но навскидку - что будет, если в тексте письма будет "." на отдельной строке?
то есть текст письма будет
=====
бла-бла-бла
.
бла-бла-бла
====
get_data не снесет крышу?
14.07.2010 Админ
ctocopok, снесет крышу.
get_data реагирует только если в строке есть одна точка, без проверки, есть что то дальше или нет.
Нужно просто добавить проверку, есть ли на следующей строке текст или нет.
Добавить свой комментарий
|