以前很早的时候大家都用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. 项目一:第十四天 1.在realm中动态授权 2.Shiro整合ehcache 缓存realm中授权信息 3.动态展示菜单数据 4.Quartz定时任务调度框架—Spring整合javamail发送邮件 5.基于poi实现分区导出

    1 Shiro整合ehCache缓存授权信息 当需要进行权限校验时候:四种方式url拦截.注解.页面标签.代码级别,当需要验证权限会调用realm中的授权方法   Shiro框架内部整合好缓存管理器, ...

  2. 使用spring的JavaMail发送邮件

    以前我们使用JavaMail发送邮件,步骤挺多的.现在的项目跟Spring整合的比较多.所以这里主要谈谈SpringMail发送. 导入jar包. 配置applicationContext-email ...

  3. Spring的JavaMail实现异步发送邮件

    具体背景就不说了,可以网上搜索相关知识,或者直接看Sping MailSender的官坊网页.这里就直接实战了(Java实现异步发送电子邮件,包含中文无乱码). Maven: <dependen ...

  4. spring利用javamail,quartz定时发送邮件 <转>

    原文地址:spring利用javamail,quartz定时发送邮件 <转>作者:物是人非 spring提供的定时发送邮件功能,下面是一个简单的例子以供大家参考,首先从spring配置文件 ...

  5. JavaMail实现邮箱之间发送邮件功能

    package com.minstone.message.util; import java.util.Date; import java.util.Properties; import javax. ...

  6. 使用JavaMail发送邮件-no object DCH for MIME type multipart/mixed报错解决

    最近需要实现一个使用Spring schedule按一定时间间隔自动触发条件发送邮件的功能,在开发的过程中,是按照先测试能发出text/html文本邮件,然后测试添加附件发送邮件,我碰到的问题是,文本 ...

  7. JavaMail发送邮件第一版

    首先,我们先来了解一个基本的知识点,用什么工具来发邮件? 简单的说一下,目前用的比较多的客户端:OutLook,Foxmail等 顺便了解一下POP3.SMTP协议的区别: POP3,全名为" ...

  8. web应用中使用JavaMail发送邮件

    现在很多的网站都提供有用户注册功能, 通常我们注册成功之后就会收到一封来自注册网站的邮件.邮件里面的内容可能包含了我们的注册的用户名和密码以及一个激活账户的超链接等信息.今天我们也来实现一个这样的功能 ...

  9. web应用中使用JavaMail发送邮件 。。转载

    现在很多的网站都提供有用户注册功能, 通常我们注册成功之后就会收到一封来自注册网站的邮件.邮件里面的内容可能包含了我们的注册的用户名和密码以及一个激活账户的超链接等信息.今天我们也来实现一个这样的功能 ...

随机推荐

  1. php解决微信开发中用户昵称中的特殊字符与emoji表情写入mysql错误的问题

    解决办法:将3个字节的特殊字符与emoji表情替换掉即可. $nickname = preg_replace('/xE0[x80-x9F][x80-xBF]'.'|xED[xA0-xBF][x80-x ...

  2. hibernate和ibatis的区别

    通过别人的资料,进行自己关注的一些扼要点的整理 共同点: 1. 不同点:1. 自动化程度上,hibernate是全自动化的orm框架,提供了对象到数据库的完全映射和sql的内部自动生成,其对象映射是指 ...

  3. ApexSql Log

    网址:https://www.apexsql.com/,可免费试用14天   安装成功后,点击new,配置DB连接:   选择要分析的Log文件:   进行过滤设置:     基本设置:时间,DML和 ...

  4. Keil MDK下如何设置非零初始化变量(转)

    源:Keil MDK下如何设置非零初始化变量 一些工控产品,当系统复位后(非上电复位),可能要求保持住复位前RAM中的数据,用来快速恢复现场,或者不至于因瞬间复位而重启现场设备.而keil mdk在默 ...

  5. 系统里有Courier New字体 Eclipse没有这个字体选项

    问题状态: 系统里有Courier New字体 Eclipse没有这个字体选项问题原因: windows(xp)中的系统字体分为"显示"和"隐藏"两种状态,当为 ...

  6. dsp与dmp的cookie mapping

    dsp   ad.com   在  meijiu.com上部署广告. 假设dmp叫cm.api.taobao.com 建立gid映射表 (1) ad.com在meiju.com的页面上部署,指向dmp ...

  7. iOS给自定义个model排序

    今天有朋友问我怎么给Model排序,我顺便写了一个,伸手党直接复制吧. 例如,我建了一个Person类,要按Person的年龄属性排序: Person *per = [[Person alloc] i ...

  8. Qt编译Oracle OCI驱动

    最近使用qt开发了一个访问数据库的工具, 默认使用ODBC驱动注入的方式,后来发现Oracle中ODBC驱动注入经常失败. 后来就想直接使用OCI方式访问,而默认情况下Qt只有Sqlite和ODBC驱 ...

  9. 处理JSON格式的数据

    JSON格式的数据是最常用的数据格式,处理方法的选择就显得比较重要了.我常用的一种是用对象来接收,然后保存在数组中,需要时直接从数组中取值.下面列出一个小例子. .h文件中: #import < ...

  10. problem 202,263、232、21、231

    [263]Ugly Number Write a program to check whether a given number is an ugly number. Ugly numbers are ...