您的位置:首页 > 编程语言 > Java开发

Spring最佳实践-9.1 集成邮件服务

2012-06-07 00:59 501 查看
91. 集成邮件服务

JavaMail API为Java应用程序提供了邮件发送和接受的服务。JavaMail提供了一个平台无关和协议无关的框架,可以在JavaMail API的基础上构建一套电子邮件应用。JavaMail支持常见的电子邮件协议,包括SMTP、IMAP和POP3。在JavaEE应用程序中,我们关心的是如何通过SMTP协议发送电子邮件,因此,本节仅讨论如何发送电子邮件,如果需要接受电子邮件使用POP3协议,同样非常简单。

9.11发送纯文本邮件

如果使用JavaMailAPI发送邮件,即使发送最简单的纯文本邮件,也不得不编写如下代码:

public static void send(Properties props,final String username,

final String password, String from, String[] to, String subject,

String text) throws MessagingException {

Session session = Session.getInstance(props, new Authenticator() {

public PasswordAuthentication getPasswordAuthentication() {

return new PasswordAuthentication(username, password);

}

});

session.setDebug(true);

Message message = new MimeMessage(session);

message.setFrom(new InternetAddress(from));

message.setSubject(subject);

message.setText(text);

message.setSentDate(new Date());

Address[] addressTo = new Address[to.length];

for (int i = 0; i < to.length; i++) {

addressTo[i] = new InternetAddress(to[i]);

}

message.setRecipients(Message.RecipientType.TO, addressTo);

message.saveChanges();

Transport.send(message, addressTo);

}

调用这个方法还需要准备一个Properties对象,下面的代码将使用QQ邮箱的SMTP服务发送邮件。

public static void sendTextMail() throws MessagingException {

// 直接使用JavaMail API:

Properties props = new Properties();

// 设置SMTP服务器:

props.put("mail.smtp.host","smtp.qq.com");

props.put("mail.smtp.port","465");

props.put("mail.smtp.auth","true");

// 使用SSL安全连接:

props.put("mail.smtp.starttls.enable","true");

props.put("mail.smtp.socketFactory.class",

"javax.net.ssl.SSLSocketFactory");

send(props, "654752907",//Username

"password", // Password

"654752907@qq.com",// From

new String[] {"shenzhen_zsw@163.com" },// To

"A test mail", // Subject

"测试使用JavaMail API发送邮件"// Text

);

}

这样的代码不仅冗长而且不便于封装为组件来服用。Spring提供了非常方便的Mail抽象层。它通过一个MailSender接口封装了邮件发送Bean,而SimpleMailMessage封装了纯文本的简单邮件,他是一个纯粹的POJO。

Spring的MailSender被设计为可插拔的接口,它支持两种邮件发送服务:标准的JavaMail和CosMail.通常我们使用标准的JavaMail即可。JavaMail的实现库并没有集成到JDK5.0中,需要手动从Sun的官方站点下载mail.jar和activation.jar者两个库。

然后编写config.xml配置文件,定义mailSender.Bean

<?xmlversion="1.0"encoding="UTF-8"?>

<beansxmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"
>

<!-- 配置MailSender -->

<beanid="mailSender"class="org.springframework.mail.javamail.JavaMailSenderImpl">

<propertyname="host"value="smtp.qq.com"/>

<propertyname="port"value="465"/>

<propertyname="username"value="654752907"/>

<propertyname="password"value="password"/>

<propertyname="javaMailProperties">

<props>

<propkey="mail.smtp.auth">true</prop>

<propkey="mail.smtp.starttls.enable">true</prop>

<propkey="mail.smtp.socketFactory.class">javax.net.ssl.SSLSocketFactory</prop>

</props>

</property>

</bean>

</beans>

发送邮件所需的所有SMTP配置都被注入到Bean中,我们编写测试程序,看看使用Spring提供的这个JavaMailSender发送邮件是多么的方便;

public static void javaMailSender() throws MessagingException{

// 使用Spring提供的MailSender:

ApplicationContext context = new ClassPathXmlApplicationContext("config.xml");

JavaMailSender mailSender = (JavaMailSender)context.getBean("mailSender");

// 创建一个纯文本邮件:

SimpleMailMessage mail = new SimpleMailMessage();

mail.setFrom("654752907@qq.com");

mail.setTo("shenzhen_zsw@163.com");

mail.setSubject("Another test mail");

mail.setText("测试使用Spring MailSender发送邮件");

// 发送:

mailSender.send(mail);

}

请修改收件人地址,然后运行测试程序,过几分钟后打开邮箱,可以看到接受到的纯文本邮件。

9.12发送MINME邮件

在JavaMail中发送带有附件的MimeMessage是非常麻烦的,需要构建Multipart和多个MimeBodyPart对象,而Spring提供了一个助手类MimeMessageHelper,能非常方便的操作MimeMessage。下面的例子演示了在获得了一个JavaMailSender Bean之后,通过MimeMessageHelper发送一个带有两个附件的HTML邮件。

// 发送Mime邮件:

MimeMessage mime = mailSender.createMimeMessage();

MimeMessageHelper helper =newMimeMessageHelper(mime,true,"UTF-8");

helper.setFrom("654752907@qq.com");

helper.setTo("shenzhen_zsw@163.com");

helper.setSubject("Test mime mail");

// 设定为HTML格式:

helper.setText("<html><body>访问Live在线书店:<br>"

+ "<a href='http://www.livebookstore.net' target='_blank'>"

+ "<img src='cid:logo'></a></body></html>",

true);

helper.addInline("logo", new ClassPathResource("logo.gif"));

helper.addAttachment("freebsd.gif",new ClassPathResource("freebsd.gif"));

// 发送:

mailSender.send(mime);

需要注意的一点的是,在添加附件的时候,如果需要将附件嵌入到HTML中显示,则<img>标签中用cid:xxx标记,对应的附件通过addInline()方法添加。

请修改收件人地址容纳后运行测试程序,稍后打开邮箱,可以以HTML格式看到页面和嵌入的Live在线书店Logo的图片。

9.1.3 Demo下载地址:http://download.csdn.net/detail/sz_bdqn/4243197
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: