1、郵件功能
在Web應用程序的開發中,經常會有處理郵件的需求。Play的play.libs.Mail輔助類爲我們提供了方便的發送電子郵件的支持。下例代碼演示如何使用Play發送簡單的文本郵件:
SimpleEmail email = new SimpleEmail();
// 郵件發送者
email.setFrom("[email protected]");
// 郵件接收者
email.addTo("[email protected]");
// 郵件主題
email.setSubject("subject");
// 郵件內容
email.setMsg("Message");
Mail.send(email);
下例代碼演示如何使用Play發送HTML格式郵件:
HtmlEmail email = new HtmlEmail();
email.addTo("[email protected]");
email.setFrom("[email protected]", "Nicolas");
email.setSubject("Test email with inline image");
// 在郵件中嵌入圖片
URL url = new URL("http://www.zenexity.fr/public/images/layout/logo.png");
String cid = email.embed(url, "Zenexity logo");
// 設置HTML郵件內容
email.setHtmlMsg("<html>Zenexity logo - <img src=\"cid:"+cid+"\"></html>");
// 設置郵箱不支持HTML郵件提示
email.setTextMsg("Your email client does not support HTML, too bad :(");
Mail.send(email);
HTML是網頁格式,以HTML格式發送郵件,對方接收到的郵件將會以頁面形式顯示。
1.1 郵件和MVC集成#
Play還可以使用JavaMail標準的模板機制和語法發送複雜的、動態的電子郵件。
首先,我們需要爲應用程序創建Mailer類。創建的Mailer類存放在notifiers包下,並繼承於play.mvc.Mailer類。Mailer類中每個公共靜態方法都是郵件發送者,類似MVC中的控制器的角色:
package notifiers;
import play.*;
import play.mvc.*;
import java.util.*;
import org.apache.commons.mail.EmailAttachment;
import models.*;
public class Mails extends Mailer {
public static void welcome(User user) {
// 郵件主題
setSubject("Welcome %s", user.name);
// 郵件接收者
addRecipient(user.email);
// 郵件發送者
setFrom("Me <[email protected]>");
// 添加附件
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 <[email protected]>");
setSubject("Your password has been reset");
addRecipient(user.email);
send(user, newpassword);
}
}
以HTML模板渲染郵件
我們通常採用HTML模板作爲郵件體進行推送。上例welcome Action調用的send()方法會以app/views/Mails/welcome.html模板作爲e-mail消息體進行渲染。因此,我們需要在app/views/Mails/目錄下創建welcome.html模板:
<html>
<body>
<p>Welcome <b>${user.name}</b>.</p>
</body>
</html>
而lostPassword Action調用的模板爲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>
以純文本渲染郵件
如果不存在對應的HTML模板,框架默認以純文本模板形式推送電子郵件。當控制器調用send()方法時,Play以app/views/Mails/welcome.txt模板作爲e-mail消息體渲染:
Welcome ${user.name},
...
而lostPassword()方法對應的純文本模板爲app/views/Mails/lostPassword.txt:
Hello ${user.name},
Your new password is ${newpassword}.
如果同時存在HTML模板和純文本模板,那麼純文本模板將被視爲可選。在前面的例子中,如果app/views/Mails/lostPassword.html模板和app/views/Mails/lostPassword.txt模板同時存在,那麼該電子郵件將以lostPassword.html模板(text/html形式)進行渲染,lostPassword.txt模板將被視爲可選的方式。在應用中推薦以HMTL格式發送電子郵件。
通過e-mail連接應用程序
使用@@{}標籤可以在郵件中包含應用程序的連接:
<html>
<body>
<p>Welcome <b>${user.name}</b>.</p>
<a href="@@{application.index}">link</a>
</body>
</html>
如果使用Job發送e-mail,需要在application.conf文件中配置application.baseUrl選項。application.baseUrl的值必須是合法的外部baseurl(對應於應用程序)。如playframework.org官方網站使用內部Job發送e-mail,application.baseUrl需進行如下配置:
application.baseUrl=http://www.playframework.org/
1.2 SMTP 配置#
在我們使用Play的郵件功能之前,需要在conf/application.conf文件中定義SMTP服務器地址:
mail.smtp.host=smtp.taldius.net
如果該SMTP服務器需要認證,則添加用戶名密碼屬性配置:
mail.smtp.user=username
mail.smtp.pass=password
配置通道和端口
電子郵件在網絡上是以明文方式傳輸的,在傳輸過程中並沒有提供加密服務。直接將郵件暴露在互聯網上非常危險,攻擊者可以輕易截獲用戶的私密信息。Play提供兩種信道加密發送郵件的方式。
如果服務器支持starttls命令(見協議: RFC 2487),通過25端口與服務器建立連接可以直接切換至SSL/TLS模式,具體配置如下:
mail.smtp.channel=starttls
如果服務器支持的是SMTP-over-SSL(SMTPS)連接,通常SSL socket會在465端口進行監聽。針對這種情況Play的具體配置如下:
mail.smtp.channel=ssl
1.3 更多配置項#
默認情況下,Play使用JavaMail執行SMTP事務。如果需要查看它是如何運行的,可以添加如下配置:
mail.debug=true
當通過JavaMail建立SSL連接時,如果遠程服務器不是由根證書(root certificate)進行簽名,SSL默認會將其丟棄。以下屬性配置對該選項進行控制:
mail.smtp.socketFactory.class
使用自簽證書(self-signed certificate)時,Play的默認行爲是跳過該連接檢查。
如果讀者需要自定義連接服務器的端口,可以配置以下屬性進行端口控制:
mail.smtp.port=2500
1.4 使用Gmail#
我們以Gmail作爲郵件服務器爲例,介紹具體的SMTP配置選項:
mail.smtp.host=smtp.gmail.com
mail.smtp.user=yourGmailLogin
mail.smtp.pass=yourGmailPassword
mail.smtp.channel=ssl