leuffen / template-mailer

此包已被废弃,不再维护。未建议替代包。

包含模板引擎的邮件发送

v2.5.4 2018-07-18 10:49 UTC

This package is auto-updated.

Last update: 2020-02-05 23:10:30 UTC


README

Downloads this Month 68747470733a2f2f7472617669732d63692e6f72672f6465726d6174746865732f74656d706c6174652d6d61696c65722e737667 Latest Stable Version Supports PHP 5.4+ Supports PHP 7.0+

此项目结合了一个强大但易于使用的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