spring对邮件发送支持的很好,我们只要配置好邮件发送器,写好邮件发送具体操作类的方法,那么实现就不是很难的事,不过这个过程中经常会出现这样或那样的错误,所以待讲完本篇后我会总体总结下spring邮件发送容易发生的错误及解决办法

关于邮件发送,不外乎有这么几种情况,一种是纯文本的发送,一种是HTML形式的发送,一种就是发送时带有附件,一种就是发送时采取的事群发,针对这几个我将一一来讲下,我的代码中将第一中归为一大类,后面三种归为一代类,所以将会出现两种配置文件

第一大类邮件发送【纯文本发送】

必须包:spring.jar,common-logging.jar,mail.jar,servlet.jar,common-collection.jar

首先我们来看spring配置文件applicationContext.xml

Xml代码  
  1. <span style="font-size: medium;"><?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
  4. xmlns:tx="http://www.springframework.org/schema/tx"
  5. xsi:schemaLocation="
  6. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  7. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
  8. http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
  9. <!--定义邮件发送器,配置好发送者详细信息-->
  10. <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
  11. <property name="host" value="smtp.163.com" />
  12. <property name="port" value="25" />
  13. <property name="username" value="emailusername" />
  14. <property name="password" value="emailpassword" />
  15. <property name="defaultEncoding" value="utf-8" />
  16. <property name="javaMailProperties">
  17. <props>
  18. <prop key="mail.smtp.auth">true</prop>
  19. </props>
  20. </property>
  21. </bean>
  22. <bean id="emailService" class="com.javacrazyer.comon.SendOrderConfirmationEmailAdvice">
  23. <property name="mailSender" ref="mailSender" />
  24. </bean>
  25. </beans></span>

用到的实体类Order.java

Java代码  
  1. <span style="font-size: medium;">package com.javacrazyer.comon;
  2. import java.io.Serializable;
  3. public class Order implements Serializable {
  4. /* Private Fields */
  5. private int orderId;
  6. private String username;
  7. private String useremail;
  8. public int getOrderId() {
  9. return orderId;
  10. }
  11. public void setOrderId(int orderId) {
  12. this.orderId = orderId;
  13. }
  14. public String getUsername() {
  15. return username;
  16. }
  17. public void setUsername(String username) {
  18. this.username = username;
  19. }
  20. public String getUseremail() {
  21. return useremail;
  22. }
  23. public void setUseremail(String useremail) {
  24. this.useremail = useremail;
  25. }
  26. }
  27. </span>

邮件发送类的接口类MailService.java

Java代码  
  1. <span style="font-size: medium;">package com.javacrazyer.comon;
  2. /**
  3. * 使用Spring发送邮件
  4. *
  5. */
  6. public interface MailService {
  7. void sendOrderMail(Order order);
  8. }
  9. </span>

具体实现的邮件发送类SendOrderConfirmationEmailAdvice.java

Java代码  
  1. <span style="font-size: medium;">package com.javacrazyer.comon;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import org.springframework.mail.MailSender;
  6. import org.springframework.mail.SimpleMailMessage;
  7. public class SendOrderConfirmationEmailAdvice implements MailService{
  8. private String from="emailusername@163.com"; //发送人邮箱地址,必须与spring配置文件中的邮箱地址一样
  9. private String registeTemplateName = "com/javacrazyer/comon/mail_registe.txt";
  10. private MailSender mailSender;
  11. public void setMailSender(MailSender mailSender) {
  12. this.mailSender = mailSender;
  13. }
  14. public void sendOrderMail(Order order) {
  15. //SimpleMialMessage只能用来发送TEXT格式的邮件
  16. SimpleMailMessage mail = new SimpleMailMessage();
  17. mail.setFrom(this.from);
  18. mail.setTo(order.getUseremail());
  19. mail.setSubject("恭喜你成功注册成为SOMEDAY商城的会员!");
  20. mail.setText(loadTemplateContent(registeTemplateName).replaceAll("\\$\\{LOGINNAME\\}", order.getUsername()));
  21. this.mailSender.send(mail);
  22. }
  23. private String loadTemplateContent(String templateName){
  24. StringBuilder sb = new StringBuilder();
  25. BufferedReader br= null;
  26. try{
  27. br = new BufferedReader(
  28. new InputStreamReader(
  29. Thread.currentThread()
  30. .getContextClassLoader()
  31. .getResourceAsStream(templateName), "UTF-8"));
  32. String lineSeparator = System.getProperty("line.separator");
  33. for(String str = null; (str = br.readLine()) != null;){
  34. sb.append(str);
  35. sb.append(lineSeparator);
  36. }
  37. }catch(IOException e){
  38. e.printStackTrace();
  39. }finally{
  40. if(br != null){
  41. try {
  42. br.close();
  43. } catch (IOException e) {
  44. e.printStackTrace();
  45. }
  46. }
  47. }
  48. return sb.toString();
  49. }
  50. }</span>

