`
kjkhi
  • 浏览: 181733 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

多线程实现发送邮件功能

阅读更多

通过Internet发送邮件,可能会在网络传输上面使用较多的时间,如果调用发送邮件的线程与发送邮件线程是同一个的话,那么有可能会照成系统等待较长的时间而无法继续执行,影响系统效率。

那么这时可考虑使用多线程,实现异步发送,而不用等待邮件发送者的返回。

首先,是发送邮件的抽象任务类。其子类负责发送邮件操作。

 

public abstract class AbstractTask implements Runnable {

	private IEmailSenderListener iEmailSenderListener;
	
	private Log log = LogFactory.getLog(AbstractTask.class);
	
	/* (non-Javadoc)
	 * @see java.lang.Runnable#run()
	 */
	@Override
	public void run() {
		if(iEmailSenderListener != null){
			// 操作开始响应事件
			iEmailSenderListener.beforeSendEmail();
		}
		
		boolean flag = false;
		try{
			flag = doAction();
		}catch(Exception e){
			if(iEmailSenderListener != null){
				iEmailSenderListener.catchException(e);
			}
			log.error(e,e.fillInStackTrace());
			e.printStackTrace();
		}
		if(iEmailSenderListener != null){
			// 操作完成之后
			iEmailSenderListener.afterSendEmail(flag);
		}
	}
	
	public abstract boolean doAction() throws Exception;
}

  发送邮件实现类:

public class EmailSendTask extends AbstractTask{
	
	private JavaMailSender javaMailSender;
	
	SimpleMailMessage simpleMailMessage;
	MimeMessage mimeMessage;
	
	public EmailSendTask(SimpleMailMessage simpleMailMessage,JavaMailSender javaMailSender){
		this.simpleMailMessage = simpleMailMessage;
		this.javaMailSender = javaMailSender;
	}
	public EmailSendTask(MimeMessage mimeMessage,JavaMailSender javaMailSender){
		this.mimeMessage = mimeMessage;
		this.javaMailSender = javaMailSender;
	}

	/*
	 * (non-Javadoc)
	 * @see net.bingosoft.common.email.task.AbstractTask#doAction()
	 */
	@Override
	public boolean doAction() throws Exception {
		boolean flag = true;
		if(this.simpleMailMessage != null){
			javaMailSender.send(this.simpleMailMessage);
		}else if(this.mimeMessage != null){
			javaMailSender.send(this.mimeMessage);
		}
		return flag;
	}

}

  创建一个线程池,用户实现多线程调用邮件发送类。通过concurrent包实现

public class EmailExecutorPool implements InitializingBean{

	/**线程池数量,spring配置文件中配置*/
	private Integer poolSize;
	
	private ExecutorService service;
	
	/**
	 * 在Bean被初始化完成之后,初始化线程大小
	 */
	public void afterPropertiesSet() throws Exception {
		if(poolSize == null){
			service = Executors.newCachedThreadPool();
		}else{
			service = Executors.newFixedThreadPool(poolSize);
		}
	}


}

  实际调用发送类:

public class EmailSender {

	/**注入MailSender*/
	private JavaMailSender javaMailSender;
	/**注入线程池*/
	private EmailExecutorPool emailExecutorPool;
	/**设置发件人*/
	private String from;
	
	private Log log = LogFactory.getLog(EmailSender.class);
	
	/**
	 * 发送简单邮件
	 * @param email
	 */
	public void sendMail(EmailEntity email){
		if(null == email){
			if(log.isDebugEnabled()){
				log.debug("需要发送的邮件抽象类为空");
			}
			return;
		}
		SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
		simpleMailMessage.setTo(email.getTo());
		simpleMailMessage.setSubject(email.getSubject());
		simpleMailMessage.setText(email.getText());
		simpleMailMessage.setFrom(from);
		
		//调用线程发送邮件
		emailExecutorPool.getService().execute(new EmailSendTask(simpleMailMessage,javaMailSender));
	}
	
	/**
	 * 发送带附件和图片的邮件
	 * @param email
	 */
	public void sendMimeMail(EmailEntity email) throws Exception{
		if(null == email){
			if(log.isDebugEnabled()){
				log.debug("需要发送的邮件抽象类为空");
			}
			return;
		}
		MimeMessage mimeMessage = javaMailSender.createMimeMessage();
		MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true,"utf-8");
		
		//收件人
		helper.setTo(email.getTo());
		//邮件主题
		helper.setSubject(email.getSubject());
		//邮件内容
		helper.setText(email.getText());
		//发件人
		helper.setFrom(from);
		
		this.addAttachmentOrImg(helper, email.getAttachments(), true);
		this.addAttachmentOrImg(helper, email.getImgs(), false);
		
		emailExecutorPool.getService().execute(new EmailSendTask(mimeMessage,javaMailSender));
		
	}
	
	/**
	 * 在邮件中增加附件或者图片
	 * @param helper
	 * @param map
	 * @param isAttachment 是否是附件
	 */
	@SuppressWarnings("rawtypes")
	public void addAttachmentOrImg(MimeMessageHelper helper, Map map, boolean isAttachment) throws Exception{
		for(Iterator it = map.entrySet().iterator();it.hasNext();){
			Map.Entry entry = (Map.Entry) it.next();
			String key = (String) entry.getKey();
			String value = (String) entry.getValue();
			if(StringUtils.isNotBlank(key) && StringUtils.isNotBlank(value)){
				FileSystemResource file = new FileSystemResource(new File(value));
				if(!file.exists()) continue;
				try{
					if(isAttachment){
						helper.addAttachment(MimeUtility.encodeWord(key), file);
					}else{
						helper.addInline(MimeUtility.encodeWord(key), file);
					}
				}catch(UnsupportedEncodingException e){
					log.debug("附件中文转码错误");
					e.printStackTrace();
				}
			}
		}
	}
	
}

  测试代码:

@Controller

@RequestMapping("/test.do")
public class TestController {

	@Autowired
	private EmailSender emailSender;
	
	private Log log = LogFactory.getLog(TestController.class);
	
	@RequestMapping(params = "method=sendemail")
	public void sendEmail(HttpServletRequest req, HttpServletResponse resp){
		System.out.println("sending email ...");
		log.debug("sending email ...");
		EmailEntity entity = new EmailEntity();
		entity.setSubject("test");
		entity.setText("测试内容");
		entity.setTo("**@qq.com");
		emailSender.sendMail(entity);
	}
	
}
 

 

0
3
分享到:
评论
2 楼 zhangpeng0618 2012-09-17  
dfdfs[align=center][/align]
1 楼 wangwin123 2012-09-16  
思路很好,很多类没有粘出来!可否提供一下源码!

相关推荐

    C# 实现可以让亲友参与监督的每日每时总结软件,技术涉及委托事件 多线程 xml操作 邮件发送

    附带邮件提醒功能,让亲人朋友监督。主要用到xml操作和事件委托。 主要功能: 1、开启即启动显示昨天总结内容,并发送短信给亲友,另其监督 2、每一小时自动弹窗置顶,让你写这一小时的工作学习内容。 3、有周总结...

    快发邮件批处理 用于快速群发邮件

    对于账号为139移动邮箱还可以发送邮箱中的手机短信,及大的方便了不支持POP3收发邮件的邮箱实现批量发送邮件功能。邮件内容可以使用HTML邮件编辑。 多线程登录多个邮箱同时发送 ---快发邮件想不快都难。 目前系统...

    实现单线程多帐户的邮件收发程序

    功能表:一。...发邮件3。另存邮件4。另存附件5。删除邮件6。回复邮件二。帐户操作1。新建帐户2。删除帐户3。帐户设置三。地址簿操作1。手动添加地址2。自动添加地址3。删除地址4。地址设置5。地址回复

    Java调用SMTP命令发邮件,实现抄送,附件--无需邮件搭建邮件服务器直接发送(2013-8-20修改版)

    无需邮件搭建邮件服务器直接发送,改版加入了多线程,同时邮件日志采用文件和数据库同时记录,并写了定时器对于发送失败的邮件进行统计和重发(还在完善这个功能,该功能采用了Gearmand进行任务转发 ps:之前版本实际...

    Python django实现简单的邮件系统发送邮件功能

    本文实例讲述了Python django实现简单的邮件系统发送邮件功能。分享给大家供大家参考,具体如下: django邮件系统 Django发送邮件官方中文文档 总结如下: 1、首先这份文档看三两遍是不行的,很多东西再看一遍就通顺...

    PowerTCP Mail Tool—迅速实现专业邮件发送和接收功能的控

    为应用程序提供了电子邮件功能。PowerTCP Mail Tool可以让你创建、发送、读取、预览和编辑邮件信息,验证E-mail地址,以及用简单的属性和方法远程管理你的邮箱。包含SMTP、POP3和IMAP控件,另外还有一个强大的...

    Java调用SMTP命令发邮件,实现抄送,密送,附件等(10月最新版本)

    ava调用SMTP命令发邮件,实现抄送,密送,附件等。 无需邮件搭建邮件服务器直接发送,改版加入了多线程,同时邮件日志采用文件和数据库同时记录,并写了定时器对于发送失败的邮件进行统计和重发(三次)

    利德商务邮件发送通

    当您发送的邮件,具有收件人的退订连接,而同时您又能及时处理这些退订信件时,您所发的邮件就符合了国际惯例,使您远离垃圾邮件的"制造者"这一不光彩的角色。 商务邮件发送通(无需SMTP)是 集邮件发送、管理、...

    多线程、高性能采集器爬虫.net版源码,可采ajax页面

    1)支持多任务、多线程数据采集,同时支持一个采集任务多个 多线程、高性能采集器爬虫.net版源码,可采ajax页面 实例运行,即将采集任务规则与采集任务运行进行剥离,方便采集任务的配置、跟踪管理; 2)支持GET...

    python3+selenium实现qq邮箱登陆并发送邮件功能

    基于selenium,使用chrome浏览器,完成qq邮箱登陆并发送发邮件功能,暂时未封装。qq邮箱和126邮箱登陆还是有一些区别的。 #encoding=utf-8 from selenium import webdriver import time #启动chrome浏览器 driver =...

    Mailine 邮件信息平台 源代码

     5、多线程的设计与实现,同步的方法  6、网页编辑器(html邮件)的实现  7、解压缩源代码  8、Socks5代理服务器的实现  9、加解密源代码  10、Ping协议的实现,检测远程机器的连通性  11、使用MSXML...

    一个Delphi写的邮件收发软件

    概述:实现单线程多帐户的邮件收发及保存。 功能表: 一。邮件操作 1。收邮件 2。发邮件 3。另存邮件 4。另存附件 5。删除邮件 6。回复邮件 二。帐户操作 1。新建帐户 2。删除帐户 3。帐户设置 三。地址簿操作 1。...

    【项目源码分享】C++-IPC摄像头在线状态ping检测与告警邮件发送

    本C++源码实现了IPC摄像头在线ping检测以及设备网络异常告警邮件发送的功能,本源码可以供初学者及有工作经验的人员使用。 通过本源码你可以学习到: 1)如何对IP设备进行ping检测,当ping若干次都ping不通,则认为...

    smtp 邮箱发送企业工资条程序

    1.本程序解决企业发送工资条...2.通过多线程实现发工资条。 3.通过smtp协议验证邮箱和密码是否匹配,需要验证服务器。 4.通过smtp协议发送到邮件服务器验证邮箱地址是否存在。 5.具有excel导入、导出功能,更方便操作。

    小胖月android版

    使用android通用分享功能、邮件功能,还有android系统自带语音播报功能TTS,是个不错的学习demo。 适合人群:android初学者,具有一定编程基础,java基础,熟悉java多线程应用的同学。 能学到什么:①UI界面绘制、...

    EasyJWeb服务调度和自定义邮件引擎技术的CRM系统实战开发

    课程背景 CRM(客户关系系统)一直是企业中必备的软件系统,企业通过CRM系统,可以建立与客户之间的联系...以邮件任务为集合,将多个邮件变成邮件任务,然后通过线程和其他的一些控制手段,提高邮件发送的准确性。

    NET版抓取MAIL并群发邮件的小程序[源码]

    多线程爬取EMAIL与发送邮件的一个小程序。使用ACESS数据库作为后台数据操作支持。由于开发比较仓促没有对其进行没有和优化,只简单的实现了基本功能。 开放源码,供大家参考。

    C# 实现每日、每小时自我总结小软件。附带邮件提醒功能,让亲人朋友监督。主要用到xml操作和事件委托。

    附带邮件提醒功能,让亲人朋友监督。主要用到xml操作和事件委托。 主要功能: 1、开启即启动显示昨天总结内容,并发送短信给亲友,另其监督 2、每一小时自动弹窗置顶,让你写这一小时的工作学习内容。 3、有周总结...

    精准邮件收集营销系统 v1.0.rar

    精准邮件收集营销系统简介  “精准邮件收集营销系统”是专门针对中小企业及个人而开发出来的一套互联网自动化...⒚支持多线程发送,发送速度非其他程序可比。 ⒛自定义要获取的数据包括姓名、电话、QQ、邮箱、地址。

Global site tag (gtag.js) - Google Analytics