





Вы можете просто вставить свои электронные письма в таблицу базы данных Mail Queue и настроить отдельный процесс для проверки очереди и одновременной пакетной отправки определенного числа.
Я вообще полагался на хакерство. У меня есть список адресов электронной почты в базе данных, а затем я использую мета-перенаправление на себя с увеличивающимся параметром «смещение», который указывает, к какой строке в базе данных я работаю. Перенаправления сервера вызывают проблемы, потому что браузеры предполагают, что затраченное время указывает на бесконечный цикл.
как предложил Меркуцио, я бы вставил новую запись в таблицу очереди почты для каждого письма, ожидающего отправки, а затем использовал бы отдельный процесс (например, CRON) для периодической проверки таблицы на предмет каких-либо элементов в очереди.
если какие-либо электронные письма поставлены в очередь (и электронное письмо не настроено для каждого получателя), я бы затем сгруппировал электронные письма по домену и отправил блоки вместе, чтобы уменьшить общее количество писем, которые должны быть отправлены, т.е. если у вас есть 1000 писем в очереди и 250 для учетных записей Gmail, я бы отправил 250 в 25 блоках по 10 (помните, что получатели скрытой копии, чтобы они не видели друг друга).
для фактической отправки почты я бы использовал ГРУША почта поверх функции php mail ()
после отправки электронного письма удалите запись (ы) из очереди или измените флаг состояния, чтобы показать, что он был отправлен, и цикл - я бы также добавил счетчик для отслеживания писем, которые не удалось отправить, и удалить их после x неудачных попыток
чтобы преодолеть проблемы с тайм-аутом, я бы тоже (в зависимости от ситуации) - установить set_time_limit () на x секунд и отслеживать время выполнения скрипта (убивая скрипт через (x-1) секунд) - вызвать скрипт из командной строки, чтобы избежать тайм-аутов - установить ограничение на количество писем, которые скрипт может отправить за одно выполнение
Конечно, таблица базы данных может быть идеальной. Но как насчет отправки 1000 писем с вложением 2 МБ? это тоже нужно принять во внимание. У меня самого была проблема, и я в конце концов прибег к записи электронной почты в базу данных, а файлы в файловую систему. Сценарий электронной почты, который я использовал, затем прочитал записи базы данных и попытался получить вложения для отправки.
Вы уверены, что вам нужно поставить эту почту в очередь?
Просто доставьте всю почту агенту пересылки почты на локальном компьютере (sendmail ...), и пусть он позаботится об организации очереди и отправке. В конце концов, для этого и было задумано.
Другими словами: не беспокойтесь об этом!
если вы доставляете пару десятков, это не проблема. Sendign тысяч электронных писем запустит новый процесс sendmail для всех - а затем вы получите большие средние нагрузки, которые поставят сервер на колени. У меня Pear_Mail_Queue'd 50000+ без проблем
Я попробовал это и обнаружил, что sendmail начинает давать длинные паузы - см. serverfault.com/questions/551649/sendmail-slow-to-accept-ema ils
Я создал Emailqueue, который представляет собой сервер, который позволяет вам добавлять электронные письма в очередь, чтобы ваше приложение избавлялось от стресса, связанного с рассылкой, а также предоставляет полезные дополнительные параметры, такие как возможность программировать электронные письма для отправки в будущем или установка приоритетов отправки по электронной почте. Я думаю, это вполне может быть то, что вы ищете.
Электронная очередь доступна здесь: https://github.com/tin-cat/emailqueue
И есть также версия Docker, которая позволяет настроить рабочий сервер очереди электронной почты всего за несколько минут, здесь: https://github.com/tin-cat/emailqueue-docker
Я использовал это, чтобы ставить в очередь более 30 000 писем за раз. Достаточно простой скрипт отправляет около 250 сообщений за раз - если средняя загрузка не слишком высока. Быстрее их не отправишь, но он сделает это без проблем.