В 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);
$header = imap_header($imap, $num)
– получает заголовки письма в виде объекта. Для удобства можно преобразовать в массив:
$header = imap_header($imap, $num);
$header = json_decode(json_encode($header), true);
print_r($header);
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']);
$body = imap_body($imap, $num)
– тело письма, обычный текст.
Может быть закодировано в quoted-printable (=D0=94=D0=BE=D0=B1=D1=80=D1=8B=D0=B9
), раскодировать можно функцией quoted_printable_decode()
.
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);
В цикле, письмо помечается функцией 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);