PHP Отправка массовых писем: один за каждого или один за всех?
При отправке массовых писем с помощью PHP лучше отправлять каждому подписчику электронное письмо (с циклом for по всем адресам электронной почты) или лучше просто добавить все в BCC в списке через запятую и, таким образом, отправлять только один адрес электронной почты?
Спасибо.
4 ответа
Существует большая вероятность того, что количество адресов в поле BCC на SMTP-сервере ограничено (чтобы избежать спама). Я пошел бы по безопасному маршруту и отправил бы электронное письмо каждому отдельному подписчику. Это также позволит вам настроить электронную почту для каждого подписчика, если это необходимо.
Также обратите внимание, что mail(), вероятно, не лучший способ отправки массовой почты (из-за того, что он открывает новое соединение с SMTP-сервером каждый раз, когда он вызывается). Вы можете заглянуть в PEAR:: Mail.
Если процесс отправки по какой-либо причине не удался (например, причиной может быть неразрешимый домен) для одного из получателей BCC, вся операция будет отменена (что в 99% случаев является нежелательным поведением).
Если вы отправляете электронные письма в цикле PHP, даже если одно из электронных сообщений не удается отправить, другие электронные письма будут отправлены.
Как говорят другие, лучше подходит одно письмо для каждого получателя.
Если вы хотите, чтобы библиотека сделала грязную работу за вас, попробуйте SwiftMailer http://swiftmailer.org/
Вот пример непосредственно из документов:
require_once 'lib/swift_required.php';
//Create the Transport
$transport = Swift_SmtpTransport::newInstance('localhost', 25);
//Create the Mailer using your created Transport
$mailer = Swift_Mailer::newInstance($transport);
//Create a message
$message = Swift_Message::newInstance('Wonderful Subject')
->setFrom(array('john@doe.com' => 'John Doe'))
->setTo(array('receiver@domain.org', 'other@domain.org' => 'A name'))
->setBody('Here is the message itself')
;
//Send the message
$numSent = $mailer->batchSend($message);
printf("Sent %d messages\n", $numSent);
/* Note that often that only the boolean equivalent of the
return value is of concern (zero indicates FALSE)
if ($mailer->batchSend($message))
{
echo "Sent\n";
}
else
{
echo "Failed\n";
}
*/
У этого также есть хороший плагин Antiflood: http://swiftmailer.org/docs/antiflood-plugin-howto
Рекомендуется отправлять электронные письма каждому получателю.
Если это почтовый сервер linux, он может обрабатывать большие объемы, поэтому объем не должен быть проблемой, если только это не дерьмовый сервер!
Если это общий веб-сервер, ваш хост может быть недоволен - в этом случае я бы разбил его на куски и распространил посылку. Если он посвящен, то делай как хочешь:)