通过spring实现javamail发送邮件功能
以前很早的时候大家都用javamail实现发送邮件的功能,而且我们也一直沿用至今,代码拷过来用用就行了,现在我们改为用spring来实现,这样一来减少代码的复杂度,也能更好的契合spring理念
首先spring的相关jar包都是要引入的,其次要引入mail.jar
<!-- https://mvnrepository.com/artifact/com.sun.mail/javax.mail -->
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>${javax.mail.version}</version>
</dependency>
然后需要配置一个spring-mail.xml这样的文件,如果不新建,也可以在service中加入就行,但是为了做更好的分层,还是分开较好

配置spring的javamail发送器,这边配置了qq邮箱和qq企业邮箱的配置,需要注意的是host是不同的,另外如果是个人qq邮箱,需要使用授权码,授权码在qq邮箱中查看即可,而企业邮箱就是企业管理员分配的登录密码即可
<!-- 使用qq邮箱 -->
<bean id="javaMailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<!-- <property name="host" value="smtp.qq.com"/> -->
<property name="host" value="smtp.exmail.qq.com"/>
<property name="port" value="587"/>
<!-- <property name="username" value="xxxxx@qq.com"/> -->
<property name="username" value="xxxx@xxxxx.com"/>
<!-- qq邮箱的授权码,如果是企业邮箱,则使用登录密码 -->
<!-- <property name="password" value="xxxxxxxxxxxxxxx"/> -->
<property name="password" value="xxxxxxxxxxxxxxx"/>
<property name="javaMailProperties">
<props >
<prop key="mail.smtp.auth">true</prop>
</props>
</property>
</bean>
附带一提网易邮箱是多么的坑爹:
<!-- 使用163邮箱 -->
<!-- <bean id="javaMailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"> -->
<!-- <property name="host" value="smtp.163.com"/> -->
<!-- <property name="port" value="25"/> -->
<!-- <property name="username" value="xxxxxxxxx@163.com"/> -->
<!-- 163邮箱的授权码,而不是登录密码 -->
<!-- <property name="password" value="xxxxxxxxxxxx"/> -->
<!-- <property name="javaMailProperties"> -->
<!-- <props > -->
<!-- <prop key="mail.smtp.auth">true</prop> -->
<!-- </props> -->
<!-- </property> -->
<!-- </bean> -->
使用网易邮箱会莫名报554的错误,也是就是说认定你的邮件是垃圾邮件,重复发送同一份邮件,内容一致,或者带有相关关键字,都会被列为垃圾邮件,然后会禁止30分钟左右,非常不人性化,所以不建议使用163作为发送器
配置邮箱的发送者以及标题,这个不写也可以,可以在发送的时候直接配置都行
<bean id="simpleMailMessage" class="org.springframework.mail.SimpleMailMessage">
<property name="from" value="xxxxx@xxxx.com" />
<!-- <property name="from" value="xxxxx@qq.com" /> -->
<property name="subject" value="xxxx" />
</bean>
最后的配置是freemarker模板,为何要模板,因为我们平时发送邮件会有很多不同的分类,分类配置在枚举中,根据不同的分类去选择不同的模板,一般来说注册码,密码重置,活动页面等等都需要作为一个单独的HTML来发送,而一个HTML我们不可能会以servlet的形式把标签都写在java代码中,所以采用模板来实现,是最好的方式:
<!--FreeMarker模板-->
<bean id="freeMarkerConfigurer" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="classpath:freemarker" />
<property name="freemarkerSettings">
<props>
<prop key="locale">zh_CN</prop>
<prop key="default_encoding">UTF-8</prop>
</props>
</property>
</bean>
配置模板路径

