Задержка писем в PHP, чтобы избежать превышения лимита сервера - PullRequest
0 голосов
/ 23 марта 2010

Хорошо, вот моя проблема:

У меня есть список участников на веб-сайте, и периодически один из администраторов моего сайта (которые не очень разбираются в Интернете или технически подкованы) будет отправлять бюллетень в список участников. Мой текущий список участников насчитывает более 800 человек.

Итак, я написал сценарий электронной почты, который отправляет письмо в полный список участников, члены которого перечислены в заголовке скрытой копии.

Однако я обнаружил, что мой хост-сервер имеет ограничение в 300 электронных писем в час, которое я, очевидно, превышаю, даже если участники указаны в поле СК. (Ранее я не знал, что поведение Bcc заключается в отправке отдельных электронных писем для каждого имени в списке ...)

Подумав, я пришел к выводу, что мое единственное решение состоит в том, чтобы мой сценарий отправлял только электронные письма только на первые 300 электронных писем, ждал час и отправлял второе электронное письмо следующим трем сотням, ждите еще один час и так далее, пока я не отправлю электронное письмо всему списку участников.

Оглядываясь в Интернете, я видел несколько других решений, которые люди придумали для задержки электронной почты в PHP. Sleep (), очевидно, не вариант, потому что я не могу просто оставить скрипт открытым и работающим в течение 3 или 4 часов. Я видел, как некоторые люди предлагают задания cron, но я не уверен, насколько возможно было бы создавать три новых задания cron каждый раз, когда я отправляю электронное письмо, использую их один раз, а затем удаляю. Последнее (и то, что я считаю самым умным) решением, которое я когда-либо видел, состоит в том, чтобы иметь в своей базе данных таблицу для временного хранения сообщений, которые нужно отложить и отправить позже, а затем создать задание cron, которое проверяет эту таблицу SQL каждый час. или около того, сравнивает временную метку строки с текущей временной меткой, а затем отправляет электронное письмо, если прошел час.

Так что я спрашиваю вас всех, какой метод вы бы порекомендовали. Есть ли более простое решение, которое я полностью рассмотрел (кроме получения другого плана хостинга. Ха!), Или есть более чистый способ сделать это, чем подход с использованием базы данных / cron?

tl; dr: У меня есть> 800 электронных писем для отправки в течение часа на сервере, который ограничивает меня до 300 / час. Используя PHP, найдите способ обойти эту проблему так, чтобы человеку, отправляющему электронное письмо, нужно было только нажать «отправить».

Ответы [ 3 ]

1 голос
/ 23 марта 2010

Вы можете отправить это в очередь gearman, а затем нанять работника gearman с соответствующими вызовами режима ожидания. См http://gearman.org/ и http://php.net/gearman

0 голосов
/ 23 марта 2010

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

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

Другой рекомендацией было бы посмотреть на внешние почтовые сервисы, такие как Strongmail . Это поможет вам отправлять больше писем в час.

0 голосов
/ 23 марта 2010

Похоже, вам нужно настроить функцию пакетной обработки, которая извлекает из пула отправляемых сообщений и обрабатывает X каждый раз при запуске во время cron. Тогда у вас будет таблица, которая отслеживает отправленные сообщения и кому, чтобы вы могли отслеживать, кто получил электронные письма.

...