leuffen / template-mailer
包含模板引擎的邮件发送
Requires
- php: >=5.5
- phpmailer/phpmailer: ~6.0
- text/template: ~2.3
Requires (Dev)
- nette/tester: ^1.7
README
此项目结合了一个强大但易于使用的OOP接口来操作Multipart-Mime-Mails,同时提供了一个易于学习的模板语言,用于在单个字符串中定义完整的multipart消息(包括主题、发件人、其他头部信息、各种消息部分)。
安装
使用composer安装
composer require leuffen/template-mailer
基本示例
查看目录
/doc/template/tpl/
以获取一些工作示例。您可以使用/doc/template/SendTestMail.php
对您的邮件客户端/MTA进行现场测试。
使用文本模板语法定义模板
To: {= user.email};<support@some-company.com>
From: support@some-company.com
Subject: Your order {= oder.id} on our site
<mailPart contentType="text/plain" encoding="UTF-8">
Hello {= user.name},
you just ordered following items:
{for curItem in order.items}
{=@index1}: {=curItem.title|cutright:20} {=curItem.quantity} x {=curItem.price|currency}
{/for}
</mailPart>
<mailPart contentType="text/html" CHARSET="UTF-8">
... do the same stuff in HTML
</mailPart>
注意:为了默认显示html内容,将text/html内容放在邮件末尾很重要。
加载模板并发送邮件
$parser = new MailTemplateParser(); $parser->loadTemplate($template); $parser->send ($orderData);
就这样
向模板中添加邮件部分
使用 apply()
方法不仅可以发送邮件,还可以返回 MailBody
$parser = new MailTemplateParser(); $parser->loadTemplate ($template); $mail = $parser->apply($orderData);
使用 FileAttachment
辅助类添加附件
$mail->addPart(new FileAttachment("path/to/image.jpg"));
或手动方式
$mail->addPart( $_part = new MailBody( chunk_split( base64_encode( file_get_contents($fileName) ), 75 ), mime_content_type($fileName), "UTF-8", "base64" ) ); $_part->setContentDispositionFileName(basename($fileName));
发送邮件
$mail->send();
就这样。
程序化多部分示例
您可以直接从代码中发送不包含模板的多部分邮件,而无需使用template-mailer。
$mailBody = new MailBody ("to@address.de", "Some subject", "from@me.de"); $mailBody->addPart (new MailPart ("Some Text Content", "text/plain")); $mailBody->addPart (new MailPart ("<h1>Some Html Part</h1>", "text/html")); $mailBody->send();
使用模板引擎
对于标准用途,您应该使用MailTemplateParser来生成您的邮件。但template-mailer也可以像OOP邮件前端一样使用。有关此主题的更多信息,请参阅下一节。
使用模板时的安全增强措施
-
自动转义:TemplateParser将根据您的内容类型转义值。在text/html邮件部分中的值将使用htmlspecialchars()转义。
-
邮件注入:在标题部分中的值将被自动修剪到255字节,并且行断行将被转换为空格。
-
透明编码:模板引擎将使用最佳可用的传输编码设置和编码任何内容。
-
默认UTF-8:模板和值都期望以正确的UTF-8格式。默认情况下,发送的邮件也将以UTF-8格式化,除非您更改Charset: - 标题。在这种情况下,template-mail将为您进行透明转换。
定义模板
Template-Mail使用Text-Template (http://github.com/dermatthes/text-template) 语法来定义模板。
模板由两个部分组成。首先是 头部部分...
To: Some User <some@user.com>
Subject: Some fancy mail subject
... 然后是 一个空行,接着是 正文部分...
<mailPart contentType="text/html">
..content goes here..
</mailPart>
..more mail-parts..
... 其中您在 <mailPart>
和 </mailPart>
之间定义您的邮件的每个部分。
您无需关注边界、附加标题或正确的转义。
在定义mailPart时,您可以使用以下属性来满足您的需求
属性 | 描述 | 允许的值 |
---|---|---|
contentType | text/plain, text/html, application/pdf, ... | |
contentDisposition | attachment, inline | |
contentTransferEncoding | 默认:8Bit | 8Bit, quoted-printable, base64 |
charset | 默认:UTF-8 | utf-8, iso-8895-1, ... |
fileName | 与contentDispositon="attachment"一起使用:在附件中显示的文件名 | |
token | ||
id | 用于引用附件。如果将其命名为somefile ,则可以引用它 <img src="cid:somefile"> |
|
skipEncoding | 如果存在skipEncoding="no",Text-Template将不对内容进行编码 | YES, NO |
邮件正文内容类型
关于容器邮件的内容类型的一词
-
multipart/mixed
:默认,如果设置了多个mailPart- 所有部分按出现顺序显示
- 可能包含附件
-
multipart/alternative
:如果只想显示一个部分(HTML或TEXT)并带有内联附件,请使用此选项- 最后部分具有最高优先级
- 附件将不会显示
-
multipart/related
:如果想要在邮件中嵌入附件,请使用此选项- 第一部分具有最高优先级
- 如果它们在HTML代码内部显示,则内联附件将不会显示。
默认情况下,Template-Mailer会将容器邮件的头部内容类型设置为multipart/mixed
,这允许有多个附件。
但它将显示所有附件。
您可以通过添加头部来将其设置为使用multipart/alternative
..in Header..
Content-Type: multipart/alternative
调试上下文
要查看传递给模板的数据结构,只需将以下内容添加到您的模板中
{= __CONTEXT__ | raw }
它将输出上下文的结构。
访问TextTemplate解析器
要访问和配置TextTemplate解析器,请使用MailTemplateParser::getTextTemplateParser()
方法。
示例
$mailTemplateParser->getTextTemplateParser()->addFilter("price", function ($input) { return number_format($input) });
将DeliveryAgent更改为非本地SMTP服务器
要更改DeliveryAgent,必须在MailKernel中设置它,通过静态函数SetMailDeliveryAgent。SmtpDeliveryAgent使用PHPMailer类将SMTP消息发送到所选服务器
示例
$mailDeliveryAgent = new SmtpDeliveryAgent("localhost");
MailKernel::SetMailDeliveryAgent($mailDeliveryAgent);
关于
Template-Mailer由Matthias Leuffen编写 http://leuffen.de