Проблема с отправкой электронных писем нескольким получателям

#php #email

#php #Адрес электронной почты

Вопрос:

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

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

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

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

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

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

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

  2. Добавление писем в Bcc приведет к тому, что они будут отображаться как спам.

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

Спасибо

Комментарии:

1. используете ли вы стандартную функцию PHP mail()?

Ответ №1:

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

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

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

Ответ №2:

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

Например. 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 🙂

Ответ №3:

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

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

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

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