Отправка массовой электронной почты с использованием PHP - PullRequest
49 голосов
/ 13 июля 2009

Я сейчас пишу музыкальный блог. Администратор публикует новую статью каждые 2-3 дня. Как только администратор публикует статью, массовое электронное письмо будет немедленно отправлено примерно 5000 подписчикам.

Как лучше всего реализовать функцию массовой почты?

Работает ли следующая функция?

function massmail() 
{
  $content = '...';
  foreach ($recipients as $r) {
    $_content = $content . '<img src="http://xxx/trackOpenRate.php?id='.$r.'">';
    mail($r, 'subject', $_content);
  }
}

Другой вопрос: если все 5000 подписчиков используют Почту Yahoo, будет ли Yahoo рассматривать ее как DDOS-атаку и заблокировать IP-адрес моего SMTP-сервера?

Ответы [ 11 ]

47 голосов
/ 13 июля 2009

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

Я предлагаю вам взглянуть на SwiftMailer , который имеет поддержку HTML, поддержку различных типов mime и аутентификацию SMTP (которая с меньшей вероятностью пометит вашу почту как спам).

30 голосов
/ 13 июля 2009

Я бы вставил все электронные письма в базу данных (вроде очереди), а затем обрабатывал их по одному, как вы это делали в своем коде (если вы хотите использовать swiftmailer или phpmailer и т. Д., Вы тоже можете это сделать .)

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

Поместив их в базу данных, вы получите

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

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

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

17 голосов
/ 13 июля 2009

Это совет, а не ответ: вам гораздо лучше пользоваться специальным программным обеспечением для рассылки. mailman является часто используемым примером, но может быть достаточно чего-то простого, например mlmmj . Отправка массовых писем на самом деле является более сложной задачей, чем кажется. Вам нужно не только отправлять письма, но и отслеживать «мертвые» адреса, чтобы избежать того, что ваша почта или, что еще хуже, ваш почтовый сервер помечается как спам. Вы должны обращаться с людьми, отказавшимися от подписки, по той же причине.

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

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

12 голосов
/ 13 июля 2009

Вы можете рассмотреть возможность использования CRON для такого рода операций. Одновременная отправка массовой почты, безусловно, не годится, это может быть обнаружено как спам, ddos, сбой вашего сервера и т. Д.

Таким образом, CRON может быть отличным решением, отправлять 100 писем одновременно, затем ждать несколько минут, следующие 100 и т. Д.

9 голосов
/ 13 июля 2009

Не отправляйте электронную почту 5000 человек, используя стандартные инструменты PHP. Большинство интернет-провайдеров забанят вас за считанные секунды, и вы даже не узнаете об этом. Вам следует либо использовать какое-либо программное обеспечение для списков рассылки, либо Поставщик услуг электронной почты сделать это.

8 голосов
/ 13 июля 2009

Почему бы вам не использовать phplist ? Он также построен на основе PHP Mailer, и многие отраслевые лидеры используют его. Я сам использовал его пару раз для рассылки писем своим клиентам. Преимущество phplist заключается в том, что вы можете регулировать количество сообщений на уровне домена и времени.

То, что мы также сделали с парой внутренних систем захвата, которые мы получили, это подтолкнули нашу пользовательскую базу к списку рассылки, а затем создали запись cron, запускающую данное письмо каждый день. Возможности бесконечны, это удивительная вещь с открытым исходным кодом!

4 голосов
/ 13 июля 2009

Также пакеты Груша:

http://pear.php.net/package/Mail_Mime http://pear.php.net/package/Mail http://pear.php.net/package/Mail_Queue

всхлип.

PS: НЕ используйте mail () для отправки 5000 писем. В дополнение к тому, что говорили все остальные, это крайне неэффективно, поскольку mail () создает отдельный сокет для каждого набора электронной почты, даже для того же MTA.

2 голосов
/ 13 июля 2009

Также взгляните на класс PHPmailer. PHPMailer

0 голосов
/ 06 июля 2017

Вы можете использовать Swiftmailer для этого. Используя пакетный процесс.

<?php
    $message = Swift_Message::newInstance()
      ->setSubject('Let\'s get together today.')
      ->setFrom(array('myfrom@domain.com' => 'From Me'))
      ->setBody('Here is the message itself')
      ->addPart('<b>Test message being sent!!</b>', 'text/html');

    $data = mysql_query('SELECT first, last, email FROM users WHERE is_active=1') or die(mysql_error());
    while($row = mysql_fetch_assoc($data))
    {
       $message->addTo($row['email'], $row['first'] . ' ' . $row['last']);
    }

    $message->batchSend();
?>
0 голосов
/ 14 января 2016

Я уже сделал это, используя Lotus Notus и PHP. Это решение работает, если у вас есть доступ к почтовому серверу или вы можете запросить что-то у mail server Администратор:

1) Создайте группу в mail server: «Отдел продаж».
2) Присвойте group учетные записи, которые должны быть в группе.
3) Присвойте интернет-адрес группе: salesdept@DOMAIN.com.
4) Создайте свой PHP-скрипт, используя функцию mail:
$ to = "salesdept@DOMAIN.com";
mail ($ to, $ subject, $ message, $ headers);

Это сработало для меня, и все учетные записи, входящие в группу, получают почту.

Лучшие из удач.

...