用到的mail_registe.txt

Java代码  
  1. <span style="font-size: medium;">亲爱的${LOGINNAME}:您好!
  2. 恭喜你成为SOMEDAY商城的会员!
  3. 你的登录用户名为:${LOGINNAME}
  4. 你的登录口令为:******(隐藏)
  5. 本站网址:http://www.yoursitename.cn
  6. 联系邮箱:hr@yoursite.cn</span>

测试发送

Java代码  
  1. <span style="font-size: medium;">package com.javacrazyer.service.test;
  2. import org.junit.Test;
  3. import org.springframework.context.ApplicationContext;
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;
  5. import com.javacrazyer.comon.MailService;
  6. import com.javacrazyer.comon.Order;
  7. public class UserServiceTest {
  8. @Test
  9. public void test() throws InterruptedException {
  10. ApplicationContext context = new ClassPathXmlApplicationContext(
  11. "applicationContext.xml");
  12. MailService sf = (MailService) context.getBean("emailService");
  13. Order order = new Order();
  14. order.setUsername("cheneywu");
  15. order.setUseremail("xxxxxx@qq.com");
  16. sf.sendOrderMail(order);
  17. }
  18. }</span>

注意查收邮箱中的信息哦

第二大类邮件发送【HTML格式的发送,群发,附件】

除了上面包外,还需要spring-webmvc.jar,freemarker.jar,为什么需要freemarker呢,因为要发送HTML格式的 文件,所以要先写好HTML内容的文件,然后用模板freemarker匹配其中的值,Spring中对freemarker也有很好的支持

spring配置文件applicatonContext-html.xml

Xml代码  
  1. <span style="font-size: medium;"><?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
  4. xmlns:tx="http://www.springframework.org/schema/tx"
  5. xsi:schemaLocation="
  6. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  7. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
  8. http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
  9. <bean id="freeMarker"
  10. class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
  11. <property name="templateLoaderPath" value="classpath:mailTemplate" />
  12. <!--指定模板文件目录-->
  13. <property name="freemarkerSettings"><!-- 设置FreeMarker环境属性-->
  14. <props>
  15. <prop key="template_update_delay">1800</prop><!--刷新模板的周期,单位为秒-->
  16. <prop key="default_encoding">UTF-8</prop><!--模板的编码格式 -->
  17. <prop key="locale">zh_CN</prop><!-- 本地化设置-->
  18. </props>
  19. </property>
  20. </bean>
  21. <!-- 注意:这里的参数(如用户名、密码)都是针对邮件发送者的 -->
  22. <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
  23. <property name="host" value="smtp.163.com" />
  24. <property name="port" value="25" />
  25. <property name="username" value="emailusername" />
  26. <property name="password" value="emailpassword" />
  27. <property name="defaultEncoding" value="utf-8" />
  28. <property name="javaMailProperties">
  29. <props>
  30. <prop key="mail.smtp.auth">true</prop>
  31. </props>
  32. </property>
  33. </bean>
  34. <bean id="emailService" class="com.javacrazyer.comon.EmailService">
  35. <property name="mailSender" ref="mailSender"></property>
  36. <property name="freeMarkerConfigurer" ref="freeMarker"></property>
  37. </bean>
  38. </beans>    </span>

模板文件目mailTemplate下的模板文件registe.ftl 【这个文件无名字、后缀无所谓,只要内容是HTML内容即可】

