Способ отправки с рассылкой производительности

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

У меня есть вопрос о производительности отправки соединения. Какой способ лучше для отправки действий? (Абонент специфический другой почтовый орган)

Первый сценарий;

  • Открыть информационный бюллетень
  • Поймать 100 подписчиков в списке задач
  • Замените данные информационного бюллетеня / заголовок для каждого подписчика и сохраните в новый массив
  • Call PhpMailer — общие настройки SMTP-соединения
$mail->SMTPKeepAlive = true;
foreach($newArray as $k=>$v){
$mail->AddAddress($k, $v['name']);
$mail->Subject  =  $v['subject'];
$mail->Body = $v['content'];
$mail->Send();
}
$mail->smtpClose();

Второй сценарий (текущий метод в моем скрипте, я вызвал класс phpmailer в цикл записи);

  • Открыть информационный бюллетень
  • Открыть список задач 100 записей
while($rs = $sql->fetch_assoc()){
Replace Newsletter Data/Header
Call PhpMailer - Common SMTP Connection settings
$mail->SMTPKeepAlive = true;
$mail->AddAddress($rs['mail'], $rs['name']);
$mail->Subject  =  $campRs['subject'];
$mail->Body = $campRs['content'];
$mail->Send();
}
$mail->smtpClose();

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

С наилучшими пожеланиями!

1

Решение

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

Оба сценария, вероятно, будут одинаково быстрыми.

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

0

Другие решения

Самый быстрый способ отправки из PHPMailer — это отправка всех ваших сообщений на ближайший (или локальный) почтовый сервер через SMTP. Это (на удивление) часто быстрее звонка mail()так как почта вызывает утилиту sendmail, которая просто открывает SMTP-соединение с localhost, по крайней мере, в случае постфикса.

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

Не создавайте новый экземпляр PHPMailer каждый раз в цикле — это пустая трата ресурсов. Тот факт, что он не такой большой, как накладные расходы SMTP, не означает, что его стоит отбросить, хотя, конечно, действует закон Амдаля. Установите все, что является общим для всех получателей вне цикла (например, тема). Реальные потоки в PHP не просты, но вы можете легко разветвлять несколько процессов (больше, чем у вас процессорных ядер; смотрите расширение pcntl), потому что они в любом случае будут в основном связаны с сетью. Может оказаться полезным предварительно ставить свои сообщения в очередь, например, beanstalkd, чтобы позволить вашим рабочим процессам продолжать посылку так быстро, как они могут.

В первом примере вы не очищаете массив получателей между каждым сообщением, поэтому первое сообщение будет отправлено первому получателю, второе — второму. и первый получатель и тд. Вам нужно позвонить $mail->clearAllAddresses() в конце вашего цикла.

Вы должны использовать SMTPKeepAlive, особенно если вы используете соседний ретранслятор, так как это значительно сократит накладные расходы SMTP.

Для более полного примера см. пример, включенный в PHPMailer.

Сделайте все это, и вы можете легко получить сотни сообщений в секунду.

2

По вопросам рекламы [email protected]