Чтение почты через IMAP в PHP

В PHP без проблем можно работать с почтой через IMAP, для этого есть все необходимые функции, подробнее на php.net.

Принцип работы следующий:

$imap = imap_open("адрес", "e-mail", "пароль") – создает подключение к почтовому ящику. Далее, функция imap_search($imap, 'ALL') получает массив c индикаторами писем.

Возможные параметры:

ALL Все сообщения
UNSEEN Непрочитанные сообщения
SEEN Прочтенные сообщения (установлен флаг seen)
NEW Новые сообщения (впервые появилось в ящике в ходе текущей сессии)
OLD Старые сообщения
ANSWERED Сообщения с флагом answered (отвеченный)
UNANSWERED Неотвеченные сообщения
DELETED Удаленные сообщения
UNDELETED Не удаленные сообщения
FLAGGED Сообщения с установленным флагом flagged (важное)
RECENT Сообщения с флагом recent (недавнее сообщение)
UNFLAGGED Сообщения без установленных флагов
ON "date" Сообщения с датой, равной «date»
BEFORE "date" Сообщения с датой, до «date»
SINCE "date" Сообщения с датой, после «date»
FROM "string" Сообщения в поле From: которых присутствует «string»
TO "string" Сообщения в поле To: которых присутствует «string»
SUBJECT "string" Сообщения, у которых присутствует «string» в поле Subject
BODY "string" Сообщения содержащие «string» в теле
TEXT "string" Сообщения с текстом «string»
KEYWORD "string" Сообщения с ключевым словом «string»
UNKEYWORD "string" Сообщения, не имеющие ключевого слова «string»

Далее массив обрабатывается в цикле, в примере происходит обход по всем письмам.

$imap = imap_open("{imap.server.ru:993/imap/ssl}INBOX", "mail@test.ru", "Пароль");
$mails_id = imap_search($imap, 'ALL');

foreach ($mails_id as $num) {
	// Заголовок письма
	$header = imap_header($imap, $num);
	var_dump($header);

	// Тело письма
	$body = imap_body($imap, $num);
	var_dump($body);
}

imap_close($imap);
PHP

$header = imap_header($imap, $num) – получает заголовки письма в виде объекта. Для удобства можно преобразовать в массив:

$header = imap_header($imap, $num);
$header = json_decode(json_encode($header), true);
print_r($header);
PHP
Array(
    [date] => Mon, 16 Sep 2019 16:03:56 +0300
    [Date] => Mon, 16 Sep 2019 16:03:56 +0300
    [subject] => =?UTF-8?B?SGVsbyBXb3JsZA==?=
    [Subject] => =?UTF-8?B?SGVsbyBXb3JsZA==?=
    [message_id] => <123456@site.ru>
    [toaddress] => mail@snipp.ru
    [to] => Array(
		[0] => Array(
			[mailbox] => mail
			[host] => snipp.ru
		)
    )
    [fromaddress] => =?UTF-8?B?MTIzNDU2QHNpdGUucnU=?= <123456@site.ru>
    [from] => Array(
		[0] => Array(
			[personal] => =?UTF-8?B?MTIzNDU2QHNpdGUucnU=?=
			[mailbox] => 123456
			[host] => site.ru
		)
	)
    [ccaddress] => 
    [cc] => 
    [reply_toaddress] => 
    [reply_to] => 
    [senderaddress] => 
    [sender] => 
    [Recent] =>  
    [Unseen] =>  
    [Flagged] =>  
    [Answered] =>  
    [Deleted] =>  
    [Draft] =>  
    [Msgno] =>    1
    [MailDate] => 16-Sep-2019 16:03:59 +0300
    [Size] => 38895
    [udate] => 1568639039
)

Как видно в примере, тема письма и другие данные закодированы в base64 (?UTF-8?B?SGVsbyBXb3JsZA==?=), декодировать их можно с помощью функции mb_decode_mimeheader().

$header = imap_header($imap, $num);
$header = json_decode(json_encode($header), true);
echo mb_decode_mimeheader($header['subject']); 
PHP

$body = imap_body($imap, $num) – тело письма, обычный текст.

Может быть закодировано в quoted-printable (=D0=94=D0=BE=D0=B1=D1=80=D1=8B=D0=B9), раскодировать можно функцией quoted_printable_decode().

$body = imap_body($imap, $num);
$body = quoted_printable_decode($body);
echo $body;
PHP

imap_setflag_full ($imap, $num, $flag) – установит письму флаг, возможны значения:

seen Сообщение прочитано
answered На сообщение отправлен ответ
flagged Сообщение отмечено как «важное»
deleted Сообщение отмечено как удалённое
draft Сообщение отмечено как черновик
recent Недавнее сообщение

Можно установить сразу несколько флагов, разделяя их пробелами.

В примере, письмам, у которых в теме письма есть слово «заявка» устанавливается флаг «важное».

$imap = imap_open("{imap.server.ru:993/imap/ssl}INBOX", "mail@test.ru", "Пароль");
$mails_id = imap_search($imap, 'ALL');

foreach ($mails_id as $num) {
	// Заголовок письма
	$header = imap_header($imap, $num);
	$header = json_decode(json_encode($header), true);
	$subject = mb_decode_mimeheader($header['subject']); 
	
	if (mb_strpos($subject, 'заявка') !== false) {
		imap_setflag_full($imap, $num, '\\flagged');
	}
}

imap_close($imap);
PHP

В цикле, письмо помечается функцией imap_delete(), после этого вызывается функция imap_expunge(), которая выполняет удаление всех помеченных писем.

$imap = imap_open("{imap.server.ru:993/imap/ssl}INBOX", "mail@site.ru", "Пароль");
$mails_id = imap_search($imap, 'ALL');

foreach ($mails_id as $num) {
	$header = imap_header($imap, $num);
	$body = imap_body($imap, $num);

	// Помечаем письмо как удаленное
	imap_delete($imap, $num);
}

// Удаление помеченных писем
imap_expunge($imap);

imap_close($imap);
PHP
30.09.2019, обновлено 17.01.2021
24568

Комментарии

, чтобы добавить комментарий.

Другие публикации

PHP класс для отправки E-mail
Отправка писем в кодировке UTF-8 и формате HTML, вложение файлов, дамп писем на сервере в файле eml.
12674
+2
Пример парсинга html-страницы на phpQuery
phpQuery – это удобный HTML парсер взявший за основу селекторы, фильтры и методы jQuery, которые позволяют...
44133
+20
Whois, как получить данные IP-адреса и домена в PHP
Несколько примеров как в PHP получить информацию о домене и IP-адресе.
12717
+4
Работа с JSON в PHP
JSON (JavaScript Object Notation) – текстовый формат обмена данными, основанный на JavaScript, который представляет собой набор пар {ключ: значение}. Значение может быть массивом, числом, строкой и...
78244
+11
Работа с FTP в PHP
Протокол FTP – предназначен для передачи файлов на удаленный хост. В PHP функции для работы с FTP как правило всегда доступны и не требуется установка дополнительного расширения.
10268
+1