Скрипт для чтения писем из почтового ящика через протокол imap.
В продолжении темы сбор статистики пользователей на сайте «Скрипт сбора статистики о пользователях«.
В рассмотренном примере текст писем сохраняется в файлы в отдельной папке на сайте, имена файлов это домены с которых пришли письма.
Код скрипта, файл prs.php
$host = 'imap.mail.ru'; $port = 993; $login = 'address@mail.ru'; $pass = 'password'; $param = '/imap/ssl/novalidate-cert'; $folder = 'INBOX'; if($connect_imap = imap_open('{'.$host.':'.$port.$param.'}'.$folder,$login,$pass)){ echo "Connected<br>"; // проверим ящик на наличие не просмотренных писем $mails = imap_search($connect_imap, 'UNSEEN'); if($mails){ foreach($mails as $num_mail){ $header = imap_header($connect_imap, $num_mail); $arr['from'] = $mail_from = $header->fromaddress; //echo "От кого: $mail_from <br/>"; $arr['subject'] = $subject = $header->subject; //echo "Тема письма: $subject <br/>"; $arr['text'] = $text_mail = imap_fetchbody($connect_imap, $num_mail, 1); //echo "Тело письма: $text_mail <br/>"; echo "<hr/>"; save_email($arr); } }else{ echo "Нет новых писем"; } imap_close($connect_imap); } else { exit ("Нельзя соединиться: " . imap_last_error() ."<br>"); echo "Ошибка<br>"; }; function save_email($arr){ $m1=array('Report',' ','www.'); $m2=array('','',''); $file = 'fd/'.str_replace($m1,$m2,$arr['subject']).'.txt'; if(!file_exists($file)) file_put_contents($file,$arr['text']); else file_put_contents($file,$arr['text'],FILE_APPEND); }
разберем скрипт:
$host = 'imap.mail.ru'; $port = 993; $login = 'address@mail.ru'; $pass = 'password'; $param = '/imap/ssl/novalidate-cert'; $folder = 'INBOX';
Настройка для соединения с почтовым ящиком, здесь необходимо проверить $host и $port у вашего почтового домена, также уточнить $login, у некоторых достаточно логина без @domen.ru. Также иногда приходится дать доступ к почтовому ящику другим приложениям для gmail.com это необходимо сделать вручную.
$folder — папка в почтовом ящике в которой проверяем письма, в почтовом ящике необходимо создать папку и проверить чтобы она была доступна для почтовых программ.
if($connect_imap = imap_open('{'.$host.':'.$port.$param.'}'.$folder,$login,$pass)){
Строка соединения с почтовым ящиком
$mails = imap_search($connect_imap, 'UNSEEN');
Строка, которая пытается получить список писем по условию. Для mail.ru некоторые условия не работают. Список условий можно найти на сайте php.net. Очень интересные из них NEW, FROM. В нашем случаем мы получаем все не просмотренные письма.
foreach($mails as $num_mail){ $header = imap_header($connect_imap, $num_mail); $arr['from'] = $mail_from = $header->fromaddress; //echo "От кого: $mail_from <br/>"; $arr['subject'] = $subject = $header->subject; //echo "Тема письма: $subject <br/>"; $arr['text'] = $text_mail = imap_fetchbody($connect_imap, $num_mail, 1); //echo "Тело письма: $text_mail <br/>"; echo "<hr/>"; save_email($arr); }
цикл обхода полученных писем, здесь мы разбираем каждое письмо и формируем массив arr, которые передаем в функцию save_email для сохранения данных из письма.
function save_email($arr){ $m1=array('Report',' ','www.'); $m2=array('','',''); $file = 'fd/'.str_replace($m1,$m2,$arr['subject']).'.txt'; if(!file_exists($file)) file_put_contents($file,$arr['text']); else file_put_contents($file,$arr['text'],FILE_APPEND); }
Функция сохраняет данные из письма в файл.
$m1=array('Report',' ','www.'); $m2=array('','',''); $file = 'fd/'.str_replace($m1,$m2,$arr['subject']).'.txt';
Выбираем домен из темы письма, обрезая все лишнее и создаем переменную file, в которую сохраним данные.
if(!file_exists($file)) file_put_contents($file,$arr['text']); else file_put_contents($file,$arr['text'],FILE_APPEND);
Проверка на существование файла для домена, если его нет тогда происходит запись в новый файл, если есть тогда добавляем данные в конец файла.
Теперь осталось только разобрать все что мы сохраняем и отобразить администратору.
Конечно здесь нет условия на выборку писем, и все письма которые мы получим в данном скрипте помечаются как прочтенными на почтовом ящике, но это не проблема если почтовый ящик заведен именно для этих целей.
Читайте из этой же серии
1 часть Скрипт сбора статистики о пользователях
2 часть Получение email в PHP