Html代码  
  1. <span style="font-size: medium;"><html>
  2. <head>
  3. <meta http-equiv="content-type" content="text/html;charset=utf8">
  4. </head>
  5. <body>
  6. 恭喜您成功注册!您的用户名为:<font color='red' size='30'>${LOGINNAME}</font>
  7. </body>
  8. </html>  </span>

具体邮件发送类EmailService.java

Java代码  
  1. <span style="font-size: medium;">package com.javacrazyer.comon;
  2. import java.io.File;
  3. import java.io.UnsupportedEncodingException;
  4. import java.util.HashMap;
  5. import java.util.List;
  6. import java.util.Map;
  7. import javax.mail.Message;
  8. import javax.mail.MessagingException;
  9. import javax.mail.internet.InternetAddress;
  10. import javax.mail.internet.MimeMessage;
  11. import javax.mail.internet.MimeUtility;
  12. import org.springframework.mail.MailSender;
  13. import org.springframework.mail.javamail.JavaMailSender;
  14. import org.springframework.mail.javamail.MimeMessageHelper;
  15. import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
  16. import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
  17. import freemarker.template.Template;
  18. public class EmailService implements MailService {
  19. private JavaMailSender mailSender;
  20. private FreeMarkerConfigurer freeMarkerConfigurer = null; // FreeMarker的技术类
  21. public void setMailSender(JavaMailSender mailSender) {
  22. this.mailSender = mailSender;
  23. }
  24. public void setFreeMarkerConfigurer(
  25. FreeMarkerConfigurer freeMarkerConfigurer) {
  26. this.freeMarkerConfigurer = freeMarkerConfigurer;
  27. }
  28. /**
  29. * 发送带模板的单个html格式邮件
  30. */
  31. public void sendOrderMail(Order order) {
  32. MimeMessage msg = mailSender.createMimeMessage();
  33. // 设置utf-8或GBK编码,否则邮件会有乱码,true表示为multipart邮件
  34. try {
  35. MimeMessageHelper helper = new MimeMessageHelper(msg, true, "utf-8");
  36. helper.setTo(order.getUseremail()); // 邮件接收地址
  37. helper.setFrom("emailusername@163.com"); // 邮件发送地址,这里必须和xml里的邮件地址相同一致
  38. helper.setSubject("你好,恭喜你注册成功"); // 主题
  39. String htmlText;
  40. htmlText = getMailText(order.getUsername());
  41. helper.setText(htmlText, true); // 邮件内容,注意加参数true,表示启用html格式
  42. } catch (Exception e) {
  43. // TODO Auto-generated catch block
  44. e.printStackTrace();
  45. } // 使用模板生成html邮件内容
  46. mailSender.send(msg); // 发送邮件
  47. }
  48. /**
  49. * 批量发送带附件的html格式邮件,带附件
  50. */
  51. public void sendBatchEmail(Order order, List<String> address) {
  52. MimeMessage msg = mailSender.createMimeMessage();
  53. try {
  54. MimeMessageHelper helper = new MimeMessageHelper(msg, true, "utf-8");
  55. String toList = getMailList(address);
  56. InternetAddress[] iaToList = new InternetAddress().parse(toList);
  57. msg.setRecipients(Message.RecipientType.TO, iaToList);
  58. helper.setFrom("emailusername@163.com");
  59. helper.setSubject("你好,恭喜你注册成功");
  60. String htmlText = getMailText(order.getUsername());
  61. helper.setText(htmlText, true);
  62. // 添加内嵌文件,第1个参数为cid标识这个文件,第2个参数为资源
  63. helper.addInline("a", new File("E:/11.jpg")); // 附件内容
  64. helper.addInline("b", new File("E:/12.jpg"));
  65. File file = new File("E:/各种框架图介绍.docx");
  66. // 这里的方法调用和插入图片是不同的,使用MimeUtility.encodeWord()来解决附件名称的中文问题
  67. helper.addAttachment(MimeUtility.encodeWord(file.getName()), file);
  68. } catch (MessagingException e) {
  69. // TODO Auto-generated catch block
  70. e.printStackTrace();
  71. } catch (UnsupportedEncodingException e) {
  72. // TODO Auto-generated catch block
  73. e.printStackTrace();
  74. } catch (Exception e) {
  75. // TODO Auto-generated catch block
  76. e.printStackTrace();
  77. }
  78. // 如果主题出现乱码,可以使用该函数,也可以使用下面的函数
  79. // helper.setSubject(MimeUtility.encodeText(String text,String
  80. // charset,String encoding))
  81. // 第2个参数表示字符集,第三个为目标编码格式。
  82. // MimeUtility.encodeWord(String word,String charset,String encoding)
  83. mailSender.send(msg);
  84. }
  85. /**
  86. * 集合转换字符串
  87. */
  88. public String getMailList(List<String> to) {
  89. StringBuffer toList = new StringBuffer();
  90. int length = to.size();
  91. if (to != null && length < 2) {
  92. toList.append(to.get(0));
  93. } else {
  94. for (int i = 0; i < length; i++) {
  95. toList.append(to.get(i));
  96. if (i != (length - 1)) {
  97. toList.append(",");
  98. }
  99. }
  100. }
  101. return toList.toString();
  102. }
  103. // 通过模板构造邮件内容,参数content将替换模板文件中的${content}标签。
  104. private String getMailText(String content) throws Exception {
  105. String htmlText = "";
  106. // 通过指定模板名获取FreeMarker模板实例
  107. Template tpl = freeMarkerConfigurer.getConfiguration().getTemplate(
  108. "registe.ftl");
  109. Map map = new HashMap(); // FreeMarker通过Map传递动态数据
  110. map.put("LOGINNAME", content); // 注意动态数据的key和模板标签中指定的属性相匹配
  111. // 解析模板并替换动态数据,最终content将替换模板文件中的${content}标签。
  112. htmlText = FreeMarkerTemplateUtils.processTemplateIntoString(tpl, map);
  113. return htmlText;
  114. }
  115. }</span>