填充模板内容
<h2><font color="green">${nickName},您好!</font></h2>
<p>注意:30分钟后链接将失效!</p>
<p>请点击以下链接完成密码重置操作:</p>
<p><a href="www.abc.com" target="_blank">www.abc.com/user/reset?userId=test10011</a></p>
<p>${content}</p>
编写邮件发送器,一方面从freemarker中构建邮件内容,一方面再执行mail发送操作
@Component
public class PwdMailSender { @Autowired
private JavaMailSender javaMailSender;
@Autowired
private SimpleMailMessage simpleMailMessage;
@Autowired
private FreeMarkerConfigurer freeMarkerConfigurer; /**
*
* @Description: 从模板中构建邮件内容
* @param nickName 用户昵称
* @param content 邮件内容
* @param email 接受邮件
*
* @author leechenxiang
* @date 2017年2月5日 下午1:22:00
*/
public void send(String nickName, String content, String email) {
String to = email;
String text = "";
Map<String, String> map = new HashMap<String, String>(1);
map.put("nickName", nickName);
map.put("content", content);
try {
// 根据模板内容,动态把map中的数据填充进去,生成HTML
Template template = freeMarkerConfigurer.getConfiguration().getTemplate("mail.ftl");
// map中的key,对应模板中的${key}表达式
text = FreeMarkerTemplateUtils.processTemplateIntoString(template, map);
} catch (IOException e) {
e.printStackTrace();
} catch (TemplateException e) {
e.printStackTrace();
}
sendMail(to, null, text);
} /**
*
* @Description: 执行发送邮件
* @param to 收件人邮箱
* @param subject 邮件主题
* @param content 邮件内容
*
* @author leechenxiang
* @date 2017年2月5日 下午1:22:34
*/
public void sendMail(String to, String subject, String content) {
try {
MimeMessage message = javaMailSender.createMimeMessage();
MimeMessageHelper messageHelper = new MimeMessageHelper(message, true, "UTF-8");
messageHelper.setFrom(simpleMailMessage.getFrom());
if (subject != null) {
messageHelper.setSubject(subject);
} else {
messageHelper.setSubject(simpleMailMessage.getSubject());
}
messageHelper.setTo(to);
messageHelper.setText(content, true);
javaMailSender.send(message);
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
最后在需要调用的地方执行就行
@Autowired
private PwdMailSender pwdMailSender; @RequestMapping("/mail")
@ResponseBody
public Object mail(){
pwdMailSender.send("lee", "在这里填写你所需要的内容", "leechenxiang@163.com");
return "success";
}
然后收到的邮件内容就如下

需要注意的是,这么做发送邮件由于单线程操作是不可取的,可以参考之前的多线程,执行多线程操作,或者引入消息队列RMQ或者AMQ来发送邮件,异步操作优于同步操作。
通过spring实现javamail发送邮件功能的更多相关文章
- 项目一:第十四天 1.在realm中动态授权 2.Shiro整合ehcache 缓存realm中授权信息 3.动态展示菜单数据 4.Quartz定时任务调度框架—Spring整合javamail发送邮件 5.基于poi实现分区导出
1 Shiro整合ehCache缓存授权信息 当需要进行权限校验时候:四种方式url拦截.注解.页面标签.代码级别,当需要验证权限会调用realm中的授权方法 Shiro框架内部整合好缓存管理器, ...
- 使用spring的JavaMail发送邮件
以前我们使用JavaMail发送邮件,步骤挺多的.现在的项目跟Spring整合的比较多.所以这里主要谈谈SpringMail发送. 导入jar包. 配置applicationContext-email ...
- Spring的JavaMail实现异步发送邮件
具体背景就不说了,可以网上搜索相关知识,或者直接看Sping MailSender的官坊网页.这里就直接实战了(Java实现异步发送电子邮件,包含中文无乱码). Maven: <dependen ...
- spring利用javamail,quartz定时发送邮件 <转>
原文地址:spring利用javamail,quartz定时发送邮件 <转>作者:物是人非 spring提供的定时发送邮件功能,下面是一个简单的例子以供大家参考,首先从spring配置文件 ...
- JavaMail实现邮箱之间发送邮件功能
package com.minstone.message.util; import java.util.Date; import java.util.Properties; import javax. ...
- 使用JavaMail发送邮件-no object DCH for MIME type multipart/mixed报错解决
最近需要实现一个使用Spring schedule按一定时间间隔自动触发条件发送邮件的功能,在开发的过程中,是按照先测试能发出text/html文本邮件,然后测试添加附件发送邮件,我碰到的问题是,文本 ...
- JavaMail发送邮件第一版
首先,我们先来了解一个基本的知识点,用什么工具来发邮件? 简单的说一下,目前用的比较多的客户端:OutLook,Foxmail等 顺便了解一下POP3.SMTP协议的区别: POP3,全名为" ...
- web应用中使用JavaMail发送邮件
现在很多的网站都提供有用户注册功能, 通常我们注册成功之后就会收到一封来自注册网站的邮件.邮件里面的内容可能包含了我们的注册的用户名和密码以及一个激活账户的超链接等信息.今天我们也来实现一个这样的功能 ...
- web应用中使用JavaMail发送邮件 。。转载
现在很多的网站都提供有用户注册功能, 通常我们注册成功之后就会收到一封来自注册网站的邮件.邮件里面的内容可能包含了我们的注册的用户名和密码以及一个激活账户的超链接等信息.今天我们也来实现一个这样的功能 ...
随机推荐
- Tomcat 静态部署 二步特别注意
一.修改server.xml 在Host 节点添加如下配置 <!-- path 为请求url地址 docBase 为项目文件绝对地址制定到WebContent根目录下 --> <Co ...
- AWK----awk与shell交互
1互相调用命令 ls | awk '{if(system("ls " $0)==0) print "file "$0" exsits"}' ...
- ymodem协议c实现(转)
源:ymodem协议c实现 /****************************************Copyright (c)******************************** ...
- iOS开发——判断是否第一次启动
在我们做项目的时候,判断是否是第一次启动,还是比较常用的,比如,欢迎界面,只是第一次启动需要的调查问卷等等,目的明确,方法很多,这里介绍一种简单的. 在你需要只有第一次启动才跳转的地方写上 if(![ ...
- listen函数里面backlog的意义以及各种情况
先看了这篇: http://www.cppblog.com/thisisbin/archive/2010/02/07/107444.html 里面说了会维护两个队列,established 和 syn ...
- 【转】Linux Shell脚本面试25问
Q:1 Shell脚本是什么.它是必需的吗? 答:一个Shell脚本是一个文本文件,包含一个或多个命令.作为系统管理员,我们经常需要使用多个命令来完成一项任务,我们可以添加这些所有命令在一个文本文件( ...
- jdom.jar导入问题
一开始,导入jdom-1.1.1.jar无反应,还是缺包状态 =>将jdom-1.1.1.jar解压,在jdom/build/目录下有jdom.jar导入,success!
- ios framework 开发 之 实战 一,合并失败了
保证public 文件目录独立 在 XCode 7 中,这一条已经自动实现了 Build Settings>Public Headers Folder Path "$(PROJECT_ ...
- 【蓝牙数据采集模块】-02-Sensor Controller 编写CC2650STK外设驱动
上次说到把所有的传感器模块在Sensor Controller中实现读写,并封装驱动. 先来看一下CC2650STK的原理图 用红色方框标记的DIO_0~DIO_7, DIO_23~DIO_30是可以 ...
- constrain to margins
如果你点了constrain to margins,左右会有8个点的空挡,而是从8个点后开始计算约束,而没有点时,已屏幕的0点开始计算.