`
kjkhi
  • 浏览: 185128 次
  • 性别: 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  
思路很好,很多类没有粘出来!可否提供一下源码!

相关推荐

    多线程智能发送邮件

    接下来,**Smtp发邮件及配置** 是实现邮件发送的核心。SMTP(Simple Mail Transfer Protocol)是互联网标准协议,用于发送电子邮件。开发者需要配置SMTP服务器的连接参数,并使用SMTP客户端库(如Python的smtplib,...

    多线程定时任务邮件服务

    总之,多线程定时任务邮件服务是Java开发中一项实用的功能,它综合运用了多线程、定时任务、邮件发送和数据库操作等技术,旨在提升系统的自动化程度和信息传递效率。在实际开发中,我们需要关注并发控制、任务调度、...

    基于Python实现多进程的发送邮件.zip

    本课程设计的目标是利用Python实现多进程发送邮件的功能。 首先,我们需要了解Python中的`multiprocessing`模块,它是Python提供的一个标准库,用于实现多进程。通过创建子进程,每个进程可以独立地执行任务,互不...

    关于《多线程定时任务邮件服务》说明

    在IT行业中,多线程定时任务邮件服务是一个常见的需求,特别是在服务器管理和自动化运维场景下。这个服务能够定期执行某些任务,并通过电子邮件的方式将结果或通知发送给相关人员。下面,我们将详细探讨这一主题。 ...

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

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

    C#实现定时发送邮件功能

    在本示例中,我们关注的是如何利用C#实现一个定时发送邮件的功能。这个功能通常在需要定期向用户发送通知、报告或其他重要信息的场景下非常有用。我们将探讨以下几个关键知识点: 1. **System.Net.Mail**: 这是.NET...

    .Net版多线程邮件自动发送软件

    标题中的".Net版多线程邮件自动发送软件"是指一个基于.NET框架开发的程序,它具备多线程功能,能够高效地批量发送电子邮件。多线程技术是编程中提高程序执行效率的重要手段,特别是在需要处理大量并发任务时,如本例...

    .Net用线程来实现定时发送邮件

    总之,".Net用线程来实现定时发送邮件"这个项目结合了.NET的多线程技术、定时器和电子邮件服务,创建了一个能够按预定时间间隔自动发送邮件的实用工具。开发者可以借此学习和理解如何在.NET环境中实现并发和定时任务...

    多线程发邮件MailThreadCallble学习资料分享c

    在这个"多线程发邮件MailThreadCallble学习资料分享c"的主题中,我们主要探讨的是如何利用Java的多线程技术来实现高效的邮件发送功能。下面将详细讲解相关知识点。 1. **线程基础**:在Java中,线程是程序执行的...

    Multi Mail 2.0┊同时多个线程发送大量邮件到指定SMTP服务器┊英文绿色免费版

    **Multi Mail 2.0** 是一款专门设计用于批量发送电子邮件的软件,它支持通过多线程技术同时向指定的SMTP服务器发送大量的邮件。这款工具的主要特点在于其高效的多线程处理能力,使得邮件发送速度得以显著提升,尤其...

    php swoole 多进程发送邮件

    在PHP开发中,为了提升效率和性能,我们经常会利用Swoole扩展来实现异步、并行处理任务,比如批量发送...在实际应用中,开发者需要理解并掌握多进程编程、Swoole特性和邮件发送的相关知识,才能有效地实现这一功能。

    Android发送邮件功能实现

    在Android平台上实现邮件发送功能是一项常见的任务,尤其对于开发者来说,了解如何正确地集成和使用邮件服务至关重要。这里我们将深入探讨如何使用`commons-net-3.3.jar`和`mail.jar`这两个核心邮件包来实现在...

    实现邮件发送功能的c++代码(c++经典案例)

    关于C++的特性,此案例可能会用到模板、异常处理、流(iostream)操作、STL(Standard Template Library)容器,如字符串和向量,以及可能的多线程(并发发送邮件)。模板可以实现代码重用,异常处理保证程序在遇到...

    email多线程异步发送设计文档

    总结,设计一个高效的多线程异步邮件发送系统需要结合多线程、异步编程以及邮件处理的专业知识。通过合理利用线程池、异步任务提交和错误处理机制,我们可以创建一个高效、稳定的邮件发送服务。在实际项目中,应根据...

    C语言实现基于SMTP协议发送邮件.zip

    8. **多线程或异步处理**:如果需要同时发送多封邮件,可以考虑使用多线程或异步I/O技术,提高程序效率。 在这个“SendMail-master”项目中,开发者可能已经实现了上述功能,并提供了示例代码供学习。分析和理解这...

    ASP.NET MVC 发送邮件,支持多个邮箱格式。

    本篇文章将详细介绍如何利用 C# 和 ASP.NET MVC 实现发送邮件的功能,并支持多个邮箱格式。 #### 二、关键组件介绍 1. **MailMessage 类**:这是用于构建邮件信息的对象,包括发件人、收件人、主题和内容等。 - `...

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

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

    多线程计数实现多线程执行后再执行主线程

    ### 多线程计数实现多线程执行后再执行主线程 #### 一、知识点概述 本文将深入探讨如何利用`CountDownLatch`机制来确保多个子线程完成各自的任务后,再让主线程继续执行的方法。这种方法在项目开发中非常实用,...

    c#实现邮件功能

    本文将详细介绍如何使用C#的`System.Net.Mail`命名空间来实现邮件功能。 首先,你需要引入`System.Net.Mail`命名空间,这样就可以使用其中的类和方法了。在C#代码文件的开头添加以下引用: ```csharp using System...

    java实现发送邮件jar文件

    这个"java实现发送邮件jar文件"是JavaMail的一个实现,封装了SMTP(简单邮件传输协议)和其他相关协议,使得开发者能够轻松地集成邮件功能到他们的项目中。 在Java中实现邮件发送,首先需要引入JavaMail的相关依赖...

Global site tag (gtag.js) - Google Analytics