- 浏览: 2991971 次
- 性别:
- 来自: 河南
文章分类
- 全部博客 (340)
- Java综合 (26)
- 程序人生 (53)
- RIA-ExtJS专栏 (18)
- RIA-mxGraph专栏 (4)
- RIA-Flex4专栏 (43)
- 框架-Spring专栏 (16)
- 框架-持久化专栏 (22)
- 框架-Struts2专栏 (11)
- 框架-Struts专栏 (12)
- SQL/NOSQL (12)
- 报表/图表 (2)
- 工作流 (5)
- XML专栏 (4)
- 日常报错解决方案 (5)
- Web前端-综合 (12)
- Web/JSP (14)
- Web前端-ajax专栏 (14)
- Web前端-JQuery专栏 (9)
- IDE技巧 (6)
- FILE/IO (14)
- 远程服务调用 (2)
- SSO单点登录 (2)
- 资源分享 (22)
- 云计算 (1)
- 项目管理 (3)
- php专栏 (1)
- Python专栏 (2)
- Linux (1)
- 缓存系统 (1)
- 队列服务器 (1)
- 网络编程 (0)
- Node.js (1)
最新评论
-
hui1989106a:
我的也不能解压,360和好压都试了,都不行
《Spring in Action》完整中文版分享下载 -
temotemo:
这些example有些过时了,官方建议使用HBase-1.0 ...
Java操作Hbase进行建表、删表以及对数据进行增删改查,条件查询 -
zy8102:
非常感谢~
HeadFirst系列之七:《深入浅出SQL》原版高清PDF电子书分享下载 -
zy8102:
重命名了一下搞定了
HeadFirst系列之七:《深入浅出SQL》原版高清PDF电子书分享下载 -
zy8102:
为什么下载以后老解压不了呢?
HeadFirst系列之七:《深入浅出SQL》原版高清PDF电子书分享下载
Spring对邮件发送支持的很好,我们只要配置好邮件发送器,写好邮件发送具体操作类的方法,那么实现就不是很难的事,不过这个过程中经常会出现这样或那样的错误,所以待讲完本篇后我会总体总结下spring邮件发送容易发生的错误及解决办法
关于邮件发送,不外乎有这么几种情况,一种是纯文本的发送,一种是HTML形式的发送,一种就是发送时带有附件,一种就是发送时采取的事群发,针对这几个我将一一来讲下,我的代码中将第一中归为一大类,后面三种归为一代类,所以将会出现两种配置文件
第一大类邮件发送【纯文本发送】
必须包:spring.jar,common-logging.jar,mail.jar,servlet.jar,common-collection.jar
首先我们来看spring配置文件applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<!--定义邮件发送器,配置好发送者详细信息-->
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="smtp.163.com" />
<property name="port" value="25" />
<property name="username" value="emailusername" />
<property name="password" value="emailpassword" />
<property name="defaultEncoding" value="utf-8" />
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.auth">true</prop>
</props>
</property>
</bean>
<bean id="emailService" class="com.javacrazyer.comon.SendOrderConfirmationEmailAdvice">
<property name="mailSender" ref="mailSender" />
</bean>
</beans>
用到的实体类Order.java
package com.javacrazyer.comon;
import java.io.Serializable;
public class Order implements Serializable {
/* Private Fields */
private int orderId;
private String username;
private String useremail;
public int getOrderId() {
return orderId;
}
public void setOrderId(int orderId) {
this.orderId = orderId;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getUseremail() {
return useremail;
}
public void setUseremail(String useremail) {
this.useremail = useremail;
}
}
邮件发送类的接口类MailService.java
package com.javacrazyer.comon;
/**
* 使用Spring发送邮件
*
*/
public interface MailService {
void sendOrderMail(Order order);
}
具体实现的邮件发送类SendOrderConfirmationEmailAdvice.java
package com.javacrazyer.comon;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import org.springframework.mail.MailSender;
import org.springframework.mail.SimpleMailMessage;
public class SendOrderConfirmationEmailAdvice implements MailService{
private String from="emailusername@163.com"; //发送人邮箱地址,必须与spring配置文件中的邮箱地址一样
private String registeTemplateName = "com/javacrazyer/comon/mail_registe.txt";
private MailSender mailSender;
public void setMailSender(MailSender mailSender) {
this.mailSender = mailSender;
}
public void sendOrderMail(Order order) {
//SimpleMialMessage只能用来发送TEXT格式的邮件
SimpleMailMessage mail = new SimpleMailMessage();
mail.setFrom(this.from);
mail.setTo(order.getUseremail());
mail.setSubject("恭喜你成功注册成为SOMEDAY商城的会员!");
mail.setText(loadTemplateContent(registeTemplateName).replaceAll("\\$\\{LOGINNAME\\}", order.getUsername()));
this.mailSender.send(mail);
}
private String loadTemplateContent(String templateName){
StringBuilder sb = new StringBuilder();
BufferedReader br= null;
try{
br = new BufferedReader(
new InputStreamReader(
Thread.currentThread()
.getContextClassLoader()
.getResourceAsStream(templateName), "UTF-8"));
String lineSeparator = System.getProperty("line.separator");
for(String str = null; (str = br.readLine()) != null;){
sb.append(str);
sb.append(lineSeparator);
}
}catch(IOException e){
e.printStackTrace();
}finally{
if(br != null){
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return sb.toString();
}
}
用到的mail_registe.txt
亲爱的${LOGINNAME}:您好!
恭喜你成为SOMEDAY商城的会员!
你的登录用户名为:${LOGINNAME}
你的登录口令为:******(隐藏)
本站网址:http://www.yoursitename.cn
联系邮箱:hr@yoursite.cn
测试发送
package com.javacrazyer.service.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.javacrazyer.comon.MailService;
import com.javacrazyer.comon.Order;
public class UserServiceTest {
@Test
public void test() throws InterruptedException {
ApplicationContext context = new ClassPathXmlApplicationContext(
"applicationContext.xml");
MailService sf = (MailService) context.getBean("emailService");
Order order = new Order();
order.setUsername("cheneywu");
order.setUseremail("xxxxxx@qq.com");
sf.sendOrderMail(order);
}
}
注意查收邮箱中的信息哦
第二大类邮件发送【HTML格式的发送,群发,附件】
除了上面包外,还需要spring-webmvc.jar,freemarker.jar,为什么需要freemarker呢,因为要发送HTML格式的文件,所以要先写好HTML内容的文件,然后用模板freemarker匹配其中的值,Spring中对freemarker也有很好的支持
spring配置文件applicatonContext-html.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<bean id="freeMarker"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="classpath:mailTemplate" />
<!--指定模板文件目录-->
<property name="freemarkerSettings"><!-- 设置FreeMarker环境属性-->
<props>
<prop key="template_update_delay">1800</prop><!--刷新模板的周期,单位为秒-->
<prop key="default_encoding">UTF-8</prop><!--模板的编码格式 -->
<prop key="locale">zh_CN</prop><!-- 本地化设置-->
</props>
</property>
</bean>
<!-- 注意:这里的参数(如用户名、密码)都是针对邮件发送者的 -->
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="smtp.163.com" />
<property name="port" value="25" />
<property name="username" value="emailusername" />
<property name="password" value="emailpassword" />
<property name="defaultEncoding" value="utf-8" />
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.auth">true</prop>
</props>
</property>
</bean>
<bean id="emailService" class="com.javacrazyer.comon.EmailService">
<property name="mailSender" ref="mailSender"></property>
<property name="freeMarkerConfigurer" ref="freeMarker"></property>
</bean>
</beans>
模板文件目mailTemplate下的模板文件registe.ftl 【这个文件无名字、后缀无所谓,只要内容是HTML内容即可】
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf8">
</head>
<body>
恭喜您成功注册!您的用户名为:<font color='red' size='30'>${LOGINNAME}</font>
</body>
</html>
具体邮件发送类EmailService.java
package com.javacrazyer.comon;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;
import org.springframework.mail.MailSender;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
import freemarker.template.Template;
public class EmailService implements MailService {
private JavaMailSender mailSender;
private FreeMarkerConfigurer freeMarkerConfigurer = null; // FreeMarker的技术类
public void setMailSender(JavaMailSender mailSender) {
this.mailSender = mailSender;
}
public void setFreeMarkerConfigurer(
FreeMarkerConfigurer freeMarkerConfigurer) {
this.freeMarkerConfigurer = freeMarkerConfigurer;
}
/**
* 发送带模板的单个html格式邮件
*/
public void sendOrderMail(Order order) {
MimeMessage msg = mailSender.createMimeMessage();
// 设置utf-8或GBK编码,否则邮件会有乱码,true表示为multipart邮件
try {
MimeMessageHelper helper = new MimeMessageHelper(msg, true, "utf-8");
helper.setTo(order.getUseremail()); // 邮件接收地址
helper.setFrom("emailusername@163.com"); // 邮件发送地址,这里必须和xml里的邮件地址相同一致
helper.setSubject("你好,恭喜你注册成功"); // 主题
String htmlText;
htmlText = getMailText(order.getUsername());
helper.setText(htmlText, true); // 邮件内容,注意加参数true,表示启用html格式
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // 使用模板生成html邮件内容
mailSender.send(msg); // 发送邮件
}
/**
* 批量发送带附件的html格式邮件,带附件
*/
public void sendBatchEmail(Order order, List<String> address) {
MimeMessage msg = mailSender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(msg, true, "utf-8");
String toList = getMailList(address);
InternetAddress[] iaToList = new InternetAddress().parse(toList);
msg.setRecipients(Message.RecipientType.TO, iaToList);
helper.setFrom("emailusername@163.com");
helper.setSubject("你好,恭喜你注册成功");
String htmlText = getMailText(order.getUsername());
helper.setText(htmlText, true);
// 添加内嵌文件,第1个参数为cid标识这个文件,第2个参数为资源
helper.addInline("a", new File("E:/11.jpg")); // 附件内容
helper.addInline("b", new File("E:/12.jpg"));
File file = new File("E:/各种框架图介绍.docx");
// 这里的方法调用和插入图片是不同的,使用MimeUtility.encodeWord()来解决附件名称的中文问题
helper.addAttachment(MimeUtility.encodeWord(file.getName()), file);
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 如果主题出现乱码,可以使用该函数,也可以使用下面的函数
// helper.setSubject(MimeUtility.encodeText(String text,String
// charset,String encoding))
// 第2个参数表示字符集,第三个为目标编码格式。
// MimeUtility.encodeWord(String word,String charset,String encoding)
mailSender.send(msg);
}
/**
* 集合转换字符串
*/
public String getMailList(List<String> to) {
StringBuffer toList = new StringBuffer();
int length = to.size();
if (to != null && length < 2) {
toList.append(to.get(0));
} else {
for (int i = 0; i < length; i++) {
toList.append(to.get(i));
if (i != (length - 1)) {
toList.append(",");
}
}
}
return toList.toString();
}
// 通过模板构造邮件内容,参数content将替换模板文件中的${content}标签。
private String getMailText(String content) throws Exception {
String htmlText = "";
// 通过指定模板名获取FreeMarker模板实例
Template tpl = freeMarkerConfigurer.getConfiguration().getTemplate(
"registe.ftl");
Map map = new HashMap(); // FreeMarker通过Map传递动态数据
map.put("LOGINNAME", content); // 注意动态数据的key和模板标签中指定的属性相匹配
// 解析模板并替换动态数据,最终content将替换模板文件中的${content}标签。
htmlText = FreeMarkerTemplateUtils.processTemplateIntoString(tpl, map);
return htmlText;
}
}
单一发送HTML格式的邮件测试
package com.javacrazyer.service.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.javacrazyer.comon.MailService;
import com.javacrazyer.comon.Order;
public class UserServiceTest {
@Test
public void test() throws InterruptedException {
ApplicationContext context = new ClassPathXmlApplicationContext(
"applicationContext-html.xml");
MailService sf = (MailService) context.getBean("emailService");
Order order = new Order();
order.setUsername("cheneywu");
order.setUseremail("xxxxxx@qq.com");
sf.sendOrderMail(order);
}
}
收到邮件了
群发,带附件的测试
package com.javacrazyer.service.test;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.javacrazyer.comon.EmailService;
import com.javacrazyer.comon.Order;
public class UserServiceTest {
@Test
public void test() throws InterruptedException {
ApplicationContext context = new ClassPathXmlApplicationContext(
"applicationContext-html.xml");
EmailService sf = (EmailService) context.getBean("emailService");
Order order = new Order();
order.setUsername("cheneywu");
List<String> maillist = new ArrayList<String>();
maillist.add("XXXXXX@qq.com");
maillist.add("YYYYYY@qq.com");
sf.sendBatchEmail(order, maillist);
}
}
收到邮件了哦
看到了没有,这个上边有两个接收人,下边的是附件
评论
Caused by: javax.mail.MessagingException: Exception reading response;
nested exception is:
java.net.SocketException: Connection reset
at com.sun.mail.smtp.SMTPTransport.readServerResponse(SMTPTransport.java:1090)
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:986)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:197)
at javax.mail.Service.connect(Service.java:233)
at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:373)
at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:291)
at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:277)
这个估计是SMTP设置的不对, 比如163邮箱的是smpt.163.com
Caused by: javax.mail.MessagingException: Exception reading response;
nested exception is:
java.net.SocketException: Connection reset
at com.sun.mail.smtp.SMTPTransport.readServerResponse(SMTPTransport.java:1090)
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:986)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:197)
at javax.mail.Service.connect(Service.java:233)
at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:373)
at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:291)
at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:277)
发表评论
-
Spring温习(9)--配置hibernate信息
2010-11-04 09:45 3075有时候为了为了操作方便,我们时常在spring整合hibern ... -
Spring温习(8)--国际化的支持
2010-11-03 11:07 3742我今天介绍的国际化呢,平时基本上都用不上,我的项目中也从来没用 ... -
Spring温习(7)--有关定时任务Quartz的示例
2010-11-02 23:07 2788实际项目中有关定时任务的使用还是比较普遍的,比如定时做报表,定 ... -
Spring温习(5)--CGLIB的动态代理[附AOP内部实现讲解]
2010-10-27 14:55 8847这篇文章紧接着上一篇静态代理和动态代理来说 前言: 到现在 ... -
Spring温习(4)--静态代理和动态代理
2010-10-27 11:27 3306代理模式分为静态代理和动态代理。静态代理就是我们自己定义的代理 ... -
Spring温习(3)--AutoWire自动装配
2010-10-27 09:48 3064在应用中,我们常常使用<ref>标签为JavaBe ... -
Spring温习(2)--IOC容器
2010-10-27 09:10 30251. Spring IoC的依赖注入 1) 使用构造方法来注入 ... -
Spring温习(1)--最基础的示例
2010-10-26 21:37 3452从现在开始,我将从Spring为起点,逐步复习几大框架各方面的 ... -
Spring事务管理的两种方式
2010-10-26 17:27 3987目前项目开发过程中对于Spring的事务管理,主要就这么两种方 ... -
Spring数据源配置的三种方式
2010-10-26 15:25 3744spring数据源配置目前确切的说应该分为:spring容器自 ... -
Spring AOP的两种实现方式
2010-10-26 11:18 5790AOP常用实现方式是一个采用声明的方式来实现,一个采用注解的方 ... -
Spring AOP原理及拦截器
2010-10-26 10:38 147819原理 AOP(Aspect Oriented Pro ... -
在MyEclipse8.5中恢复jpetstore项目
2010-10-22 17:24 2296恢复jpetstore项目的过程1.在myeclipse8.5 ... -
SpringMVC关键问题讲解
2010-10-21 21:31 22888接着上篇文章,大家可能关心的那两个问题 1.control ... -
SpringMVC入门实例及详细讲解
2010-10-21 20:48 215061Spring 框架提供了构建 Web 应用程序的 ...
相关推荐
Spring Boot通过集成spring-boot-starter-mail依赖和相关配置,可以方便地实现邮件发送功能。具体的步骤: 添加依赖:在Spring Boot项目的pom.xml文件中加入spring-boot-starter-mail依赖,如果需要发送模板邮件,还...
springboot 整合spring-boot-starter-mail 发邮件
spring源码缺失jar。spring-cglib-repack-3.2.5.jar,spring-objenesis-repack-2.6.jar
spring源码导入SpringObjenesis类报错解决,缺少jar包spring-cglib-repack-3.2.0.jar和spring-objenesis-repack-2.1.jar
spring-cglib-repack-3.2.5.jar和spring-objenesis-repack-2.6.jar
spring-cloud-config + spring-cloud-bus-amqp实现分布式集群配置动态更新,可更新实例对象,包含源码包+Rabbitmq安装包和安装说明
spring-cloud-eureka:eureka server单机、双机、集群示例 eureka-producer-consumer:利用eureka实现服务提供与调用示例 spring-cloud-hystrix:Hystrix熔断的使用示例 hystrix-dashboard-turbine:熔断监控Hystrix...
spring boot 邮件发送,亲测可用 #字符集 spring.mail.default-encoding=UTF-8 #电子邮件地址 spring.mail.host=smtp.126.com #Application spring.application.name=SEND-MAIL #授权密码 spring.mail.password=...
spring-boot-mail邮件发送服务 v1.0.zip
spring-aop-1.1.1.jar spring-aop-1.2.6.jar spring-aop-1.2.9.jar spring-aop-2.0.2.jar spring-aop-2.0.6.jar spring-aop-2.0.7.jar spring-aop-2.0.8.jar spring-aop-2.0.jar spring-aop-2.5.1.jar spring-aop-...
spring-boot项目pom.xm中parent依赖文件spring-boot-starter-parent-1.5.13.RELEASE.pom
spring-aop-4.1.6.RELEASE.jar spring-aspects-4.1.6.RELEASE.jar spring-beans-4.1.6.RELEASE.jar spring-context-4.1.6.RELEASE.jar spring-context-support-4.1.6.RELEASE.jar spring-core-4.1.6.RELEASE.jar ...
最新版spring-web-5.2.3.RELEASE和spring-webmvc-5.2.3.RELEASE
spring-web-5.0.4.RELEASE.jar; spring-web-5.0.4.RELEASE.jar
activiti-spring-boot-starter-basic-6.0.0适配springboot2.1.2
commons-pool2-2.3.jar,jedis-2.8.0.jar,spring-data-redis-1.6.0.RELEASE.jar,spring-session-1.1.1.RELEASE.jar,Spring-data-redis(Version 1.6.0.RC1)中文版.pdf
Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。简单...
Spring-data-redis 1.7.6 & source源码
spring-context-3.2.4.RELEASE.jar spring-core-3.2.4.RELEASE.jar spring-beans-3.2.4.RELEASE.jar spring-test-3.2.4.RELEASE.jar spring-web-3.2.4.RELEASE.jar spring-aop-3.2.4.RELEASE.jar spring-webmvc-...
spring-**cntext**-4.3.6.RELEASE.jar:spring提供了基础IOC功能上的扩展服务,提供了很多企业级服务的支持,如邮件服务,任务调度,JNDI定位,EJB集成,远程访问,缓存以及各种试图层框架的封装等。 spring-...