基于Twig的PHP邮件发送器

1.6.5 2023-02-09 18:24 UTC

README

基于Twig和Symfony Mailer的HTML邮件

Emily是Symfony Mailer的扩展,增加了以下支持:

  • 从磁盘或其他来源(数据库等)加载Twig模板;
  • 为各种部分(主题、发件人、正文等)定义块,允许所有邮件数据存储在一个模板中;
  • 如果只提供了HTML,则自动插入猜测的文本部分。

用法

定义一个Monomelodies\Emily\Message并设置一个Twig模板

<?php

use Monomelodies\Emily\Message;

$loader = new Twig\Loader\FilesystemLoader('/path/to/templates');
$twig = new Twig\Environment($loader);

// Inject the Twig_Environment to use via the Message constructor:
$msg = new Message($twig);
$msg->loadTemplate('path/to/template.html.twig');

// When done, export the Swift_Message using Monomelodies\Emily\Message::get
$swift = $msg->get();
// Now, send $swift using regular transport.

(有关如何使用您选择的Swift_Transport发送消息的详细信息,请参阅Swift文档。)

模板和变量

在您的模板中,您可以定义多个Twig "块"以用于消息的各个部分

{% block subject %}This is the message subject!{% endblock subject %}
{% block plain %}This is the plaintext content.{% endblock plain %}
{% block html %}This is the <b>HTML</b>.{% endblock html %}
{% block sender %}marijn@monomelodies.nl{% endblock sender %}
{% block sender_name %}Marijn Ophorst{% endblock sender_name %}

您还可以使用常规Twig变量

{% block plain %}Hello, {{ firstname }}.{% endblock plain %}

...您可以使用Emily\Message::setVariables方法定义它们

<?php

//...
$msg->setVariables(['firstname' => 'Marijn']);

变量可以在任何块中使用,包括主题。

当然,您也可以让您的消息扩展一个更通用的模板,使用正常的Twig扩展规则。模板还可以定义其他块(例如,模板中的某种侧边栏,显示发送时的最新新闻帖子 - 发挥您的想象力)。根据您的Twig_Environment,您还可以使用翻译等。

设置收件人,添加附件等。

Monomelodies\Emily\Message::get的返回值只是一个Symfony\Component\Mime\Email(所有变量都已替换),因此您可以对其进行任何操作。请注意,在更改任何变量后,您需要重新调用get以接收更新后的版本。

测试邮件

当然,您可以编写一个脚本,将测试邮件不断发送到您的邮箱,但这有点麻烦。一种更简单的方法 - 至少对于初始开发来说,最终您可能需要在实际客户端测试邮件

  • 是使用Emily的Preview类。

用您的Monomelodies\Emily\Message对象作为其参数初始化该对象。然后,调用render方法以显示一个简单的HTML页面来开发您的邮件。

我们指的是一个完整的HTML页面,所以包括<head>等。您可以在单独的PHP文件中加载它,或者指示您的路由器或前端控制器或您使用的任何其他东西不要将其包装在任何模板中。

输入要测试的模板的名称(这应该可以通过您的Message对象中的Twig加载器解析),以及可选的变量JSON编码字符串。点击“提交”。太棒了!现在在测试过程中,每当您更改了某些内容时,只需重新加载页面即可查看结果。

内联CSS

为了获得最佳效果,HTML邮件应使用内联 CSS,而不是外部或内嵌样式表。Message构造函数接受要内联的CSS字符串。这意味着您可以在邮件模板中使用类名和ID等,就像您在构建实际的网页一样。这对于模仿随附网站的外观非常有用!