lekoala / silverstripe-email-templates
在 SilverStripe CMS 中添加电子邮件模板
Requires
- php: >=7
- silverstripe/admin: ^1
- silverstripe/framework: ^4
- silverstripe/siteconfig: ^4
Requires (Dev)
- phpunit/phpunit: ^5.7
- squizlabs/php_codesniffer: ^3.0
README
此模块允许您通过管理界面编辑电子邮件模板。
功能
- 定义应用程序级别的电子邮件模板
- 预先定义 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.com 和 messages@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