Мнение об отправке писем с php - PullRequest
7 голосов
/ 27 января 2010

Я готовлю сайт, который будет отправлять уведомления по электронной почте зарегистрированным пользователям. По своему опыту я знаю, что отправка электронных писем является несколько болезненным процессом для PHP, особенно когда речь идет о тысячах. Один из моих сайтов время от времени отправляет электронную почту 1000-1500 человек. Для этого PHP требуется около 5 минут, поэтому мы запускаем его в одночасье, когда нагрузка на сервер самая низкая. Я использую встроенную функцию mail() без SMTP. Это хорошо работает на выделенном сервере, но я не большой поклонник этого решения.

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

Я настаиваю на использовании моего сервера для рассылки, а не на внешнем решении.

PS. Я нашел такие решения: http://www.mywebcron.com/ но разве это хорошо?


EDIT

Просто добавить:

  • Я использую CodeIgniter,
  • скорость, с которой электронные письма отправляются с моего текущего сервера, обычно составляет 0,2 с на электронную почту.

Ответы [ 2 ]

3 голосов
/ 27 января 2010

Используйте класс почтовой программы PHP, такой как PHPmailer или SwiftMailer , вы можете отправлять почту напрямую через SMTP таким образом, что будет намного быстрее. И да, отправка большого количества электронных писем лучше всего делать через cron, поэтому вы отправляете X писем каждую минуту. Таким образом вы избежите перегрузки сервера. Если вы не можете создавать задания cron на своем сервере, я предлагаю вам сменить хостинг-провайдера, в противном случае сайт, на который вы ссылаетесь, является вашей единственной жизнеспособной альтернативой (но вы зависите от какой-либо третьей стороны, что не очень круто)

2 голосов
/ 27 января 2010

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

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

Какой-то действительно простой псевдокод:

#wherever you launch the jobs from
for each user
  gearman.push(user.generateEmail())


#in your consumer script
while true
  message = gearman.consume()
  message.send()
  sleep(5)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...