Spring的JavaMail实现异步发送邮件
具体背景就不说了,可以网上搜索相关知识,或者直接看Sping MailSender的官坊网页。这里就直接实战了(Java实现异步发送电子邮件,包含中文无乱码)。
Maven:
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.5.0</version>
</dependency>
ApplicationContext.xml:
<!-- SET default mail properties -->
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="smtp.sina.com"/>
<property name="protocol" value="smtp" />
<!-- 465 for Gamil -->
<property name="port" value="25"/>
<property name="username" value="xxx@sina.com"/>
<property name="password" value="xxx"/>
<property name="javaMailProperties">
<props>
<prop key="mail.transport.protocol">smtp</prop>
<prop key="mail.smtp.auth">true</prop>
<!-- true for Gamil -->
<prop key="mail.smtp.starttls.enable">false</prop>
<prop key="mail.debug">true</prop>
</props>
</property>
</bean> <!--Asyn send Eamil-->
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="10"/>
<property name="maxPoolSize" value="30"/>
</bean> <!-- You can have some pre-configured messagess also which are ready to send -->
<bean id="preConfiguredMessage" class="org.springframework.mail.SimpleMailMessage">
<property name="to" value="xxx@gmail.com"></property>
<property name="from" value="xxx@sina.com"></property>
<property name="subject" value="Test email from sina."/>
</bean>
Email实体类:
package com.xxx; import java.io.Serializable; /**
* @author
*
*/
public class ApplicationEmail implements Serializable { public String getAddressee() {
return addressee;
}
public void setAddressee(String addressee) {
this.addressee = addressee;
}
public String getCc() {
return cc;
}
public void setCc(String cc) {
this.cc = cc;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
} /**收件人**/
private String addressee;
/**抄送给**/
private String cc;
/**邮件主题**/
private String subject;
/**邮件内容**/
private String content;
/**附件**/
//private MultipartFile[] attachment = new MultipartFile[0]; }
异步邮件发送封装类:
package com.xxx; import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Properties;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.task.TaskExecutor;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service; import com.xxx.Mailer; /**
* @author
*
*/
@Service
public class ApplicationMailer implements Mailer
{
@Autowired
private JavaMailSender mailSender; @Autowired
private TaskExecutor taskExecutor; @Autowired
private SimpleMailMessage preConfiguredMessage; /**
* 同步发送邮件
*
* @param email
* @throws MessagingException
* @throws IOException
*/
public void sendMailBySynchronizationMode(ApplicationEmail email) throws MessagingException, IOException {
Session session=Session.getDefaultInstance(new Properties());
MimeMessage mime= new MimeMessage(session);
MimeMessageHelper helper = new MimeMessageHelper(mime, true, "utf-8");
helper.setFrom("xxx@sina.com");//发件人
helper.setTo(InternetAddress.parse(email.getAddressee()));//收件人
//helper.setBcc("administrator@chinaptp.com");//暗送
helper.setReplyTo("xxx@sina.com");//回复到
helper.setSubject(email.getSubject());//邮件主题
helper.setText(email.getContent(), true);//true表示设定html格式 mailSender.send(mime);
} /**
* 异步发送邮件
*
* @param email
*/
public void sendMailByAsynchronousMode(final ApplicationEmail email){ taskExecutor.execute(new Runnable(){
public void run(){
try {
sendMailBySynchronizationMode(email);
} catch (Exception e) {
}
}
});
}
} public interface Mailer {
public void sendMailByAsynchronousMode(final ApplicationEmail email);
}
调用Service异步发送邮件:
@Autowired
private Mailer mailer; //这是要异步发送邮件
ApplicationEmail email = new ApplicationEmail();
email.setAddressee("xxx@gmail.com");
email.setSubject("测试邮件有一份");
email.setContent("这个是内容html内容");
mailer.sendMailByAsynchronousMode(email);
这里实现异步使用的是Task Execution,也可以用异步注解@Async,或者JMS(需要J2EE环境);如果需要调度可以用Quartz(使用场景如:每天2:00需要批量给会员发邮件)
如果要实现高可靠的高并发的异步邮件发送,可以用JMS或Queue,参考。
本文结束。(干货分享:Spring和JavaMail发送邮件的经验.pdf)
Spring的JavaMail实现异步发送邮件的更多相关文章
- (三)集成 JavaMail ,实现异步发送邮件
集成 JavaMail ,实现异步发送邮件 1.JavaMail的核心API 1.1 API功能图解 1.2 API说明 1.2.1 Message 类: 1.2.2 Transport 类 1.2. ...
- SpringBoot 2.0 集成 JavaMail ,实现异步发送邮件
一.JavaMail的核心API 1.API功能图解 2.API说明 (1).Message 类: javax.mail.Message 类是创建和解析邮件的一个抽象类 子类javax.mail.in ...
- Spring中javaMail通过SMTP发送邮件
public final class Emails { /** The java mail sender. */ private static JavaMailSender javaMailSende ...
- Spring集成JavaMail并利用线程池发送邮件
我们系统存在大量发送邮件的需求,项目使用的是Spring框架而JavaMail也能很好的跟Spring进行集成,由于发送邮件最好还是使用异步进行发送,所以这里就采用线程池+JavaMail进行邮件发送 ...
- spring利用javamail,quartz定时发送邮件 <转>
原文地址:spring利用javamail,quartz定时发送邮件 <转>作者:物是人非 spring提供的定时发送邮件功能,下面是一个简单的例子以供大家参考,首先从spring配置文件 ...
- 通过spring实现javamail发送邮件功能
以前很早的时候大家都用javamail实现发送邮件的功能,而且我们也一直沿用至今,代码拷过来用用就行了,现在我们改为用spring来实现,这样一来减少代码的复杂度,也能更好的契合spring理念 首先 ...
- 项目一:第十四天 1.在realm中动态授权 2.Shiro整合ehcache 缓存realm中授权信息 3.动态展示菜单数据 4.Quartz定时任务调度框架—Spring整合javamail发送邮件 5.基于poi实现分区导出
1 Shiro整合ehCache缓存授权信息 当需要进行权限校验时候:四种方式url拦截.注解.页面标签.代码级别,当需要验证权限会调用realm中的授权方法 Shiro框架内部整合好缓存管理器, ...
- spring boot 异步发送邮件
发送邮件由于是一个耗时的操作,有可能需要一个几十秒的操作,但是呢,接口 是一个瞬间完成的,为了不影响接口的性能,所以需要对发送邮件的操作进行异步操作,我们这里呢,首先我们要引入发送邮件的测试模块. & ...
- ActiveMQ入门系列之应用:Springboot+ActiveMQ+JavaMail实现异步邮件发送
现在邮件发送功能已经是几乎每个系统或网址必备的功能了,从用户注册的确认到找回密码再到消息提醒,这些功能普遍的会用到邮件发送功能.我们都买过火车票,买完后会有邮件提醒,有时候邮件并不是买完票立马就能收到 ...
随机推荐
- MATLAB拟合正态分布
clear;clc;close all format compact %% 正态分布的拟合 % 生成随机数 num = 50; y = randn(1000,1); x = 1:num; y = hi ...
- Unicode 字符
Unicode是计算机可以支持这个星球上多种语言的秘密武器.在Unicode之前,用的都是ASCII. ASCII码非常简单,每个英文都是7位二进制的方式存贮在计算机内,其范围是32~126.当用户在 ...
- 12.equals()方法总结
超类Object中有这个equals()方法,该方法主要用于比较两个对象是否相等.该方法的源码如下: 我们知道所有对象都有表示(内存地址)和状态(数据),看上面代码是用"=="来比 ...
- bootstrap datetimepicker
一.datepicker 早期的 二.datetimepicker 适用于bootstrap2,3兼容性不太好 三.在github上找了个不错的:https://github.com/Eonasdan ...
- 冲刺博客NO.3
今天做了什么:参考网上的一些登录界面,发现了Android studio自带loginActivity.做了基础登录界面 不停地上网搜,各种不会. 在短信验证功能上通过在Mob.com的集成文档和官 ...
- Devexpress中Gridcontrol查找分组
private void button1_Click(object sender, EventArgs e) { DataTable dt = new DataTable(); dt.Columns. ...
- SQL关闭自增长列标识:SET IDENTITY_INSERT
关闭自增长列添加记录,然后再恢复自增长功能 SET IDENTITY_INSERT 表名 ON; inert ,); SET IDENTITY_INSERT 表名 OFF
- 在WPF中将图片转换成3D图像并可以旋转
时光偷走的,永远都是我们眼皮底下看不见的珍贵. https://pan.baidu.com/s/14dk-OU2SR0nxXj2bL4bVpQ 源码网站https://www.codeproject. ...
- ffplay源码分析5-图像格式转换
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10311376.html ffplay是FFmpeg工程自带的简单播放器,使用FFmpeg ...
- VMware中安装Contos
1 检查BIOS虚拟化支持 2 新建虚拟机 3 新建虚拟机向导 4 创建虚拟空白光盘 5 安装Linux系统对应的CentOS版 6 虚拟机命名和定位磁盘位置 7 处理器配置,看自己是否是双核.多核 ...