Swift Mailer - асинхронно отправлять электронные письма

в проекте с интенсивной электронной почтой мы создаем асинхронный рабочий процесс для публикации электронных писем. Рабочий процесс состоит из 2 шагов:

  1. создание сообщения (мы устанавливаем тему, от, кому, тело, вложения), затем преобразование в строку через $mailer->toString() и сохранение в базе данных.

  2. получить несколько последних писем из базы данных и отправить их пользователям.

Строка, хранящаяся в базе данных, на самом деле является допустимым составным файлом EML (например, может быть открыт с помощью Outlook) с заголовками сообщения + телом.

ВОПРОС:

Как отправить сообщение, преобразованное в строку, через SwiftMailer, используя его транспортные возможности?

Спасибо.

Пример сохраненной строки в базе данных:

Message-ID: <[email protected]>
Date: Mon, 16 Oct 2017 13:50:31 +0200
Subject: Sample subject
From: [email protected]
Reply-To: [email protected]
To: [email protected]
MIME-Version: 1.0
Content-Type: multipart/alternative;
 boundary="_=_swift_v4_1508154632_faf5d3b80866048d993d77a62a9e6497_=_"

--_=_swift_v4_1508154632_faf5d3b80866048d993d77a62a9e6497_=_
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

sample body ...

--_=_swift_v4_1508154632_faf5d3b80866048d993d77a62a9e6497_=_
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: quoted-printable

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org=
/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns=3D"http://www.w3.org/1999/xhtml">
<head>
=09<meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3DUTF-8"=
 />
=09<title>Sample title</title>
=09</head>
<body>
=09=09

=09sample body ...
=09</body>
</html>

--_=_swift_v4_1508154632_faf5d3b80866048d993d77a62a9e6497_=_--

person lubosdz    schedule 16.10.2017    source источник
comment
Вы когда-нибудь находили решение этой проблемы?   -  person Dbl0McJim    schedule 01.10.2018
comment
@ Dbl0McJim К сожалению, нет. Нам пришлось вернуться к старому доброму PhpMailer (на самом деле не так уж и стар, он хорошо поддерживается и требует гораздо меньше памяти), который позволяет получать тело письма в чистом виде с помощью метода $mailer->PreSend(). На самом деле это было довольно легко. Нам не нужно беспокоиться о том, что какой-то класс изменился для электронных писем, находящихся в очереди на несколько месяцев.   -  person lubosdz    schedule 01.10.2018


Ответы (1)


Нет простого способа преобразовать сериализованное сообщение with toString обратно в Swift_Message. Вместо этого вы должны использовать функцию serialize для преобразования Swift_Message, которое вы хотите сохранить в базе данных, обратно в строку.

$data = serialize($message);
// store inside database
// ...
// later..
$message = unserialize($message);
$mailer->send($message);
person Philipp    schedule 16.10.2017
comment
Конечно, нам не нужно конвертировать его обратно :-) Просто для отправки полностью квалифицированного действительного сообщения электронной почты. У нас есть все необходимое для постинга - email to и SMTP authorization credentials. Предыдущее решение с PHPMailer легко работало таким образом. Мы пытаемся перейти от PHPMailer к библиотеке, более совместимой с RFC. Сериализация определенно не предпочтительна, поскольку объекты могут измениться в любое время. - person lubosdz; 16.10.2017