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

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

原文地址:https://www.cnblogs.com/chenying99/p/2539120.html