play 使用 Apache Commons Email 库来实现邮件功能。使用 play.libs.Mail 工 具箱来发送邮件非常容易。
简单邮件示例:
SimpleEmail email = new SimpleEmail();
email.setFrom("sender@zenexity.fr");
email.addTo("recipient@zenexity.fr");
email.setSubject("subject");
email.setMsg("Message");
Mail.send(email);
HTML e-mail 示例:
HtmlEmail email = new HtmlEmail();
email.addTo("info@lunatech.com");
email.setFrom(sender@lunatech.com", "Nicolas");
email.setSubject("Test email with inline image");
// 获取内容 ID,并嵌入图片
URL url = new
URL("http://www.zenexity.fr/wp-content/themes/images/logo.png");
String cid = email.embed(url, "Zenexity logo");
//设置 html 消息
email.setHtmlMsg("<html>Zenexity logo - <img
src=\"cid:"+cid+"\"></html>");
//设置可选消息
email.setTextMsg("Your email client does not support HTML, too bad :(");
更多信息见 Commons Email documentation。
14.1. Mail 和 MVC 集成
使用标准的模板机制和语法,也可发送复杂的和动态的邮件。
首先在应用程序里定义一个 Mailer notifier。mailer notifier 必须是 play.mvc.Mailer 的子类,而且包名必须是 notifiers 或其子包。
其次,每个 e-mail sender 的方法都必须是 public static 的,这个 MVC 控制的 动作相似:
package notifiers;
import play.*;
import play.mvc.*;
import java.util.*;
public class Mails extends Mailer {
public static void welcome(User user) {
setSubject("Welcome %s", user.name);
addRecipient(user.email);
setFrom("Me <me@me.com>");
EmailAttachment attachment = new EmailAttachment();
attachment.setDescription("A pdf document");
attachment.setPath(Play.getFile("rules.pdf").getPath());
addAttachment(attachment);
send(user);
}
public static void lostPassword(User user) {
String newpassword = user.password;
setFrom("Robot <robot@thecompany.com>");
setSubject("Your password has been reset");
addRecipient(user.email);
send(user, newpassword);
}
}
text/html e-mail
调用 send 方法将会渲染 app/views/Mails/welcome.html 模板作为邮件消息体。
<html><body><p>Welcome <b>${user.name}</b>, </p>
...
</html>
lostPassword 方法的模板代码:
app/views/Mails/lostPassword.html
<html>
<body><head>...</head><body>
<img src="mycompany.com/images"/>
<p>
Hello ${user.name}, Your new password is <b>${newpassword}</b>.
</p>
</body>
</html>
text/plain e-mail
如果没有定义 HTML 模板,那么 text/plain 邮件将使用 text 模板进行发送。
调用 send 方法将会渲染 app/views/Mails/welcome.txt 模板作为邮件消息体。
Welcome ${user.name},
...
lostPassword 方法的模板应该是这个样子:
app/views/Mails/lostPassword.txt
Hello ${user.name},
Your new password is ${newpassword}.
text/html e-mail with text/plain alternative
如果 HTML 模板已经定义,同时又存在 text 模板,那么 text 模板将用于可选消息。在上一个示例里,如果 app/views/Mails/lostPassword.html 和app/views/Mails/lostPassword.txt 都已定义,那么在发送邮件时默认将用lostPassword.html 模板以 text/html 方式发送, 同时可自由选择 lostPassword.txt 模板。因此你可以向好朋友用友好的 HMTL 模板,而对待讨厌的人可以选择使用 text 模板。
在应用程序里链接到邮件
使用如下语法可在应用程序里链接到邮件:
@@{application.index}
如果要从 job 里发送邮件, 就必须为应用程序设置 application.baseUrl 为一个有效的基于 URL 的地址。
比如,从运行于 play 站点的一个 Job 发送邮件,其配置应该是这样的:
application.baseUrl=http://www.playframework.org/
14.2. SMTP 配置
邮件功能可通过配置多个 mail configuration 属性开启:
- SMTP server – mail.smtp.host
- SMTP server 验证 – mail.smtp.user 和 mail.smtp.pass
- 加密通道 – mail.smtp.channel
- JavaMail SMTP 登录事务 – mail.debug.
下面两个配置用于让你重载默认的行为:
- mail.smtp.socketFactory.class
- mail.smtp.port
默认情况下,在 DEV 模式时,邮件将打印到控制台,在 PROD 模板下,将会真正发送到真实的 SMTP server。在 DEV 模式下通过注释下面的配置也可改变默认的行为:
# Default is to use a mock 模拟 Mailer
mail.smtp=mock
使用 Gmail
为了使用 Gmail 的服务器,你需要作如下配置:
mail.smtp.host=smtp.gmail.com
mail.smtp.user=yourGmailLogin
mail.smtp.pass=yourGmailPassword
mail.smtp.channel=ssl