异步发送JavaMail

下面代码只要稍微修改几个地方就能直接使用, 亲们自取。 Tips: 不要用QQ邮箱发送

JavaEmailTest :

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Serializable;
import java.util.Date;
import java.util.Properties;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;

/**
 *
 * @ClassName: JavaEmailTest
 * @Description: 发送邮件
 * @author wenniuwuren
 * @date 2014-12-25 下午3:37:27
 *
 */
public class JavaEmailTest implements Serializable {

	private static final long serialVersionUID = -1;
	private static JavaEmailTest bean = new JavaEmailTest();

	// 发件人信息:帐号、密码、发件所用SMTP服务器(请到相关邮箱开启SMTP支持)
	private String fromEmailAccount = "[email protected]";// 发件人账号
	private String fromEmailPassword = "123456";// 发件人密码
	private Long affixFileSize = 1048576L * 10l;// 允许发送的最大附件大小(字节)
	private String emailServerIP = "smtp.163.com";// 服务器的IP或域名

	public static JavaEmailTest getBean(){
		return bean;
	}

	/**
	 * @see 发邮件
	 * @param toEmail 收件人地址
	 * @param title 邮件标题
	 * @param templetPath 模板路径(物理路径)
	 * @param args 模板中需要替换的值
	 * @param affixPath 附件的路径(物理路径)
	 * @return boolean
	 * */
	public Boolean sendEmail(String toEmail, String title, String templetPath,
			String []args, String affixPath) {
		Boolean result = false;
		try {
			Properties properties = new Properties();
			Session session = Session.getInstance(properties, null);
			properties.put("mail.smtp.host", emailServerIP);
			properties.put("mail.smtp.auth", "true");// smtp校验
			Transport transport = session.getTransport("smtp");
			transport.connect(emailServerIP, fromEmailAccount, fromEmailPassword);
			Message message = new MimeMessage(session);
			message.setSubject(title);// 邮件主题
			Address address[] = { new InternetAddress(fromEmailAccount) };
			message.addFrom(address);
			message.setRecipient(Message.RecipientType.TO, new InternetAddress(toEmail));// 收件人地址
			message.setSentDate(new Date());// 发送时间

			//start mail正文
			String content = readTemplet(templetPath);// 读取邮件模板的内容
			for (int i = 0; i < args.length; i++) {
				content = content.replace("{" + i + "}", args[i]);// 替换模板中的占位符
			}
			MimeMultipart multipart = new MimeMultipart();
			MimeBodyPart contentPart = new MimeBodyPart();
			contentPart.setDataHandler(new DataHandler(content, "text/html;charset=gbk"));// 正文内容
			multipart.addBodyPart(contentPart);// 正文
			if (null != affixPath && !"".equals(affixPath)) {
				File file = new File(affixPath);
				if (file.exists() && !file.isDirectory() && file.length() <= affixFileSize) {// 附件存在且小于10M
					MimeBodyPart affixPart = new MimeBodyPart();
					affixPart.setDataHandler(new DataHandler(new FileDataSource(affixPath)));// 读取附件
					affixPart.setFileName(MimeUtility.encodeText(file.getName()));//设置附件标题
					multipart.addBodyPart(affixPart);// 设置附件
				}
			}
			message.setContent(multipart);
			//end mail正文

			message.saveChanges();// 保存发送信息
			transport.sendMessage(message, message.getRecipients(Message.RecipientType.TO));// 发送邮件
			transport.close();
			result = true;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}

	// 读模板文件
	private String readTemplet(String templetPath) throws IOException {
		InputStream input = null;
		InputStreamReader read = null;
		BufferedReader reader = null;

		if (!new File(templetPath).exists()) {
			return "";
		}
		try {
			input = new FileInputStream(templetPath);
			read = new InputStreamReader(input, "UTF-8");
			reader = new BufferedReader(read);
			String line;
            String  result = "";
			while ((line = reader.readLine()) != null) {
				result += line + "\n";
			}
			return result.substring(result.indexOf("<html>"));
		} catch (Exception e) {
			e.printStackTrace();
			return "";
		} finally {
			reader.close();
			read.close();
			input.close();
		}
	}

	// 异步执行
	private Boolean asynchronizedExecutor(final String toEmail, final String title, final String templetPath,
			final String[] emailModel) {
		Boolean flag = Boolean.FALSE;
		FutureTask<Boolean> futureTask = null;
		ExecutorService excutorService = Executors.newCachedThreadPool();

		// 执行任务
		futureTask = new FutureTask<Boolean>(new Callable<Boolean>() {
			@Override
			public Boolean call() throws Exception {
				return bean.sendEmail(toEmail, title, templetPath, emailModel, templetPath);// 发送邮件;
			}

		});
		excutorService.submit(futureTask);
		try {
			// 任务没超时说明发送成功
			flag = futureTask.get(5L, TimeUnit.SECONDS);
		} catch (InterruptedException e) {
			futureTask.cancel(true);
			e.printStackTrace();
		} catch (ExecutionException e) {
			futureTask.cancel(true);
			e.printStackTrace();
		} catch (TimeoutException e) {
			futureTask.cancel(true);
			e.printStackTrace();
		} finally {
			excutorService.shutdown();
		}
		return flag;
	}

	public static void main(String[] args) {
		try {

			final String email = "[email protected];[email protected]";// 收件人地址(用;隔开可以发多人邮件)
			final String title = "圣诞快乐";// 邮件标题
			final String url = "https://www.google.com";
			final String img = "http://www.0756jy.cn/uploads/allimg/101210/6_101210102543_1.jpg"; // 图片地址
			final String templetPath = "E:\\你的具体放置地址\\MerryChrismas.txt"; // 邮件正文文档兼附件
			final String[] toEmails = email.split(";");

			for (int i = 0; i < toEmails.length; i++) {
				String[] emailModel = new String[]{ "文牛武人", "wenniuwuren", toEmails[i], url, url, url, img};// 邮件模板的参数设置
				System.out.println("发送状态:" + bean.asynchronizedExecutor(toEmails[i], title, templetPath, emailModel));
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

邮件正文格式 MerryChrismas.txt :

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk" />
<title>圣诞快乐</title>
</head>
<body>
尊敬的 {0}:<br/>
  您好!<br/>
  您的账户出现了异常<br/>
  您的用户名是:{1}<br/>
  您的邮箱地址是:{2}<br/>
  请<a href="{3}">点击</a>或复制这个网址去重新设置您的密码(24小时之内有效):<br/>
  <a href="{4}">{5}</a><br/>
  祝好!<br/>
  wenniuwuren<br/>
  <img src="{6}" border="0"/><br/>
</body>
</html>

所依赖的Jar包: mail-1.4.7.jar

时间: 2024-10-09 10:17:28

异步发送JavaMail的相关文章

【demo】自己写的一个 SpringMail 异步发送邮件的demo。 javamail 邮件异步发送

原文:[demo]自己写的一个 SpringMail 异步发送邮件的demo. javamail 邮件异步发送 源代码下载地址:http://www.zuidaima.com/share/1550463483120640.htm [demo]自己写的一个 SpringMail 异步发送邮件的demo. javamail 邮件异步发送 (注意 配置里面的账号跟发件人账号要一致) 1. 请各位在跑单元测试的时候,在 spring-mail.xml 文件中配置自己的邮箱账号和密码 (我已经注释掉了)

邮件发送JavaMail的开发

一.邮件开发用到的协议:SMTP.POP.RFC822.MIME SMTP:Simle Message Transfer Protocal 简单消息传输协议.发送邮件时使用的协议.描述了数据该如何表示.默认使用的端口:25 POP:Post Office Protocal邮局协议.接收邮件时使用的协议.默认使用的端口:110 二.手工发送邮件和接收邮件(熟练SMTP等协议的) [email protected]          usst1 [email protected]          

自己实现异步发送请求和图片

异步发送比同步发送请求有不阻塞主线程和支持多线程发送请求的好处. 异步发送请求可以抽象为标准的代理对象,具有使用方便,可扩充性强,只要你足够牛可以写出比第三方控件更牛的发送模块,由于是你自己写的,可以根据自己的意愿对请求的各种细节进行处理.这个异步发送请求处理模块也是对苹果代理具体实现的经典案例. chttpsendAsynchronousRequest.h #import <Foundation/Foundation.h> @protocol chttpsendAsynchronousDel

ActiveMQ(15):Message Dispatch的消息游标与异步发送

一.消息游标 1.1 简介 ActiveMQ发送持久消息的典型处理方式是:当消息的消费者准备就绪时,消息发送系统把存储的消息按批次发送给消费者, 在发送完一个批次的消息后,指针的标记位置指向下一批次待发送消息的位置,进行后续的发送操作.这是一种比较健壮 和灵活的消息发送方式,但大多数情况下,消息的消费者不是一直处于这种理想的活跃状态. 因此,从ActiveMQ5.0.0版本开始,消息发送系统采用一种混合型的发送模式,当消息消费者处理活跃状态时,允许消息发 送系统直接把持久消息发送给消费者,当消费

异步发送

/// <summary> /// 发送 改成异步发送了 /// </summary> /// <param name="userList"></param> /// <param name="message"></param> /// <param name="title"></param> /// <param name="noti

Slickflow.NET 开源工作流引擎基础介绍(十)--邮件轮询异步发送模块集成

前言:在任务数据生成时,为了让办理任务的用户及时获取到待办任务的主题和内容,需要发送通知类的消息,而电子邮件和手机端的短信通知则是比较普通的消息发送.本文是针对电子邮件异步发送模块的实现来做实例说明. 1. 邮件发送通知的位置 通常任务数据生成时,就需要发送一封邮件通知,邮件内容包括正文和页面地址信息:任务办理人员在接收到邮件后,会及时登录系统进行任务处理,发送邮件通知的好处就在于方便和及时. 但是邮件发送并不是所有的业务客户都需要的一个功能,它不便于紧耦合地在引擎流转环节,即跟任务数据的生成绑

关于高并发下kafka producer send异步发送耗时问题的分析

最近开发网关服务的过程当中,需要用到kafka转发消息与保存日志,在进行压测的过程中由于是多线程并发操作kafka producer 进行异步send,发现send耗时有时会达到几十毫秒的阻塞,很大程度上上影响了并发的性能,而在后续的测试中发现单线程发送反而比多线程发送效率高出几倍.所以就对kafka API send 的源码进行了一下跟踪和分析,在此总结记录一下. 首先看springboot下 kafka producer 的使用 在config中进行配置,向IOC容器中注入DefaultKa

Java秒杀系统实战系列~整合RabbitMQ实现消息异步发送

摘要: 本篇博文是“Java秒杀系统实战系列文章”的第八篇,在这篇文章中我们将整合消息中间件RabbitMQ,包括添加依赖.加入配置信息以及自定义注入相关操作组件,比如RabbitTemplate等等,最终初步实现消息的发送和接收,并在下一篇章将其与邮件服务整合,实现“用户秒杀成功发送邮件通知消息”的功能! 内容: 对于消息中间件RabbitMQ,想必各位小伙伴没有用过.也该有听过,它是一款目前市面上应用相当广泛的消息中间件,可以实现消息异步通信.业务服务模块解耦.接口限流.消息分发等功能,在微

rocketmq的同步发送、oneway发送、异步发送怎么做的?

在sendDefaultImpl方法里面: for (; times < timesTotal; times++) { String lastBrokerName = null == mq ? null : mq.getBrokerName(); MessageQueue mqSelected = this.selectOneMessageQueue(topicPublishInfo, lastBrokerName); if (mqSelected != null) { mq = mqSelec