Можем ли мы компилировать и хранить сообщения в виде черновика в почтовой программе PHP, а затем отправлять каждое сообщение?
Это можно сделать с помощью PHPMailer. После настройки экземпляра PHPMailer со всем, что вам обычно нужно отправить, не вызывайте send()
– вместо этого вызовите preSend()
(который preSend()
сообщение), а затем получите содержимое сообщения с помощью getSentMIMEMessage()
, например
$mail->preSend(); $message = $mail->getSentMIMEMessage();
$message
будет содержать полное сообщение RFC822, которое вы можете вставить в базу данных, в очередь или что-то еще, чтобы отправить позже. Чтобы выполнить фактическую отправку позже, вы можете напрямую использовать SMTP-класс PHPMailer . Чтобы узнать, как управлять этим классом, посмотрите на smtpSend()
PHPMailer .
Я не думаю, что PHPMailer поддерживает эту функцию. Но вы можете сделать это, используя таблицу DB. Создайте таблицу в базе данных для хранения сообщений, получателей, из, заголовков и т. Д. И отправьте их через PHPMailer позже из задания CRON.
PHPMailer не может это поддерживать, поскольку он сохраняет сообщение электронной почты в объекте, которое умрет после окончания сценария (таким образом работает протокол HTTP).
Если вы хотите отправить их последним (скажем, через 15 минут), вам нужно действительно использовать работу CRON и сделать скрипт, который ищет в базе данных и отправляет электронные письма.
Если вы хотите отправить их в Lifetime сценария (отправить их после тега), вы можете просто создать массив писем и foreach
их в конце
Вам нужно создать
Это все.
Я сам наткнулся на этот вопрос, пытаясь сделать это сам – мне захотелось сохранить объект PHPMailer в базе данных, чтобы отправить его позже с другого сервера, чтобы иметь почтовую очередь для ограничения количества отправленных сообщений в секунду, а также для отсылки сообщений когда произошла ошибка отправки.
Решение легко – вместо
$phpmailerObject->send();
просто выполните:
$phpmailerObject->preSend();
Затем сериализуйте объект в базе данных. Когда вы захотите позже сохранить почту, получите запись в базе данных, несериализуйте объект и выполните:
$phpmailerObject->postSend();
Внутри PHPMailer просто выполняет preSend () и postSend (), если вы отправляете () экземпляр объекта. Использование preSend () перед сохранением объекта важно, потому что вы создадите mime-заголовки и тело, со всеми вложениями и данными. Если вы выполняете preSend () на другом сервере с другой настройкой, файлы / изображения вложений не могут быть найдены, и будет ошибка. postSend () отправляет данные только с помощью «скомпилированного» письма.
Я также рекомендую создать каждый экземпляр PHPMailer с «истинным» в конструкторе (для включения исключений) и обернуть postSend () в try / catch-block для обработки любых ошибок отправки / SMTP. Я узнал, что это трудно.
В настоящее время библиотека PHPMailer имеет функцию getSentMIMEMessage
которая сохраняет сообщение в компактном виде, но библиотека еще не имеет копии, чтобы отправить сохраненное сообщение электронной почты.
Итак, лучший способ сделать на данный момент то, что вам нужно, это сериализовать объект PHPMailer, сохранить строку в базе данных или в файле и восстановить ее после того, когда вы захотите ее отправить.
Вот функции, которые я создал для очереди писем, которые не могут быть отправлены в скрипт.
$ file должен содержать полный путь и имя файла.
function sendQueuedMailFile($file) { $rfcMail = file_get_contents($file); $phpMailerObj = new PHPMailer(); $phpMailerObj = unserialize( $rfcMail ); if ( $phpMailerVar->postSend() ) { // If sent correctly, delete file unlink( $queue_folder . $fichero ); } }
Эта функция сохраняет объект phpMailer в файл очереди. Объект phpMailer должен иметь все адреса, тему, контент со значениями, необходимыми для обычной отправки почты, перед вызовом этой функции.
function queuePHPMailerToFile($phpMailerObj, $file) { $phpMailerObj->PreSend(); $phpMailerObj->GetSentMIMEMessage(); $rfcMail = serialize($phpMailerObj); file_put_contents($file, $rfcMail); }
Вы можете использовать функцию queuePHPMailerToFile для почтовых писем для последующей отправки или для сохранения почты, которую невозможно отправить в данный момент, и попробуйте отправить ее при следующем попытке отправить одно электронное письмо.
Это пример использования для сообщений о неудачных очередях. queuePath должен содержать папку, в которую вы хотите сохранить почту в очереди.
if ( $phpMailerObj->Send() ) { // Mail sent ok, trying to look for queued emails sendEmailQueue($queuePath); } else { // Some problem detected, saving mail for next time queuePHPMailerToFile($phpMailerObj, $queuePath . DIRECTORY_SEPARATOR . date("Ym-d_Hisu") . "_" . rand(0, 999999) . ".txt"); }
И для этого это функция для повторной отправки файлов в очереди
function sendEmailQueue($queuePath) { if ( is_dir($queuePath) ) { if ( $dh = opendir($queuePath) ) { while ( ($file = readdir($dh)) !== false ) { if ( ($file == '.') or ( $file == '..' ) ) continue; sendQueuedMailFile($queuePath . DIRECTORY_SEPARATOR . $file); } } } }