单一发送HTML格式的邮件测试

Java代码  
  1. <span style="font-size: medium;">package com.javacrazyer.service.test;
  2. import org.junit.Test;
  3. import org.springframework.context.ApplicationContext;
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;
  5. import com.javacrazyer.comon.MailService;
  6. import com.javacrazyer.comon.Order;
  7. public class UserServiceTest {
  8. @Test
  9. public void test() throws InterruptedException {
  10. ApplicationContext context = new ClassPathXmlApplicationContext(
  11. "applicationContext-html.xml");
  12. MailService sf = (MailService) context.getBean("emailService");
  13. Order order = new Order();
  14. order.setUsername("cheneywu");
  15. order.setUseremail("xxxxxx@qq.com");
  16. sf.sendOrderMail(order);
  17. }
  18. }
  19. </span>

收到邮件了

群发,带附件的测试

Java代码  
  1. <span style="font-size: medium;">package com.javacrazyer.service.test;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import org.junit.Test;
  5. import org.springframework.context.ApplicationContext;
  6. import org.springframework.context.support.ClassPathXmlApplicationContext;
  7. import com.javacrazyer.comon.EmailService;
  8. import com.javacrazyer.comon.Order;
  9. public class UserServiceTest {
  10. @Test
  11. public void test() throws InterruptedException {
  12. ApplicationContext context = new ClassPathXmlApplicationContext(
  13. "applicationContext-html.xml");
  14. EmailService sf = (EmailService) context.getBean("emailService");
  15. Order order = new Order();
  16. order.setUsername("cheneywu");
  17. List<String> maillist = new ArrayList<String>();
  18. maillist.add("XXXXXX@qq.com");
  19. maillist.add("YYYYYY@qq.com");
  20. sf.sendBatchEmail(order, maillist);
  21. }
  22. }
  23. </span>

收到邮件了哦


 看到了没有,这个上边有两个接收人,下边的是附件

转载于:https://www.cnblogs.com/jiangyaqiong/p/3433365.html

