play框架使用起来(17)
2016-11-04 17:25
441 查看
1、邮件功能
在Web应用程序的开发中,经常会有处理邮件的需求。Play的play.libs.Mail辅助类为我们提供了方便的发送电子邮件的支持。下例代码演示如何使用Play发送简单的文本邮件:
下例代码演示如何使用Play发送HTML格式邮件:
补充:
HTML是网页格式,以HTML格式发送邮件,对方接收到的邮件将会以页面形式显示。
Play还可以使用JavaMail标准的模板机制和语法发送复杂的、动态的电子邮件。
首先,我们需要为应用程序创建Mailer类。创建的Mailer类存放在notifiers包下,并继承于play.mvc.Mailer类。Mailer类中每个公共静态方法都是邮件发送者,类似MVC中的控制器的角色:
以HTML模板渲染邮件
我们通常采用HTML模板作为邮件体进行推送。上例welcome Action调用的send()方法会以app/views/Mails/welcome.html模板作为e-mail消息体进行渲染。因此,我们需要在app/views/Mails/目录下创建welcome.html模板:
而lostPassword Action调用的模板为app/views/Mails/lostPassword.html,我们也为此创建相应的模板:
以纯文本渲染邮件
如果不存在对应的HTML模板,框架默认以纯文本模板形式推送电子邮件。当控制器调用send()方法时,Play以app/views/Mails/welcome.txt模板作为e-mail消息体渲染:
而lostPassword()方法对应的纯文本模板为app/views/Mails/lostPassword.txt:
如果同时存在HTML模板和纯文本模板,那么纯文本模板将被视为可选。在前面的例子中,如果app/views/Mails/lostPassword.html模板和app/views/Mails/lostPassword.txt模板同时存在,那么该电子邮件将以lostPassword.html模板(text/html形式)进行渲染,lostPassword.txt模板将被视为可选的方式。在应用中推荐以HMTL格式发送电子邮件。
通过e-mail连接应用程序
使用@@{}标签可以在邮件中包含应用程序的连接:
如果使用Job发送e-mail,需要在application.conf文件中配置application.baseUrl选项。application.baseUrl的值必须是合法的外部baseurl(对应于应用程序)。如playframework.org官方网站使用内部Job发送e-mail,application.baseUrl需进行如下配置:
在我们使用Play的邮件功能之前,需要在conf/application.conf文件中定义SMTP服务器地址:
如果该SMTP服务器需要认证,则添加用户名密码属性配置:
配置通道和端口
电子邮件在网络上是以明文方式传输的,在传输过程中并没有提供加密服务。直接将邮件暴露在互联网上非常危险,攻击者可以轻易截获用户的私密信息。Play提供两种信道加密发送邮件的方式。
如果服务器支持starttls命令(见协议: RFC 2487),通过25端口与服务器建立连接可以直接切换至SSL/TLS模式,具体配置如下:
如果服务器支持的是SMTP-over-SSL(SMTPS)连接,通常SSL socket会在465端口进行监听。针对这种情况Play的具体配置如下:
默认情况下,Play使用JavaMail执行SMTP事务。如果需要查看它是如何运行的,可以添加如下配置:
当通过JavaMail建立SSL连接时,如果远程服务器不是由根证书(root certificate)进行签名,SSL默认会将其丢弃。以下属性配置对该选项进行控制:
补充:
使用自签证书(self-signed certificate)时,Play的默认行为是跳过该连接检查。
如果读者需要自定义连接服务器的端口,可以配置以下属性进行端口控制:
我们以Gmail作为邮件服务器为例,介绍具体的SMTP配置选项:
在Web应用程序的开发中,经常会有处理邮件的需求。Play的play.libs.Mail辅助类为我们提供了方便的发送电子邮件的支持。下例代码演示如何使用Play发送简单的文本邮件:
SimpleEmail email = new SimpleEmail(); // 邮件发送者 email.setFrom("sender@zenexity.fr"); // 邮件接收者 email.addTo("recipient@zenexity.fr"); // 邮件主题 email.setSubject("subject"); // 邮件内容 email.setMsg("Message"); Mail.send(email);
下例代码演示如何使用Play发送HTML格式邮件:
HtmlEmail email = new HtmlEmail(); email.addTo("info@lunatech.com"); email.setFrom("sender@lunatech.com", "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 <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); } }
以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
相关文章推荐
- play框架使用起来(7)
- play框架使用起来(8)
- play框架使用起来(13)
- play框架使用起来(11)
- play框架使用起来(15)
- play框架使用起来(18)
- play框架使用起来(6)
- play框架使用起来(12)
- play框架使用起来(5)
- play框架使用起来(16)
- play框架使用起来(10)
- play框架使用起来(14)-高级指南
- Swift教程17-淡化MVC,使用MVVM框架开发轻巧便于维护的iOS app
- Yii框架官方指南系列17——使用表单:创建模型
- play使用起来(4)
- play框架用起来(9)
- Swift教程17-淡化MVC,使用MVVM框架开发轻巧便于维护的iOS app
- 使用play框架来解析json字符串
- play框架用起来(2)
- play框架用起来(1)