Трассировка не доставленных / отклоненных писем с PHP, phpmailer и Message-ID - PullRequest
0 голосов
/ 31 мая 2019

У меня есть веб-приложение PHP с разделом для отправки счета всем партнерам по электронной почте. Каждый партнер может иметь более одного электронного письма.

Например: КОМПАНИЯ-1 с адресами электронной почты: email_1@company1.com и email_2@company1.com

Я отправляю все с phpmailer.

Я сохраняю в своей базе данных ответ на запрос от почты сервера (в данном случае gmail).

Если отправлено, я сохраню true, иначе false - foreach email.

Но некоторые электронные письма иногда являются неправильными (из-за ошибки при вводе) или отклоняются компанией (в этом случае компания не сообщает нам, а мы все еще отправляем на это удаленное письмо), и мне нравится возвращать эти «проблемы» "с помощью веб-приложения.

(Если я войду в веб-почту Google, я увижу письмо, возвращенное для каждого отправленного на несуществующее письмо, с некоторыми советами / кодом ошибки внутри ... но я не знаю, как получить с помощью PHP)

Я пытался использовать

$inbox = imap_open($hostname,$username,$password);

$emails = imap_search($inbox,'ALL');

Этот скрипт работает, но используя ALL я получаю тайм-аут.

Я не знаю, как лучше всего получить эти электронные письма с сообщениями «НЕ ДОСТАВЛЕНО ПОЧТЫ ДЛЯ НЕКОТОРЫХ ПРОБЛЕМ».

Моей первой идеей было установить пользовательский Message-ID в заголовке при отправке:

$messageID = "<" . md5($_SERVER['HTTP_HOST'].(idate("U")-1000000000).uniqid()).'-'.idate("U") . '@' . $_SERVER['HTTP_HOST'] . '>';
$mail->MessageID = $messageID;

, а затем в моем сценарии, используя команду вроде:

$messageID = retrieve_from_database(...);
$emails = imap_search($inbox,'HEADER ' . $messageID);

но запроса не существует HEADER

Я бы хотел, чтобы в моем веб-приложении для каждого отправленного электронного сообщения отображалась, в конце концов, проблема с отскочившим или недоставленным сообщением, но я не знаю, как и что мне нужно «попросить» на imap_search, чтобы получить ответы, связанные с оригинал отправленного письма.

Я читаю список критериев из документов, но я не нахожу ничего полезного, я думаю: https://www.php.net/manual/en/function.imap-search.php

Пример сценария, который мне нужен:

  1. Я отправляю электронное письмо с Message-ID: <test@testXYZ> с my_email@mywebapp.com на email_not_existing@test.com. Истинная причина ответа сервера отправлена.

  2. Я вставляю новую запись в таблицу базы данных emails_sent с результатом отправки true: INSERT INTO emails_sent (ID, email_dest, sent, MessageID, when) VALUES (455, 'email_not_existing@test.com', TRUE, $messageID, '2019-05-30 8:00:00')

  3. Демон gmail отвечает на my_email@mywebapp.com сообщением о недоставленной электронной почте

  4. В моем веб-приложении, когда я захожу на страницу отправленных писем с указанием идентификатора из таблицы emails_sent, мне нужно искать в imap в конце концов ответное письмо с ошибками. В этом примере, когда я запрашиваю ID 455, мне нужно найти ответы на сообщения imap_search, связанные с моим письмом, отправленным с назначенным мной MessageID (или другим способом, который я не знаю ....)

1 Ответ

1 голос
/ 31 мая 2019

Я бы посоветовал вам уйти от общего хостинга и получить подходящий сервер (попробуйте scaleway.com).Как вы обнаруживаете, это означает, что вы не получаете достаточного контроля.

Я бы рекомендовал не использовать IMAP в качестве базы данных - поскольку вы обнаружите, что он недостаточно хорош для того вида поиска, который вы хотите выполнить.делать.Если вы импортируете все отклоненные сообщения в свою собственную БД, вы можете свободно анализировать и выполнять поиск по своему усмотрению, а также легко получать все сообщения из IMAP.

Самый эффективный способ обработки отскоковэто заставить ваш SMTP-сервер передавать сообщения о пересылке напрямую в скрипт .Это даст вам полное отскочившее сообщение вместе с переменными среды, которые расскажут вам больше о доставке.Это, конечно, требует, чтобы у вас был доступ на уровне конфигурации к вашему почтовому серверу или хостинг-провайдеру с подсказкой.

Имейте в виду, что обработка отказов является чрезвычайно неприятной задачей, и ее очень трудно выполнить хорошо.Возможно, вы захотите взглянуть на сторонний обработчик отказов, например, на Boogie Tools, чтобы избавить вас от лишнего здравомыслия!Помимо некоторых очень широких стандартов на высшем уровне, согласованность на более низком уровне очень мала, а отскоки часто бесполезны.Например, MS Exchange может создавать отказы, которые вообще не содержат исходного целевого адреса отклоненного сообщения!Обходным путем является использование VERP , где каждый адрес (или даже каждое сообщение) получает свой собственный уникальный обратный путь, позволяющий вам знать, откуда сообщение отклонено, даже если содержимое сообщения не содержит подсказок.

...