Я хотел бы сохранить в базе данных отправленные письма. Я использую Yii2 с Swiftmailer, и мой вопрос: есть ли способ получить genereated htmlBody (шаблон с переменными) после или до отправки?
Если нет, то как я могу сгенерировать файл представления в переменной $message
в классе модели?
Спасибо.
Просто сохраните сообщение перед отправкой. Если вы сохраните контент как.EML файл, он отлично работает.
$email = Yii::$app->mailer->compose('simpleEmail')
->setFrom(['[email protected]' => 'Sender Name'])
->setTo($emails_array)
->setSubject('subject');
$mailMessage = $email->toString();
$email->send();
Да, вы можете легко сохранить Html Body сгенерированной электронной почты
Если у вас есть код отправки электронной почты в /controllers/XyzController.php
:
ШАГ 1
$param = 'some value';
$path_to_email_template = '@app/mail/layouts/eg';
$message = $this->renderPartial($path_to_email_template, ['param'=>$param]);
echo "$message"; // test
\Yii::$app->mailer->compose()
->setTo('[email protected]')
->setFrom('[email protected]')
->setSubject('Hello')
->setHtmlBody($message)
->send();
ШАГ 2
Теперь у вас есть тело электронной почты, хранящееся в переменной $message
и вы можете сохранить его как
$model = new Somemodel; // consider Somemodel model
$model->html_content = $message; // consider Somemodel model have attribute 'html_content'
// assign another properties too, if any
$model->save(true);
// Great, email body saved in DataBase, if no validation error occurs. If validation error occurs use print_r($model->errors); to debug
И если вы отправляете почту в любом файле вида, то в /views/xyx/index.php
(скажем, в файле index.php)
Заменить третью строку STEP: 1
$message = $this->renderPartial($path_to_email_template, ['param'=>$param]);
от
$message = $this->render($path_to_email_template, ['param'=>$param]);
и продолжайте дальше. Это.
Вы можете сохранить HTML в файле вида:
$message = Yii::$app->mailer->compose('myview', ['param1'=>'param'])
->setTo('...')
->setFrom('...')
->setSubject('');
//And then maybe you can get the textBody
$body = $message->getTextBody();//I'm not sure for this part
return $message->send();
Файл вида (myview) должен находиться в папке "mail" (/mail/myview.php). Я не тестировал его.
См. Doc: http://www.yiiframework.com/doc-2.0/guide-tutorial-mailing.html#composing-mail-content
Вы можете прочитать о fileTransportCallback:
http://www.yiiframework.com/doc-2.0/yii-mail-basemailer.html#$fileTransportCallback-detail
В ответ вы получите обратный вызов с $mailer
и $message
. Сохранить в базе данных
Я не думаю, что это возможно. Но вы можете установить 'useFileTransport' => true в настройке компонента почтовой программы. Это позволит сохранить почту в папке времени выполнения/почты вместо отправки. Сохраненные файлы находятся в eml-формате, который может быть просмотрен, например, thunderbird. Чтобы изменить путь к папке, используйте свойство fileTransportPath.
Насколько я знаю, вы не можете делать и отправлять и сохранять их в файловую систему.
Надеюсь, я смогу помочь с вашим первым вопросом.