当前位置: 首页 > news >正文

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/archive/2012/06/07/2539120.html

相关文章:

  • java 并行 用happen-before规划重新审视DCL
  • 排序规则在全角与半角处理中的应用
  • 细节解密NDIS协议驱动为什么能捕获到发送包
  • Geofence是什么
  • 语音的前置处理(一)
  • 关于成都局2012年春运期间客票预售期调整的通知
  • 经典JavaScript正则表达式实战
  • [转载]给网游写一个挂吧(二) – 启动外挂上
  • 2012/6/19
  • Metro AppBarButtonStyles中按钮样式名称收集
  • [译]Kinect for Windows SDK开发入门(三):基础知识 下
  • 到底应该怎么样才能用上dropbox?
  • 优秀开发工具:推荐8个在线调试代码的网站
  • 应届生本人面试经历
  • IOS基本框架
  • 【EOS】Cleos基础
  • CSS 提示工具(Tooltip)
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • Flex布局到底解决了什么问题
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • Java Agent 学习笔记
  • leetcode-27. Remove Element
  • Linux后台研发超实用命令总结
  • Promise面试题2实现异步串行执行
  • Python爬虫--- 1.3 BS4库的解析器
  • Sass 快速入门教程
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • vue的全局变量和全局拦截请求器
  • windows下mongoDB的环境配置
  • 分布式任务队列Celery
  • 开源地图数据可视化库——mapnik
  • 那些被忽略的 JavaScript 数组方法细节
  • 如何进阶一名有竞争力的程序员?
  • 使用 Docker 部署 Spring Boot项目
  • 学习ES6 变量的解构赋值
  • 硬币翻转问题,区间操作
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • puppet连载22:define用法
  • 阿里云API、SDK和CLI应用实践方案
  • (23)Linux的软硬连接
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (汇总)os模块以及shutil模块对文件的操作
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (九十四)函数和二维数组
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (转) Face-Resources