16.05.2018 16:14
OlegON
 
Я люблю все автоматизировать, теперь очередь дошла до бесконечных "Письмо не может быть доставлено". Форум рассылает сообщения, а пользователи не удосуживаются вписать правильный адрес. До сего момента я печально скармливал адрес из отлупа в батник, который пользователю сносил адрес вообще. Для автоматизации потребовалось проверять почту, чтобы не пересекаться с основными клиентами - через IMAP, а поскольку форум на PHP, то и выполнять надо было все в PHP.

Итак, просмотр почты (основной костяк для упрощения):

Код:
$hostname = '{imap.gmail.com:993/imap/ssl}INBOX';
$username = 'olegon@olegon.ru';
$password = 'password';

if ($imap = imap_open($hostname, $username, $password))
{
	// Проверка входящих
	if ($messages = imap_search($imap 'ALL'))
	{
		// Сортировка, новые вперед
		rsort($messages);

		// Цикл по сообщениям
		foreach ($messages as $message_number)
		{
			// Вытаскиваем сводку и тело письма
			$overview = imap_fetch_overview($imap, $message_number, 0);
			$message  = imap_fetchbody($imap, $message_number, 2);

			var_dump($overview, $message);
		}
	}
	else
	{
		exit('No messages on the IMAP server.');
	}
}
else
{
	exit('Unable to connect to the IMAP server.');
}
Для работы должен быть установлен php-imap.rpm (НЕ php-pear-Net-IMAP), ну и не забывайте о всевозможных кодировках. Вместо поиска ALL в search можно использовать разные выражения:


ALL - возвращать все сообщения, соответствующие остальным критериям
ANSWERED - сообщения с выставленным флагом \\ANSWERED
BCC "string" - сообщения в поле Bcc: которых присутствует "string"
BEFORE "date" - сообщения с Date: до "date"
BODY "string" - сообщения содержащие "string" в теле
CC "string" - сообщения в поле Cc: которых присутствует "string"
DELETED - удаленные сообщения
FLAGGED - сообщения с установленным флагом \\FLAGGED (иногда называют "Срочное" или "Важное")
FROM "string" - сообщения в поле From: которых присутствует "string"
KEYWORD "string" - сообщения с ключевым словом "string"
NEW - новые сообщения
OLD - старые сообщения
ON "date" - сообщения с Date: равным "date"
RECENT - означает сообщения с выставленным флагом \\RECENT
SEEN - прочтенные сообщения (установлен флаг \\SEEN)
SINCE "date" - сообщения с Date: после "date"
SUBJECT "string" - сообщения в поле Subject: которых присутствует "string"
TEXT "string" - сообщения с текстом "string"
TO "string" - сообщения в поле To: которых присутствует "string"
UNANSWERED - неотвеченные сообщения
UNDELETED - не удаленные сообщения
UNFLAGGED - сообщения без установленных флагов
UNKEYWORD "string" - сообщения, не имеющие ключевого слова "string"
UNSEEN - непрочтенные сообщения

Сам поиск описан в RFC2060, п. 6.4.4.
06.07.2018 13:32
OlegON
 
Если кому-то потребуется, для Яндекса строка
Код:
$hostname = '{imap.yandex.ru:993/imap/ssl}INBOX';
обратите внимание, что имя пользователя здесь указывается либо полностью ящик, если ПДД, либо только часть до @, если родной ящик Яндекса.
04.11.2018 10:33
OlegON
 
Обратите внимание, гугл поломал проверку почты таким образом
Цитата:
PHP Warning: imap_open(): Couldn't open stream {imap.gmail.com:993/imap/ssl}INBOX in /check_mail.php on line 146
PHP Notice: Unknown: Certificate failure for imap.gmail.com: self signed certificate: /OU=No SNI provided; please fix your client./CN=invalid2.invalid (errflg=2) in Unknown on line 0
есть обходной вариант - указать хост так
Код:
$hostname = '{imap.gmail.com:993/imap/ssl/novalidate-cert}INBOX';
при этом, конечно, проверка отключается, но и безопасность соединения резко падает. Да, скорее всего придется включить и доступ для небезопасных приложений.
Часовой пояс GMT +3, время: 04:21.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.