Очередь электронной почты в php

Каков наиболее правильный способ отправки электронной почты минимум 1000 или более на PHP? Какой-нибудь надежный метод организации очереди электронной почты, способный справиться с этим?

Ответов (7)

Решение

Вы можете просто вставить свои электронные письма в таблицу базы данных Mail Queue и настроить отдельный процесс для проверки очереди и одновременной пакетной отправки определенного числа.

Для этого есть проверенное решение: PEAR Mail_Queue

У меня отлично работает.

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

Электронная очередь доступна здесь: https://github.com/tin-cat/emailqueue

И есть также версия Docker, которая позволяет настроить рабочий сервер Emailqueue всего за несколько минут, здесь: https://github.com/tin-cat/emailqueue-docker

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

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

если какие-либо электронные письма поставлены в очередь (и электронное письмо не настроено для каждого получателя), я бы затем сгруппировал электронные письма по домену и отправил блоки вместе, чтобы уменьшить общее количество писем, которые должны быть отправлены, т.е. если у вас есть 1000 писем в очереди и 250 для учетных записей Gmail, я бы отправил 250 в 25 блоках по 10 (помните, что получатели скрытой копии, чтобы они не видели друг друга).

чтобы отправить почту, я бы использовал PEAR mail поверх функции php mail ()

после отправки электронного письма удалите запись (и) из очереди или измените флаг состояния, чтобы показать, что он был отправлен, и цикл - я бы также добавил счетчик для отслеживания писем, которые не удалось отправить, и удалить их после x неудачных попыток

чтобы преодолеть проблемы с тайм-аутом, я бы либо (в зависимости от ситуации) - установил set_time_limit () на x секунд и отслеживал время выполнения скрипта (убивая скрипт через (x-1) секунд) - вызовите скрипт из команды строка, чтобы избежать тайм-аутов - установите ограничение на количество писем, которые скрипт может отправить за одно выполнение

Конечно, таблица базы данных может быть идеей. Но как насчет отправки 1000 писем с вложением 2 МБ? Вы должны принять это во внимание. У меня самого была проблема, и я в конце концов прибег к записи электронной почты в базу данных, а файлы в файловую систему. Сценарий электронной почты, который я использовал, затем прочитал записи базы данных и попытался получить вложения для отправки.

Вы уверены, что вам нужно поставить эту почту в очередь?

Просто доставьте всю почту агенту пересылки почты на локальном компьютере (sendmail ...), и пусть он позаботится об организации очереди и отправке. В конце концов, для этого и было задумано.

Другими словами: не беспокойтесь об этом!