Подводя итог:
- Основное изменение: повторное использование вашего почтового соединения и, желательно, создание сообщения, поэтому это делается только по мере необходимости, обычно только один раз.
- Проверьте, как вы создаете экземпляр SwiftMailer, и подтвердите, что это наиболее оптимальный способ.
- Ваша версия класса SwiftMailer кажется немного устаревшей (4.0.5), вы можете проверить более новую версию
Подробнее:
Повторное использование экземпляров объектов. Вы каждый раз заново создаете свой почтовый транспорт, что приводит к накладным расходам. Вы не должны этого делать. Вы можете использовать batchSend() для больших пакетов писем, если он поддерживается. См. пример использования в этом вопросе. Прикладной пример:
$message = Swift_Message::newInstance(...)
->setSubject('A subject')
->setFrom(array('[email protected]' => 'From Me'))
->setBody('Your message')
;
while(list($targetadd, $targetname) = each($targetlist))
{
$message->addTo($targetadd, $targetname);
}
$message->batchSend();
Обратите внимание, что функция batchSend() была удалена в версии 4.1.0 RC1 SwiftMailer. . Насколько мне известно, он внутренне вызывает send() в цикле, поэтому вы должны иметь возможность иметь те же эффекты, вызывая send() несколько раз, но повторно используя, по крайней мере, ваш почтовый транспорт, чтобы вы не создавали его каждый раз (и, если применимо, также создавали сообщение).
Из примера пакетной отправки в официальной документации вы можете отправлять электронные письма в пакете, используя send() с
// 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('[email protected]' => 'John Doe'))
->setBody('Here is the message itself')
;
// Send the message
$failedRecipients = array();
$numSent = 0;
$to = array('[email protected]', '[email protected]' => 'A name');
foreach ($to as $address => $name)
{
if (is_int($address)) {
$message->setTo($name);
} else {
$message->setTo(array($address => $name));
}
$numSent += $mailer->send($message, $failedRecipients);
}
Транспортные протоколы. Следует также отметить, что SwiftMailer является классом-оболочкой. Что он на самом деле использует под капотом, это то, что вы определяете. В вашем случае вы используете SMTP-транспорт, который лучше, чем почтовый транспорт (функция mail()), но, возможно, не самый оптимальный.
Вы не говорите, хотите ли вы явно использовать это и какая среда у вас есть, но в среде Linux вы можете напрямую вызывать sendmail с помощью чего-то вроде
$transport = Swift_SendmailTransport::newInstance('/usr/sbin/sendmail -bs');
Что может дать лучшую производительность. Дополнительную информацию о различных транспортных средствах можно найти в документации по использованию SwiftMailer.
Версия класса. Судя по вашему комментарию, вы используете версию 4.0.5. Текущая версия — 4.1.8., и есть некоторые изменения. так как с пакетной отправкой, так что вы можете проверить это тоже.
РЕДАКТИРОВАТЬ: обновлена информация о batchSend(), текущей версии и ручных ссылках.
person
eis
schedule
18.06.2012