spring邮件发送(转)相关推荐

  1. spring邮件发送带抄送和附件

    1.近期做项目遇到了发邮件的需求.发邮件要求:多抄送.附件,话不多说,直接上代码: public class SendAttachmentMail {// Spring的邮件工具类,实现了MailSe ...

  2. 使用Spring实现邮件发送

    2019独角兽企业重金招聘Python工程师标准>>> 这两天写个小程序需要使用邮件发送的功能,在网上搜索了一帮子文章,感觉还是使用Spring的邮件发送功能比较方便,哈哈,懒人就这 ...

  3. 邮件发送 --- 纯Java、JavaWeb、Spring三种实现方式

    邮件发送学习笔记~ 一.邮件发送介绍 要在网络上实现邮件功能,必须要有专门的邮件服务器! 这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中! ...

  4. java邮件支持_使用Spring的JAVA Mail支持简化邮件发送功能

    闲来无事,翻看<Spring in Action>,发现Spring集成了对JAVA Mail的支持,有点小激动的看了一遍,嗯,话说真的简单了很多. Spring的邮件发送的核心是Mail ...

  5. spring各种邮件发送

    参考地址一 参考地址二 参考地址三 参考地址四 Spring邮件抽象层的主要包为org.springframework.mail.它包括了发送电子邮件的主要接口MailSender,和值对象Simpl ...

  6. 使用spring mail发送html邮件

    为什么80%的码农都做不了架构师?>>>    序 本文展示一下如何使用spring mail来发送html邮件. maven <!-- email --><dep ...

  7. Spring - Java/J2EE Application Framework 应用框架 第 17 章 使用Spring邮件抽象层发送Email

    第 17 章 使用Spring邮件抽象层发送Email 17.1. 简介 Spring提供了一个发送电子邮件的高级抽象层,它向用户屏蔽了底层邮件系统的一些细节,同时负责低层次的代表客户端的资源处理. ...

  8. ssh项目实战----Spring计时器任务 Spring整合JavaMail(邮件发送)

    一.常用数据频度维护 对于系统使用度较高的数据,客户在查看时希望这些数据最好先出现,此时需要为其添加排序规则.在进行排序时,使用次数成为排序的依据.因此需要设置一个字段用来描述某种数据的使用次数,也就 ...

  9. 【struts2+hibernate+spring项目实战】Spring计时器任务 Spring整合JavaMail(邮件发送)(ssh)

    一.常用数据频度维护 对于系统使用度较高的数据,客户在查看时希望这些数据最好先出现,此时需要为其添加排序规则.在进行排序时,使用次数成为排序的依据.因此需要设置一个字段用来描述某种数据的使用次数,也就 ...

最新文章

  1. 12岁AI开发者现身DuerOS发布会:得开发者得天下
  2. java webstart 自动升级_windows – 使用java web start实现自动更新桌面应用程序时的AWTPermission异常...
  3. @excel 注解_7 行代码实现 Excel 文件导出
  4. c语言中tgx是什么函数,《高等数学》课后练习题
  5. python随机数生成验证码_Python随机数random模块学习,并实现生成6位验证码
  6. Vue.js 极简小例:读值、样式调用、if判断、a 标签、点击事件、管道
  7. 【从入门到放弃-ZooKeeper】ZooKeeper实战-分布式队列
  8. 准确率(Accuracy), 精确率(Precision), 召回率(Recall)和F1-Measure(对于二分类问题)
  9. CDH5.16.2下载安装
  10. Jeewx-Boot 1.0.3 版本发布,基于SpringBoot的免费微信管家平台
  11. 《成为顶级JAVA架构师的必备书籍》
  12. 心酸 | Bean复制的几种框架对比,看完心酸
  13. java regex 正则表达式 提取数字和去除数字,过滤数字,提取价格
  14. Clojure 学习入门(14)- 循环控制
  15. spring---aop(10)---Spring AOP中AspectJ
  16. 使用CleanWipe卸载Symantec Endpoint Protection
  17. SSM框架讲解(史上最详细的文章)
  18. word文档如何插入目录
  19. 校招-蘑菇街,阿里面试总结
  20. 如何防止恶意扫码点餐

热门文章

  1. linux 写地址 hex,你怎么理解Hex文件? (扩展地址记录)
  2. kali无法共享本机文件_MySQL服务端读取客户端文件漏洞的复现
  3. CSS(网页样式语言)基础,网页CSS设计样式基础知识点 小白教程
  4. mysql查询所有姓王的信息_MySQL的查询练习
  5. Linux学习笔记---更新软件源
  6. 2021高通人工智能应用创新大赛踩坑指南
  7. 【转】QT实现不规则窗体
  8. Angular6入门
  9. 用Android Stuidio开发Flutter
  10. eclipse导入外部项目引发的错误以及解决方案