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