Отправить по электронной почте Асинхронно через PhpMailer

Я использую PHPMailer для отправки электронной почты, которая отлично работает. Однако проблема заключается в том, что, поскольку она отправляет электронное письмо синхронно, последующая загрузка страницы занимает много времени.

Я использую PhpMailer, как показано в этом примере https://github.com/PHPMailer/PHPMailer/blob/master/examples/gmail.phps

Интересно, есть ли способ сделать доставку по электронной почте асинхронной. Я исследовал это и обнаружил, что sendmail имеет возможность установить DeliveryMode в «фоновый режим» – источник http://php.net/manual/en/function.mail.php

mail($to, $subject, $message, $headers, 'O DeliveryMode=b'); 

Я хочу знать, можно ли сделать что-то подобное в PhpMailer? Кто-нибудь имел успех в этом?

EDIT: – (Дополнительная информация) Кажется, что PhpMailer может быть настроен на использование sendmail – https://github.com/PHPMailer/PHPMailer/blob/master/class.phpmailer.php. Поэтому я задаюсь вопросом, может ли это быть каким-то образом задействовано для включения доставка фона.

 /** * Which method to use to send mail. * Options: "mail", "sendmail", or "smtp". * @type string */ public $Mailer = 'mail'; /** * The path to the sendmail program. * @type string */ public $Sendmail = '/usr/sbin/sendmail'; /** * Whether mail() uses a fully sendmail-compatible MTA. * One which supports sendmail's "-oi -f" options. * @type boolean */ public $UseSendmailOptions = true; /** * Send messages using $Sendmail. * @return void */ public function isSendmail() { $ini_sendmail_path = ini_get('sendmail_path'); if (!stristr($ini_sendmail_path, 'sendmail')) { $this->Sendmail = '/usr/sbin/sendmail'; } else { $this->Sendmail = $ini_sendmail_path; } $this->Mailer = 'sendmail'; } 

Также – видимо, есть способ установить параметры sendmail через php.ini http://blog.oneiroi.co.uk/linux/php/php-mail-making-it-not-suck-using-sendmail/

Я бы предпочел сделать это как встроенный аргумент для вызова api vs php.ini, так что это не глобальное изменение. Кто-нибудь пробовал это?

Related of "Отправить по электронной почте Асинхронно через PhpMailer"

Неправильный подход.

PHPMailer не является почтовым сервером, и это то, о чем вы просите. SMTP – это подробный, чатный протокол, который подвержен задержкам и медленной пропускной способности, и абсолютно не подходит для интерактивной отправки во время типичного представления веб-страницы (что, вероятно, связано с тем, что связано с BlackHatSamurai). Многие избегают делать именно это, но не обманывайте себя, думая, что это хорошее решение, и определенно не пытайтесь реализовать MTA самостоятельно.

В примере gmail, с которым вы связаны, используется SMTP на удаленном сервере, который всегда будет медленнее, чем отправка локально. Если вы отправляете через sendmail (или mail() – это в основном одно и то же) на локальный сервер и занимает более 0,1 с, вы делаете что-то очень не так. Даже SMTP для localhost не займет много времени, и отправка в ближайший smarthost вряд ли будет слишком медленной.

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

Правильный способ сделать это – установить локальный почтовый сервер и отправить свои сообщения ему с помощью PHPMailer. Этот способ очень быстрый (сотни сообщений в секунду), и вам не нужно ничего делать, чтобы заставить его работать, потому что по умолчанию работает PHPMailer.

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

В соответствии с этим phpMailer не поддерживает этот тип вызова. Вам нужно будет написать свой собственный потоковый класс, чтобы сделать асинхронный вызов. См. Раздел pThreads и класс Thread . Здесь было найдено еще одно решение.