Лучшая практика PHP Mass Email? (PHPMailer + Gmail) - PullRequest
14 голосов
/ 26 ноября 2009

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

В моем веб-приложении есть пользователи, которые возглавляют группы от 1 до 10000 пользователей. Этот пользователь должен иметь возможность отправлять сообщения всем этим пользователям по электронной почте через мою систему. Поэтому моя система отвечает за отправку до 10 000 электронных писем отдельным пользователям для каждого руководителя группы.

Насколько я могу судить, в GMail нет ограничения по скорости для отправки сообщений отдельным лицам (хотя максимальное количество получателей составляет 500).

Сейчас моя текущая настройка:

  • Когда сообщение отправляется через систему, оно попадает в очередь электронной почты.
  • Сценарий cron захватывает сообщения из очереди каждые несколько минут и отправляет эти электронные письма.
  • Вся электронная почта отправляется через SMTP-сервер GMail.
  • Реальным приложением, выполняющим рассылку, является PHPMailer.

Эта настройка по мере роста базы пользователей, вероятно, будет недостаточной. У меня есть следующие вопросы:

  1. Стоит ли использовать вместо этого локальный SMTP-сервер?
  2. Должен ли я вместо этого использовать почтовый бинарный файл на локальном компьютере? В этом случае я мог бы вообще пропустить очередь?
  3. Есть ли приемлемый способ сделать это?

Спасибо!

Ответы [ 6 ]

10 голосов
/ 26 ноября 2009

Google App Engine

Я бы написал это в Google App Engine (Python), потому что:

  • Хорошо масштабируется.
  • У него хороший API для электронной почты.
  • У него есть очередь задач с хорошим API для доступа к ней.
  • Потому что Python - действительно хороший язык.
  • Это (относительно) дешево.

PHP

Если бы я реализовал это в PHP, я бы

  • Найдите себе хороший SMTP-сервер, который позволяет отправлять такой объем почты, поскольку Gmail не позволяет отправлять такой объем. Я уверен, что это будет стоить вам денег.
  • Найдите себе достойную библиотеку электронной почты PHP для отправки сообщений, например PHPMailer, как вы сказали.
  • Используйте очередь сообщений, например, beanstalkd, чтобы помещать сообщения электронной почты в очередь и отправлять электронную почту асинхронно. Во-первых, потому что при этом пользователь будет загружать страницу быстрее. Во-вторых, с помощью очереди сообщений, такой как beanstalkd, вы можете лучше регулировать скорость отправки, что предотвратит перегрузку вашего компьютера работой. Вам потребуется ssh доступ к серверу для компиляции (установки) beanstalkd. Вы можете найти beanstalkd в beanstalkd
  • Вам также потребуется доступ ssh для запуска PHP-скрипта в фоновом режиме, который будет обрабатывать очередь сообщений. Вы можете найти beanstalkd-клиент по адресу php beanstalkd-client

с php / apache / webpage

Это страница, с которой вы будете отправлять сообщения пользователю. С этой страницы вы отправите сообщение beanstalkd, кодируя что-то в следующих строках:

// register Pheanstalk class loader
require_once('pheanstalk_init.php');
$pheanstalk = new Pheanstalk('127.0.0.1');
$message = ""; // This would contain your message
$pheanstalk->put(json_encode($message);

Вы должны помещать сообщения в очередь сообщений, используя команду put

Из продолжительного PHP-скрипта в фоновом режиме:

Код будет выглядеть примерно так:

// register Pheanstalk class loader
require_once('pheanstalk_init.php');
$pheanstalk = new Pheanstalk('127.0.0.1');

while(true) {
  $job =  $pheanstalk->reserve();
  $email = json_decode($job->getData());
  // Sent email using PHP mailer.
  $pheanstalk->delete($job);
}

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

6 голосов
/ 26 ноября 2009

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

ИМО должен иметь локальный SMTP-сервер:

  • Это довольно легко настроить (просто НЕ позволяйте людям использовать его без строгой аутентичной схемы)
  • Самые современные MTA очень хорошо справляются с очередями отправки
  • Вам не придется иметь дело с GMail (или другими), который решит когда-нибудь заблокировать вашу учетную запись по причинам квоты
0 голосов
/ 28 декабря 2010

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

Затем закодируйте ваш PHP-скрипт, чтобы напрямую вставлять электронные письма в очередь Postfix. Это значительно увеличит скорость обработки почтовых отправлений.

0 голосов
/ 27 ноября 2009

Я не уверен, что это где-нибудь публикуется, но по опыту могу сказать, что Gmail замораживает вашу учетную запись примерно на пятнадцать минут, если вы начнете отправлять сотни сообщений одновременно. Это случилось со мной на прошлой неделе. Я думаю, что вы должны разместить свой собственный SMTP-сервер. Использование функции mail () часто помещает вашу почту в чью-то папку для спама.

0 голосов
/ 26 ноября 2009

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

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

0 голосов
/ 26 ноября 2009

Службы Gmail и Google Apps ограничивают вас примерно 500 письмами в день. Я не уверен, как это сочетается с макс. 500 получателями, но если вы хотите отправить 10 000 электронных писем, вы, вероятно, захотите найти другой почтовый сервер. Я лично использую локальный сервер, или поставщика услуг Интернета, или SMTP центра обработки данных.

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

...