• 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

  • 相关阅读:
    pexpect库学习之包装类详解
    spawn类expect方法详解
    spawn类参数command详解
    Django中如何实现数据库路由?
    Memcached中的存取命令详解
    Javascript的参数详解
    Python中Paramiko协程方式详解
    Greenlets间如何实现互相通信?
    Gevent中的同步与异步详解
    jQuery正则的使用方法步骤详解
  • 原文地址:https://www.cnblogs.com/chenying99/p/2539120.html
Copyright © 2020-2023  润新知