2015-12-30 4 views
0

Я использую SwiftMailer для отправки массовых писем. На данный момент, я делаю это с кодомМассовая электронная почта с Swiftmailer

$transport = Swift_SmtpTransport::newInstance('*****', 25); 
$transport->setUsername('***'); 
$transport->setPassword('***'); 

$mailer = Swift_Mailer::newInstance($transport); 
$message = Swift_Message::newInstance(); 
$message->setSubject($derBetreff); 

$bbc= array('[email protected]','[email protected]','[email protected]',...,'[email protected]'); 

$message->setFrom(array('[email protected]' => 'My Name'));   
$message->setTo('[email protected]'); 
$message->setBcc($bcc); 
$message->setBody('Hi this is my email');   
$message->attach(Swift_Attachment::fromPath('myFile.pdf'));  

// Send the message 
$result = $mailer->send($message); 
echo $result; 

, где я только послать одну электронную почту к себе и добавить ~ 1000 человек в ВСС.

Требуется около 9 минут для выполнения кода и отправки одного электронного письма, и оно возвращает сообщение об успешном завершении. Тем не менее, мой max_execution_time в моем файле php.ini установлен только на 30 секунд.

Мой первый вопрос: почему max_execution_time не останавливает мой скрипт SwiftMailer?

Вторичный, я нашел AntiFlood Plugin for Swiftmailer, который помогает отправлять массовые электронные письма. Скрипт ниже отправляет каждому члену одно электронное письмо, сначала отправляя 100 электронных писем, а затем приостанавливает их на 30 секунд и продолжает отправлять следующие 100 электронных писем и так далее. Я прочитал, что это хорошая практика, чтобы обходить маркировку как спам.

Мой второй вопрос: требуется ли для плагина AntiFlood необычное длительное время выполнения? Например, если я отправил 1000 писем с приведенным ниже сценарием и учитываю только паузу, то скрипт работает уже не менее 4,5 минут, верно?

// Create the Mailer using any Transport 
$mailer = Swift_Mailer::newInstance(
    Swift_SmtpTransport::newInstance('smtp.example.org', 25) 
); 

// Use AntiFlood to re-connect after 100 emails 
$mailer->registerPlugin(new Swift_Plugins_AntiFloodPlugin(100)); 

// And specify a time in seconds to pause for (30 secs) 
$mailer->registerPlugin(new Swift_Plugins_AntiFloodPlugin(100, 30)); 

// Continue sending as normal 
for ($lotsOfRecipients as $recipient) { 
    ... 

    $mailer->send(...); 
} 
+0

Привет, мне нужно заполнить эту точную вещь, как вы это сделали? –

+0

@LeeWiggins вы можете безопасно использовать плагин Anti-Flood или даже лучше почтовый запрос. Я добавил здесь ответ: https://stackoverflow.com/a/47922195/2311074 – Adam

ответ

0

Прежде всего, отправка писем не происходит в самом скрипте. Именно поэтому max_execution_time не влияет, если ваш сервер работает на Linux, см docs:

Функция set_time_limit() и конфигурация директивы max_execution_time влияют только на время выполнения сценария сам. Любое время, потраченное на активность, которое происходит вне выполнения сценария, такого как системные вызовы с использованием system(), потоковых операций, запросов к базе данных и т. Д., Не включается при определении максимального времени выполнения сценария. Это не относится к Windows , где измеренное время является реальным.

Таким образом, использование плагина Anti-Flood является хорошей идеей при отправке нескольких писем одновременно.

Однако я считаю, что лучше использовать электронные письма в базе данных, и пусть cronjob отправляет X-письма из БД каждые Y минут. Таким образом, у вас нет сценария загрузки, который занимает несколько минут перед вами (в том числе с возможностью повторной отправки, если страница перезагружается). Если вы используете фреймворк вроде Laravel, тогда вы можете использовать встроенную функцию mail-query, которая делает именно это.

0

Чтобы отправить массовую электронную почту, вы должны использовать услугу брокера, такую ​​как RabbitMQ. Вы должны создать 2 очереди, один для объединения электронных писем, а другой - для отправки электронной почты с помощью Swiftmailer. Каждое электронное письмо будет сообщением rabbitMq.

+0

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

+1

Я бы поднял вас, если у вашего ответа было больше материала, позволяющего плакату мешать – crafter

Смежные вопросы