lekoala / silverstripe-email-templates

在 SilverStripe CMS 中添加电子邮件模板

安装次数: 2,644

依赖项: 0

建议者: 3

安全: 0

星标: 5

关注者: 3

分支: 7

公开问题: 1

类型:silverstripe-vendormodule

2.2.4 2022-10-04 11:12 UTC

This package is auto-updated.

Last update: 2024-09-04 15:45:13 UTC


README

Build Status scrutinizer Code coverage

此模块允许您通过管理界面编辑电子邮件模板。

功能

  • 定义应用程序级别的电子邮件模板
  • 预先定义 ss 模板中的内容,便于使用
  • 覆盖框架或其它模块的电子邮件
  • 存储已发送的电子邮件以供跟踪
  • 与 Fluent 模块兼容
  • 与子站模块兼容 (待完成)
  • 电子邮件

预定义模板

尽管让用户编辑发送的电子邮件非常不错,但您需要提供初始内容给他们。手动创建所有电子邮件很繁琐,也许您已经有一些现有的模板想要使用。

为了帮助您完成这项任务,您有一个 ImportEmailTask,它可以导入 /email 文件夹中以 Email 结尾的所有 *.ss 模板,例如 /Email/MyTestEmail.ss。内容将导入“内容”区域。您也可以定义与字段名称匹配的 div。

<div id="Subject">
    <%t MyTestEmail.SUBJECT "My translated title" %>
</div>
<div id="Callout">
    <%t MyTestEmail.CALLOUT "My translated Callout" %>
</div>
<div id="Content">
    <%t MyTestEmail.CONTENT "My translated content" %>
</div>

我建议您将电子邮件标题与电子邮件内容一起存储,这会使事情更容易跟踪。

还要注意,默认情况下,您的内容会被转义。所以,在您的模板中,您可能需要这样做

Hello $Member.Firstname,

Here are your infos:
$Member.SummaryTable.RAW

这将允许渲染由 Member::SummaryTable 方法提供的 HTML 内容。

还要注意讨厌的结尾点,如果需要,不要忘记转义

Without this, {$It.Will.Crash}. <-- because of me

可用的配置标志

  • import_framework:是否导入基本框架模板
  • extra_paths:查找 *Email.ss 模板的额外路径

工作原理

此模块将注入一个 BetterEmail 类,该类将用于代替框架提供的默认 Email 类。

我们这样做,而不是使用自定义的邮件发送程序,是为了不干扰您可能使用的任何自定义邮件发送程序(如 mailgun、sparkpost 等)。

此自定义类负责

  • 记录已发送的电子邮件
  • 覆盖系统设置的模板:setHTMLTemplate 将匹配任何与其代码匹配的电子邮件模板
  • 提供扩展钩子(onBeforeDoSend,onAfterDoSend)
  • 提供成员特定的帮助(调整电子邮件以匹配用户的区域设置,检查用户是否想要接收事务性电子邮件:canReceiveEmails)
  • 改进纯文本渲染

如何使用此模块

此模块假设您希望所有的事务性电子邮件看起来都一样。这就是为什么有一个默认模板

LeKoala\EmailTemplates\Email\BetterEmail:
  template: 'DefaultEmailTemplate'

此模板用于渲染所有电子邮件。因为我们使用自定义的 BetterEmail 类,所以所有 Email::setHTMLTemplate 的用法都会被拦截,并且如果可用,将使用默认模板使用我们的电子邮件模板。

这意味着

$email = Email::create('from@outwebsite.com', 'recipient@email.com');
// Will look for a template with code Welcome
$email->setHTMLTemplate('Welcome');
$email->send();

等同于

$email = EmailTemplate::getEmailByCode('Welcome');
$email->setToMember(Member::currentUser());
$email->send();

这个巧妙的小技巧是为了确保您有统一的“更改密码”和“忘记密码”电子邮件,因为这些电子邮件是由框架提供的,没有简单的方法可以覆盖它们。这也意味着您可以允许用户添加自己的副本,而不必编辑翻译文件。为了使此功能正常工作,您需要从框架导入电子邮件模板。请参阅 EmailImportTask 了解更多详细信息。您还可以添加以下两个电子邮件模板,其代码为 ChangePassword 和 ForgotPassword。这是因为我们覆盖了 setHTMLTemplate 方法,以便查找给定代码的电子邮件模板。

