第十七天 - Dancer 和邮件

Web应用程序经常需要向其用户发送电子邮件,例如收据或密码重置链接。Dancer2 的Email插件通过提供email关键字和健全的默认配置简化了此任务。

所以不可避免的“Hello world”示例如下所示:

1
2
3
4
5
6
email {
from => 'foo@perl.dance',
to => 'bar@perl.dance',
subject => 'Hello world',
text => 'Welcome to the dancefloor!',
};

更常见的情况是使用Web应用程序中的模板并将其转换为HTML电子邮件。

你不是使用template关键字将HTML从路由返回到浏览器,而是生成具有特定布局的 HTML,存储在变量中并发送电子邮件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
post '/welcome' => {

my $html = template $template, $tokens, { layout => 'email' };

email {
from => 'foo@perl.dance',
to => 'bar@perl.dance',
subject => 'Welcome to the dancefloor!',
type => 'html',
body => $html,
}

redirect '/home';
}

UTF-8

如果内容和邮件标题可能包含UTF-8字符,请注意对其进行编码。如果你不这样做,它甚至可能在你的电子邮件客户端中看起来很好,但不一定适用于其他客户端。

1
2
3
4
5
6
7
8
email {
from => 'foo@perl.dance',
to => 'bar@perl.dance',
subject => encode('MIME-Header', 'Über uns'),
type => 'html',
body => encode('UTF-8',
'Die Geschichte unseres Projekts begann mit dem französischen Entwicker Alexis Sukrieh ...'),
};

内嵌图像

你只需发送带有图像链接的电子邮件,但通常电子邮件客户端不会在没有用户交互的情况下加载它们。虽然可以将图像附加到电子邮件并使用自定义HTML标记在电子邮件正文中引用它们:

1
2
3
4
5
6
7
8
9
 email {
from => 'foo@perl.dance',
to => 'bar@perl.dance',
subject => 'Welcome to the dancefloor!',
body => q{<p>Image embedded: <img src="cid:mycid"/></p>},
type => 'html',
attach => [ { Id => 'mycid', Path => '/dancefloor/dcr-header-logo.pngpath/to/file' }],
multipart => 'related'
};

提供纯文本部分

HTML::FormatText::WithLinks可以轻松提供 HTML 电子邮件的纯文本版本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
my $html = template $template, $tokens, { layout => 'email' };

my $f = HTML::FormatText::WithLinks->new;
my $text = $f->parse($html);

email {
from => 'foo@perl.dance',
to => 'bar@perl.dance',
subject => 'Welcome to the dancefloor!',
body => $text,
attach => {
Data => $html,
Type => "text/html"
},
multipart => 'alternative',
};

配置

传输

在后台,插件使用 Email::Sender,因此你可以使用其传输而不是“sendmail”(本地邮件服务器)。

这只是调整配置的问题:

1
2
3
4
5
6
7
8
9
plugins:
Email:
transport:
SMTP:
ssl: 1
host: 'mail.perl.dance'
port: 465
sasl_username: 'foo@perl.dance'
sasl_password: 'nevairbe'

在开发过程中,你希望阻止电子邮件发送给真实用户

这可以通过Redirect传输来完成:

1
2
3
4
5
plugins:
Email:
transport:
Sendmail:
redirect_address: racke@perl.dance

所有电子邮件都将发送到特定地址,但添加了原始收件人的额外标题:

1
2
X-Intercepted-To: "Bar" <bar@perl.dance>
X-Intercepted-Cc: "Baz" <baz@perl.dance>

Preseed标题

如果你有标准的电子邮件地址和/或你想要额外的电子邮件headeers,你也可以在配置中指定这些:

1
2
3
4
5
plugins:
Email:
sender: "2019@perl.dance"
from: "Perl Dancer Conference 2019 <2019@perl.dance>"
X-Mailer: "PerlDance2018 4.0"

作者

本文由racke为2018年的Perl Dancer Advent Calendar编写。