Как отправить почту сотням получателей? - PullRequest
1 голос
/ 10 ноября 2009

Теперь я отправляю электронные письма с этим циклом:

while($data = mysql_fetch_assoc($resultat)){
    ...
    sendMail();
}

function sendMail(){
    ...
    mail($to, $subject, $text, $headers);
}

Но это не так эффективно для памяти, что я могу понять. Сценарий должен быть в состоянии отправить более 1000 получателей.

Вы знаете, как сделать это лучше? Я хочу, чтобы все было просто и не нужно устанавливать какие-либо рамки.

Ответы [ 6 ]

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

Бросьте "записку" на задание cron. Другими словами, напишите файл, который получает задание cron и выполняет длительную операцию вне сеанса PHP.

Конечно, вы можете использовать PHP для реального скрипта, который будет запускать cron: -)

Причина, по которой я предлагаю это: вы, вероятно, не хотите задерживать сеанс PHP слишком долго зависать: делегирование во внешний процесс имеет (вероятно) больше смысла.

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

1 голос
/ 10 ноября 2009

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

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

1 голос
/ 10 ноября 2009

Вы говорите, что не хотите устанавливать фреймворк, но я не думаю, что почта PHP действительно создана для быстрой и эффективной отправки огромных объемов электронной почты. Я бы попробовал Pear's Mail_Queue или Mail .

0 голосов
/ 26 марта 2012

Существует несколько способов решения этой проблемы. Идея MightyE по работе с менеджером списков рассылки, вероятно, является «правильной вещью» (tm) - создать список рассылки с использованием Listman, Sympa, Majordomo или одного из другие сотни менеджеров списков рассылки. Зачастую легко управлять им из скрипта PHP, а затем вы отправляете одно электронное письмо на адрес списка рассылки, а остальное делает менеджер.

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

Другой, более простой способ - использовать поворот ответа Justastefan (это позор, что за него так мало проголосовали): у него есть серьезные проблемы, но его можно заставить работать.

Что вам нужно сделать, так это убедиться, что подпрограмма mail() вашего PHP-скрипта доставляется в локальный MTA. Это установка по умолчанию на серверах Linux / BSD. Также убедитесь, что вы используете хороший MTA, такой как postfix или exim. Затем, когда вы хотите отправить массовое электронное письмо, создайте список заголовков BCC для отправки:

$bcc = array();
while($data = mysql_fetch_assoc($resultat)){
    $bcc[] = "Bcc: {$data['email']}";
}
sendMail($bcc);

function sendMail($extraheaders){
    ...
    mail($to, $subject, $text, array_merge($headers, $extraheaders));
}

Это довольно эффективный способ - заголовки BCC довольно компактны и анализируются только локальной службой MTA, которую mail() доставляет напрямую.

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

  1. Всегда убедитесь, что у вас есть действительный адрес «Кому», который может принимать (и, возможно, молча игнорировать) электронные письма - каждое письмо также будет отправлено туда. Этот адрес «Кому» должен выглядеть законно.
  2. Обязательно добавьте заголовок «Reply-To» с адресом электронной почты, чтобы получатели могли легко ответить вам.
  3. Убедитесь, что установлен правильный заголовок «Return-Path» с допустимым адресом электронной почты, который может принимать отказы электронной почты - пропущенный или недействительный «Return-Path» является единственной наиболее вероятной причиной сбоя автоматической электронной почты.
0 голосов
/ 10 ноября 2009

AJAX, вероятно, лучший для таких операций.

С AJAX вы можете вызвать небольшой * .php-файл, содержащий только функцию, чтобы отправить электронное письмо следующему пользователю. Это называется каждую кучу секунд, и все готово.

Конечно, если вам не нравятся клиентские скрипты, такими операциями становится довольно сложно управлять с помощью PHP.

0 голосов
/ 10 ноября 2009
$to='user1@asdf.com;user2@asdf.com;user3@asd.fi;...';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...