symfony邮件模板核心是twig+templatedemail,通过templates/emails/下结构化模板(含base布局、html/文本双版本)实现统一组织与响应式兼容,配合inline_css过滤器和context传参确保客户端适配。

Symfony 邮件模板的核心是 Twig + TemplatedEmail,不是手写 HTML 字符串,而是用结构化、可继承、可复用的方式组织邮件内容。关键不在于“怎么写”,而在于“怎么组织”——布局统一、变量清晰、响应可靠。
模板位置与命名规范
推荐将邮件模板放在 templates/emails/ 目录下,保持语义清晰:
-
emails/welcome.html.twig—— 主 HTML 模板 -
emails/welcome.txt.twig—— 纯文本备选模板(部分客户端或无障碍场景需要) -
emails/base.html.twig—— 基础布局,含通用样式、页眉页脚
路径会直接用于 htmlTemplate() 方法,如 ->htmlTemplate('emails/welcome.html.twig'),无需加 templates/ 前缀。
基础模板继承结构
避免重复写 ,用 Twig 继承统一控制外观:
templates/emails/base.html.twig
{% apply inline_css %}
<meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>{% block title %}Our Service{% endblock %}</title><style>
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; line-height: 1.6; margin: 0; padding: 0; }
.container { max-width: 600px; margin: 0 auto; padding: 20px; }
</style><div class="container">
{% block content %}{% endblock %}
</div>
{% endapply %}
templates/emails/welcome.html.twig
{% extends 'emails/base.html.twig' %}
{% block title %}Welcome, {{ name }}!{% endblock %}
{% block content %}
<h1>Hello, {{ name }}!</h1>
<p>Thanks for joining us.</p>
<p>
<a href="%7B%7B%20activationUrl%20%7D%7D" style="display: inline-block; background: #007bff; color: white; padding: 10px 20px; text-decoration: none;">
Activate your account
</a>
</p>
{% endblock %}
注意:{% apply inline_css %} 是 Symfony Twig Bridge 提供的过滤器,自动将 <style></style> 内联到对应标签上,提升邮件客户端兼容性。
发送时传入动态数据
使用 TemplatedEmail 的 context() 方法传递变量,所有键名在模板中直接可用:
$email = (new TemplatedEmail())
->from('noreply@example.com')
->to($user->getEmail())
->subject("Welcome, {$user->getName()}!")
->htmlTemplate('emails/welcome.html.twig')
->textTemplate('emails/welcome.txt.twig')
->context([
'name' => $user->getName(),
'activationUrl' => $this->urlGenerator->generate('app_activate', ['token' => $user->getToken()], UrlGeneratorInterface::ABSOLUTE_URL),
])
支持嵌套数组、对象(需有公共 getter)、DateTime 实例等,Twig 中可安全调用 {{ user.profile.bio|default('No bio') }}。
响应式与客户端兼容要点
别依赖 Flexbox 或 Grid:多数邮件客户端(如 Outlook、Apple Mail)只支持老旧 CSS。实用建议:
- 用表格(
<table>)做栅格布局,配合 <code>cellpadding/cellspacing - 所有关键样式尽量内联(Twig 的
inline_css过滤器能帮你做到) - 字体用系统安全字体栈:
font-family: Helvetica, Arial, sans-serif - 图片必须带
alt和明确宽高属性,防止拉伸或错位 - 测试工具推荐:Putsmail 或 Email on Acid











