Проблема с отправкой писем нескольким получателям - PullRequest
2 голосов
/ 12 июня 2011

Я начал управлять сайтом со списком участников из более чем 50 000 зарегистрированных пользователей.

У меня возникла эта проблема:

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

Теперь я не знаю, сколько писем было отправлено или вообще было отправлено.

Как отправить электронное письмо:

Я выбираю все электронные письма из базы данных, запускаю цикл и отправляю одно за другим. Я выбрал этот вариант, потому что:

  1. Я не хочу добавлять несколько писем в поле «Кому», поэтому конфиденциальность людей будет сохраняться.

  2. При добавлении электронных писем в Bcc сообщение будет отображаться как спам.

Пожалуйста, Как я могу справиться с этим.

Спасибо

Ответы [ 3 ]

3 голосов
/ 12 июня 2011

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

  1. Только для чтения только X электронных писем из базы данных.
  2. Отправляйте эту партию электронных писем X индивидуально (если X = 10, вы отправите 10 отдельных писем).
  3. Пометить каждое электронное письмо как «отправленное», как только каждое электронное письмо отправлено, в противном случае, если возникнет ошибка, вы можете увеличить «попытки отправки» для этого конкретного электронного письма.
  4. После того, как электронные письма X были отправлены (или предприняты попытки), обновите статистику, чтобы указать, что электронные письма X были отправлены.
  5. Вернитесь к 1.

Я предлагаю начать с X = 1

1 голос
/ 12 июня 2011

@ hamlin11 ответ правильный, если вы хотите управлять такой большой электронной почтой, вы ДОЛЖНЫ делать это небольшими порциями и управлять этой задачей как асинхронной задачей.

Для управления асинхронными задачами у вас будет много возможностей: проверка подпроцесса на все ваши запросы, ожидающие некоторых асинхронных заданий, отдельное задание cron, вызов скрипта cron.php из crontab, даже ответ psynnott , с внешним скриптом, перезапускающим себя в конце.

Но вы также можете использовать правильный инструмент для правильной задачи, если у вас есть некоторый контроль над системой под вашим сайтом. Отправьте одно простое электронное письмо менеджеру списков рассылки , который сделает всю работу за вас. Это будет означать, что вы создадите правильный список пользователей в менеджере списков рассылки. Внешними менеджерами списков рассылки являются, например, mailman или sympa . Эти инструменты содержат роботов, с которыми вы можете общаться, чтобы кормить получателей списка рассылки. Ответ @ psynnott можно рассматривать как внешний скрипт PHP, выполняющий очень простые задачи менеджера списка рассылки. Если вы хотите изменить содержимое письма в зависимости от некоторых пользовательских параметров, вам, безусловно, придется написать собственный процесс управления задачами.

Но вы также можете найти веб-сервисы , выполняющие эту работу для вас. Управление спамом - это тяжелая работа, а управление крупным почтовым агентством - это тоже тяжелая работа, но это, конечно, не бесплатно.

1 голос
/ 12 июня 2011

Я сделал это, создав скрипт, который вызывает себя с идентификатором пользователя, которого он обработал в последний раз.

Например, sendmail.php затем вызовет sendmail.php? Id = 1, который затем вызовет sendmail.php? id = 2 и т. д.

Это исправит проблему с тайм-аутом.

В скрипте вы можете отобразить результаты команды mail.Если значение равно false, вы могли бы повторить ошибку.

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

Ваш sql для получения следующего пользователя, которому будет отправлено электронное письмо, в таком случае будет выглядеть примерно так:

Select useremail from users where sendmaildatetime is not null limit 1

Предполагается, что по умолчанию для столбца sendmaildatetime установлено значение null.

Извините, если я не достаточно подробно, я пишу это с моего iphone и его PITA:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...