`

使用apache commons组件发送邮件

阅读更多
package com.sf.novatar.plf.utils;

import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.MessagingException;
import javax.mail.internet.AddressException;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeUtility;
import javax.servlet.ServletContext;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.mail.Email;
import org.apache.commons.mail.MultiPartEmail;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.sf.novatar.context.AppContext;
import com.sf.novatar.plf.bean.MailCommBean;

public class MailCommon extends Exception {

	/**
	 *
	 */
	private static final long serialVersionUID = 768194185976826713L;
	
	private final static Logger logger = LoggerFactory.getLogger(MailCommon.class);

	final public static int SIMPLE_MAIL = 0;

	final public static int MUTIL_MAIL = 1;

	/** 发件方式 - 普通发送 */
	final public static int TO = 0;

	/** 发件方式 - 抄送 */
	final public static int CC = 1;
	/** 发件方式 - 抄送人邮件地址 */
	private String addChaoSong = null;

	/** 发件方式 - 密件抄送 */
	final public static int BCC = 2;

	private int mailType = 0;

	/** 邮件内容 */
	private String mailContent = null;

	/** 邮件相关信息 - SMTP 服务器 */
	private String mailSMTPHost = null;

	private String mailSMTPHostPort = "25";

	/** 邮件相关信息 - 邮件用户名 */
	private String mailUser = null;

	/** 邮件相关信息 - 密码 */
	private String mailPassword = null;

	/** 邮件相关信息 - 发件人邮件地址 */
	private String mailFromAddress = null;

	/** 邮件相关信息 - 邮件主题 */
	private String mailSubject = "";

	/** 邮件相关信息 - 邮件发送地址 */
	private String[] mailTOAddress = null;

	/** 邮件相关信息 - 邮件抄送地址 */
	private String[] mailCCAddress = null;

	/** 邮件相关信息 - 邮件密件抄送地址 */
	private String[] mailBCCAddress = null;

	/** 邮件相关信息 - 邮件正文(复合结构) */
	private javax.mail.internet.MimeMultipart mailBody = null;

	private MultiPartEmail mailclass = null;

	private boolean debug = false;

	private boolean result = false;
	
	/** 邮件相关信息 - 邮件發送方顯示名 */
	private String mailShowName = "SF Express";
	
	
	private Log log = LogFactory.getLog(MailCommon.class);

	public boolean isDebug() {
		return debug;
	}

	public void setDebug(boolean debug) {
		this.debug = debug;
	}

	public MailCommon() {
		mailBody = new javax.mail.internet.MimeMultipart();
	}

	/**
	 * 设置 SMTP 服务器
	 *
	 * @param strSMTPHost
	 *            邮件服务器名称或 IP
	 * @param strUser
	 *            邮件用户名
	 * @param strPassword
	 *            密码
	 */
	public void setSMTPHost(String strSMTPHost, String port, String strUser,
			String strPassword) {
		this.mailSMTPHost = strSMTPHost;
		this.mailUser = strUser;
		this.mailPassword = strPassword;
		if (port != null && !port.equals("")) {
			this.mailSMTPHostPort = port;
		}
	}

	/**
	 * 设置邮件发送地址
	 *
	 * @param strFromAddress
	 *            邮件发送地址
	 */
	public void setFromAddress(String strFromAddress) {
		this.mailFromAddress = strFromAddress;
	}
	
	/**
	 * 设置邮件发送地址
	 *
	 * @param strFromAddress
	 *            邮件发送地址
	 * @param mailShowName
	 *            邮件顯示名
	 */
	public void setFromAddress(String strFromAddress, String mailShowName) {
		this.mailFromAddress = strFromAddress;
		this.mailShowName = mailShowName;
	}

	/**
	 * 设置邮件目的地址
	 *
	 * @param strAddress
	 *            邮件目的地址列表, 不同的地址可用;号分隔
	 * @param iAddressType
	 *            邮件发送方式 (TO 0, CC 1, BCC 2) 常量已在本类定义
	 * @throws AddressException
	 */
	public void setAddress(String strAddress, int iAddressType)
			throws Exception {
		String[] mailAddr = strAddress.split(",");
		switch (iAddressType) {
		case MailCommon.TO: {
			mailTOAddress = mailAddr;
			break;
		}
		case MailCommon.CC: {
			mailCCAddress = mailAddr;
			break;
		}
		case MailCommon.BCC: {
			mailBCCAddress = mailAddr;
			break;
		}
		}
	}

	/**
	 * 设置邮件主题
	 *
	 * @param strSubject
	 *            邮件主题
	 */
	public void setSubject(String strSubject) {
		this.mailSubject = strSubject;
	}

	/**
	 * 设置邮件文本正文
	 *
	 * @param strTextBody
	 *            邮件文本正文
	 * @throws MessagingException
	 */
	public void setTextBody(String strTextBody) throws Exception {
		MimeBodyPart mimebodypart = new MimeBodyPart();
		mimebodypart.setText(strTextBody, "UTF-8");
		mailBody.addBodyPart(mimebodypart);
		mailContent = strTextBody;
	}

	/**
	 * 设置邮件超文本正文
	 *
	 * @param strHtmlBody
	 *            邮件超文本正文
	 * @throws MessagingException
	 */
	public void setHtmlBody(String strHtmlBody) throws Exception {
		MimeBodyPart mimebodypart = new MimeBodyPart();
		mimebodypart.setDataHandler(new DataHandler(strHtmlBody,
				"text/html;charset=UTF-8"));
		mailBody.addBodyPart(mimebodypart);
		mailContent = strHtmlBody;
	}

	/**
	 * 设置邮件正文外部链接 URL, 信体中将包含链接所指向的内容
	 *
	 * @param strURLAttachment
	 *            邮件正文外部链接 URL
	 * @throws MessagingException
	 * @throws MalformedURLException
	 */
	public void setURLAttachment(String strURLAttachment) throws Exception {
		MimeBodyPart mimebodypart = new MimeBodyPart();
		mimebodypart.setDataHandler(new DataHandler(new URL(strURLAttachment)));
		mailBody.addBodyPart(mimebodypart);
		this.mailType = MUTIL_MAIL;
	}

	/**
	 * 设置邮件附件
	 *
	 * @param strFileAttachment
	 *            文件的全路径
	 * @throws MessagingException
	 * @throws UnsupportedEncodingException
	 */
	public void setFileAttachment(String strFileAttachment) throws Exception {
		File path = new File(strFileAttachment);
		if (!path.exists() || path.isDirectory()) {
			throw new Exception("文件不存在!");
		}
		String strFileName = path.getName();
		MimeBodyPart mimebodypart = new MimeBodyPart();
		mimebodypart.setDataHandler(new DataHandler(new FileDataSource(
				strFileAttachment)));
		mimebodypart.setFileName(MimeUtility.encodeText(strFileName));
		mailBody.addBodyPart(mimebodypart);
		this.mailType = MUTIL_MAIL;
	}

	/**
	 * 设置邮件图片附件
	 *
	 * @param strFileAttachment
	 *            文件的全路径
	 * @throws MessagingException
	 * @throws UnsupportedEncodingException
	 */
	public void setImgFileAttachment(String strFileAttachment, String fileNum)
			throws Exception {
		File path = new File(strFileAttachment);
		if (!path.exists() || path.isDirectory()) {
			throw new Exception("文件不存在!");
		}
		String strFileName = path.getName();
		MimeBodyPart mimebodypart = new MimeBodyPart();
		mimebodypart.setDataHandler(new DataHandler(new FileDataSource(
				strFileAttachment)));
		mimebodypart.setFileName(MimeUtility.encodeText(strFileName));
		mailBody.setSubType("related");
		mimebodypart.setHeader("Content-ID", "IMG" + fileNum);
		mailBody.addBodyPart(mimebodypart);
		this.mailType = MUTIL_MAIL;
	}

	/**
	 * 邮件发送(一次发送多个地址, 优点速度快, 但是有非法邮件地址时将中断发送操作)
	 *
	 * @throws MessagingException
	 */
	public void sendBatch() throws Exception {

		mailclass = new MultiPartEmail();
		mailclass.setDebug(this.debug);
	try{
		if (mailTOAddress != null) {
			for (int i = 0; i < this.mailTOAddress.length; i++) {
				mailclass.addTo(mailTOAddress[i]);
			}
		}
		if (mailCCAddress != null) {
			for (int i = 0; i < this.mailCCAddress.length; i++) {
				mailclass.addCc(mailCCAddress[i]);
			}
		}
		if (mailBCCAddress != null) {
			for (int i = 0; i < this.mailBCCAddress.length; i++) {
				mailclass.addBcc(mailBCCAddress[i]);

			}
		}

		mailclass.setHostName(this.mailSMTPHost);
		mailclass.setSmtpPort(Integer.parseInt(this.mailSMTPHostPort));

		//設置郵箱显示名
		if(this.mailShowName != null ){
			mailclass.setFrom(this.mailFromAddress, this.mailShowName);
		}else{
			mailclass.setFrom(this.mailFromAddress, this.mailUser);
		}
//设置是否验证用户名和密码
// 		mailclass.setAuthentication(this.mailUser, this.mailPassword);

		mailclass.setSubject(this.mailSubject);
		if (SIMPLE_MAIL == mailType) {
			mailclass.setCharset("UTF-8");
			mailclass.setMsg(mailContent);
		} else {
			mailclass.setContent(mailBody);
		}
		// 增加需要回执的标记
		mailclass.addHeader("Disposition-Notification-To", "1");
		mailclass.send();
		result = true;
	}catch(Exception e){
		log.error("发件箱: " + this.mailFromAddress + "用户名: " + this.mailUser + "密码: " + this.mailPassword);
		throw new Exception();
	}
		if (result) {
			System.out.println("已向下列邮箱发送了邮件");
			if (mailTOAddress != null) {
				for (int i = 0; i < mailTOAddress.length; i++) {
					System.out.println(mailTOAddress[i]);
				}
			}
			if (mailCCAddress != null) {
				for (int i = 0; i < mailTOAddress.length; i++) {
					System.out.println(mailCCAddress[i]);
				}
			}
			if (mailBCCAddress != null) {
				for (int i = 0; i < mailTOAddress.length; i++) {
					System.out.println(mailBCCAddress[i]);
				}
			}
		}
	}
	
	/**
	 * 邮件发送(不需要回执,且返回发送结果)
	 * @return boolean 返回结果
	 * @throws MessagingException
	 */
	public boolean send() throws Exception {
		mailclass = new MultiPartEmail();
		mailclass.setDebug(this.debug);
		if (mailTOAddress != null) {
			for (int i = 0; i < this.mailTOAddress.length; i++) {
				mailclass.addTo(mailTOAddress[i]);
			}
		}
		if (addChaoSong != null) {
			String[] mailAddr = addChaoSong.split(",");
			for (int i = 0; i < mailAddr.length; i++) {
				mailclass.addCc(mailAddr[i]);
			}
		}
		mailclass.setHostName(this.mailSMTPHost);
		mailclass.setSmtpPort(Integer.parseInt(this.mailSMTPHostPort));
		//設置郵箱显示名
		if(this.mailShowName != null ){
			mailclass.setFrom(this.mailFromAddress, this.mailShowName);
		}else{
			mailclass.setFrom(this.mailFromAddress, this.mailUser);
		}
		
//		mailclass.setAuthentication(this.mailUser, this.mailPassword);
		mailclass.setSubject(this.mailSubject);
		if (SIMPLE_MAIL == mailType) {
			mailclass.setCharset("UTF-8");
			mailclass.setMsg(mailContent);
		} else {
			mailclass.setContent(mailBody);
		}
		// 不需要回执的标记
		mailclass.send();
		result = true;
		
		return result;
	}
	
	public String getMailContent() {
		return mailContent;
	}

	public void setMailContent(String mailContent) {
		this.mailContent = mailContent;
	}

	public Email getMailclass() {
		return mailclass;
	}

	public void setMailclass(MultiPartEmail mailclass) {
		this.mailclass = mailclass;
	}

	public int getMailType() {
		return mailType;
	}

	public void setMailType(int mailType) {
		this.mailType = mailType;
	}

	public String getMailShowName() {
		return mailShowName;
	}

	public void setMailShowName(String mailShowName) {
		this.mailShowName = mailShowName;
	}

	public String getAddChaoSong() {
		return addChaoSong;
	}

	public void setAddChaoSong(String addChaoSong) {
		this.addChaoSong = addChaoSong;
	}
	
	/**邮件发送通用方法
	 * @author sfit1092
	 * @param mailHost
	 * @param fromMailAddr
	 * @param fromMailUser
	 * @param fromMailPwd
	 * @param filePath
	 * @param contentHTML
	 * @param title
	 * @param reciveAddress(多个联系人用","分隔)
	 * @return
	 */
	/*public static boolean sentMail(String mailHost, String fromMailAddr, String fromMailUser, String fromMailPwd, String filePath, String contentHTML, String title, String reciveAddress) {
		try {
			MailCommon mail = new MailCommon();
			mail.setAddress(reciveAddress.trim(), MailCommon.TO);
			mail.setFromAddress(fromMailAddr);
			mail.setSMTPHost(mailHost, null, fromMailUser, fromMailPwd);
			if (!"".equals(filePath)) {
				mail.setFileAttachment(filePath);
			} else {
				mail.setMailType(1);
			}
			mail.setSubject(new String(title.getBytes("UTF-8"), "UTF-8"));
			mail.setHtmlBody(contentHTML);
			mail.send();
			return true;
		} catch (Exception e) {
			logger.error("邮件发送异常!");
			return false;
		}
	}*/
	public static boolean sentMail(String toAddress, String title, String htmlContent, String filePath) {
		ServletContext ctx = AppContext.getContext().getServletContext();
		String mailHost = ctx.getAttribute("mail.host")==null?"":ctx.getAttribute("mail.host").toString();
		String mailAddress = ctx.getAttribute("mail.address")==null?"":ctx.getAttribute("mail.address").toString();
//		String mailUser = ctx.getAttribute("mail.user")==null?"":ctx.getAttribute("mail.user").toString();
//		String mailPassword = ctx.getAttribute("mail.password")==null?"":ctx.getAttribute("mail.password").toString();
		String mailUser = com.sf.novatar.context.AppContext.getContext().getConfigProperties().getProperty("mail.user");
		String mailPassword = com.sf.novatar.context.AppContext.getContext().getConfigProperties().getProperty("mail.password");
		
		MailCommon mail = new MailCommon();
		mail.mailUser = mailUser;
		mail.mailPassword = mailPassword;
		try {
			mail.setAddress(toAddress.trim(), MailCommon.TO);
			mail.setFromAddress(mailAddress);
			mail.setSMTPHost(mailHost, null, mailUser, mailPassword);
			if (!"".equals(filePath)) {
				mail.setFileAttachment(filePath);
			} else {
				mail.setMailType(1);
			}
			mail.setSubject(new String(title.getBytes("UTF-8"), "UTF-8"));
			mail.setHtmlBody(htmlContent);
			mail.send();
			return true;
		} catch (Exception e) {
			logger.error("邮件发送异常!"+e.getLocalizedMessage());
			return false;
		}
	}
}
分享到:
评论

相关推荐

    commons-email-1.3.2-bin.zip

    Apache commons-email组件发送邮件所需使用的jar文件

    V512工作室Java web的ppt

    第16章 讲解使用Apache Commons FileUpload实现文件上传,同时讲解了JavaMail和如何运用Apache Commons Email组件发送邮件。 第17章 讲解DAO设计模式和分页显示,同时还讲解了Displaytag与Pager标记库。 第18章讲解...

    异步HttpClient

    所有关键注释都已经写了,如有不明白可以发送邮件 ath.qu.trues@gmail.com 代码分为3个maven模块。 commons-ext : 实现Promise commons-tools: 实现 异步httpclient commons-parent:父模块 测试代码在 commons-...

    java开源包10

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包8

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包1

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包11

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包2

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包3

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包6

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包5

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包4

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包7

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包9

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    java开源包101

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    Java资源包01

    Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能,该项目是 LinkedIn 公司...

    JAVA上百实例源码以及开源项目

     //给客户发一个感谢消息,消息驱动Bean必须实现两个接口MessageDrivenBean和MessageListener  在对象创建的过程中将被容器调用,onMessage函数方法接收消息参数,将其强制转型为合适的消息类型,同时打印出消息...

    JAVA上百实例源码以及开源项目源代码

    Message-Driven Bean EJB实例源代码 2个目标文件 摘要:Java源码,初学实例,EJB实例 Message-Driven Bean EJB实例源代码,演示一个接收购物订单的消息驱动Bean,处理这个订单同时通过e-mail的形式 //给客户发一个感谢...

Global site tag (gtag.js) - Google Analytics