play框架使用起來(17)

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章