因此,在 LostPasswordHandler 中,我们有

$email = Email::create()
    ->setHTMLTemplate('SilverStripe\\Control\\Email\\ForgotPasswordEmail')

系统将寻找电子邮件模板“ForgotPassword”。

站点配置扩展

此模块提供站点配置扩展,允许您自定义电子邮件。大多数情况下,您的电子邮件都有一个通用的页脚,如果在每个模板中定义它将是浪费的。

这就是我们为什么有以下字段

  • EmailFooter:通用页脚
  • DefaultFromEmail:发送电子邮件的默认电子邮件
  • ContactEmail:所有电子邮件的默认收件人

请注意,您可以按每个电子邮件发送者和收件人(如 order@mywebsite.commessages@mywebsite.com)定义。

扩展还提供了一些在电子邮件模板中使用的方法(如页脚的定制徽标、主题颜色等)。

用户模型

此模块期望在模板中引用模型时遵循简单约定。请使用非命名空间类的名称作为变量。例如,$Member 将匹配 Member 类的对象。

您可以使用任何名称注入值(MyMember => Member),但在管理界面中它将不可见,因为模板不知道将要注入哪些值,除非您在以下位置注册您的别名:

LeKoala\EmailTemplates\Models\EmailTemplate:
  default_models:
    MyMember: SilverStripe\Security\Member

已发送的电子邮件

在管理界面中,您可以查看已发送的电子邮件。

已发送的电子邮件表会定期清理。您可以配置以下选项

LeKoala\EmailTemplates\Models\SentEmail:
  max_records: 1000
  # possible values : 'time' or 'max'
  cleanup_method: 'max'
  cleanup_time: '-7 days'

电子邮件发送

此模块还支持基本的电子邮件发送功能。它将利用您的电子邮件模板,允许您向您的成员或成员选择发送电子邮件。

如果您想添加新的组,请向 Emailing 类添加扩展并实现以下扩展点

/**
 * @param array $groups
 * @param array $locales
 * @return void
 */
public function updateListRecipients(&$groups, $locales)
{
}

/**
 * @param array $groups
 * @param array $locales
 * @param string $recipients
 * @return void
 */
public function updateGetAllRecipients(&$list, $locales, $recipients)
{
}

合并变量:此模块支持在 Emailings 中使用 |MERGETAG| 符号进行合并变量。它期望您的电子邮件网关支持 X-MC-MergeVars 约定。您可以更改使用的电子邮件标题。

LeKoala\EmailTemplates\Models\Emailing:
  mail_merge_header: 'X-Mail-Header-Here'

默认情况下,我们使用 mandrill 模板语法替换。如果您使用其他网关,您可能需要替换它们。例如,mailgun 将是以下内容

LeKoala\EmailTemplates\Models\Emailing:
  mail_merge_syntax: '%recipient.MERGETAG%'

批量发送:默认情况下,此模块将以 1000 份电子邮件的批次发送电子邮件。您可以使用以下选项更改此设置

LeKoala\EmailTemplates\Models\Emailing:
  batch_count: 100

作为密件抄送发送:默认情况下,此模块将作为密件抄送发送电子邮件,以避免显示收件人。如果需要,您可以将其设置为 false。

LeKoala\EmailTemplates\Models\Emailing:
  send_bcc: false

寻找一个好的模板

我强烈推荐以下 来自 dyspatch 的开源电子邮件模板

此模块提供的模板是 "Oxygen",但您可以轻松地根据需要修改模板。

只需在您的模板中创建一个名为 DefaultEmailTemplate.ss 的模板,然后您就可以开始了!别忘了为 HTML 部分使用 .RAW,"内容" 已注册为 $EmailContent,因此您的模板中为 $EmailContent.RAW。

发送电子邮件?

查看我的模块

兼容性

已测试 4.4 版本,但应在任何 4.x 版本上正常工作

对于 3.x 版本,请使用分支 1

维护者

LeKoala - thomas@lekoala.be