Можно ли отправлять почту асинхронно с помощью PHP, оставляя отзывы пользователей о доставке?

Можно ли отправлять почту асинхронно с помощью PHP, одновременно оставляя отзывы пользователей о доставке?

Недавно я написал небольшое приложение для внутренней сети нашей компании для отправки отформатированных электронных писем клиентам. Интерфейс довольно чистый и требует только ввода номера задания, затем он строит и отправляет почту. Почта при построении получает ряд вложений с другого сервера и все автоматизировано. Используемая библиотека — PHPMailer.

Есть ли способ, возможно, используя другие технологии, но все же используя PHP в качестве основного языка, чтобы показать ход отправки писем? Я закодировал надежную проверку ошибок, чтобы проверить, действительно ли почта была отправлена ​​​​и т. Д., Но мне не хватает способа дать пользователям визуальную подсказку о фактической доставке почты на сервер через индикатор выполнения и т. д.

Возможно ли это с помощью PHP и чего-то вроде Ajax? Как бы вы определили продвижение почты в пути?


person Gary Willoughby    schedule 20.08.2009    source источник
comment
В Campaign Monitor есть много полезной информации о том, что можно и что нельзя делать с электронной почтой. Я предлагаю просмотреть их блог и сайт для мониторинга и метрической информации.   -  person rojoca    schedule 21.08.2009


Ответы (4)


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

person Havenard    schedule 20.08.2009
comment
Это то, что я рассматривал, но, к сожалению, сетевое соединение на моем рабочем месте очень непредсказуемо из-за управления трафиком. - person Gary Willoughby; 21.08.2009
comment
Так делают многие профессиональные программы. Браузеры, устройства для записи компакт-дисков, они часто отображают 100%, не выполняя работу или выполняя ее до конца... это совершенно нормально, но кого это волнует :P - person Havenard; 21.08.2009

Я не знаком с PHPMailer, но вам, безусловно, нужна поддержка библиотеки, чтобы иметь возможность запрашивать статус отправляемых писем.

Учитывая, что в PHP нет потоков, я бы предложил иметь очередь базы данных для доставок и запускать внешний процесс PHP с основного сайта (или через cron), который обрабатывает доставки на стороне, отмечая в базе данных текущий статус при каждой доставке: NOT_PROCESSED, IN_PROGRESS, CONNECTING, CONNECTED, SENDING_DATA, ACCEPTED, FAILURE_X . Вы можете запросить в базе данных статус каждой доставки через Ajax.

Если PHPMailer внутренне использует стандартную функцию PHP mail(), которая использует релейный SMTP-сервер на вашем компьютере, у вас не может быть столько информации о статусе (которая была бы у вас, если бы вы сами создавали сокеты), у вас может быть только три основных состояния. NOT_PROCESSED, IN_PROGRESS, FAILURE_X.

(FAILURE_X действительно представляет собой множество состояний, так как объясняет причину сбоя).

Последнее соображение об использовании mail() заключается в том, что статус, который вы сможете узнать, — это просто статус от локального ретранслятора SMTP, который всегда будет приниматься очень быстро, и вы не сможете сказать, действительно ли почта была отправлена. доставляется на исходящий сервер (по крайней мере, без необходимости взаимодействовать с ним или читать mailq, что очень неприятно).

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ

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

person Vinko Vrsalovic    schedule 20.08.2009

Если процесс электронной почты может отправлять обратно информацию, то может быть возможно обновить индикатор выполнения или текст выполнения с сообщениями.

Это похоже на то, как работает обновление/установка Wordpress. По мере завершения процесса отображается текст, сообщающий о каждом шаге: «Загрузка xxxx.xxx.xxx», «Деактивация плагина», «Установка плагина», «Попытка повторной активации», Повторная активация успешна: что-то подобное. Вам понадобится прослушиватель на на стороне клиента и отправителем сообщений на сервере: по мере выполнения сценария он отправляет сообщения обратно клиенту.

Как было сказано ранее, это может реально дойти только до вашего сервера. Вы можете указать, успешно ли почта покинула ваш сервер, но без какого-либо шага подтверждения получателя электронной почты, я думаю, что это все, что вы можете сделать.

person Robert DeBoer    schedule 20.08.2009

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

Мои мысли:

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

person user1016265    schedule 24.05.2012