SendMailSAOImpl.java
package com.paic.batch.sao.impl;
import javax.mail.Message;
import javax.mail.Session;
import org.apache.log4j.Logger;
import com.paic.batch.sao.SendMailSAO;
import com.paic.batch.util.MailUtils;
import com.paic.batch.util.StrUtil;
/**
* 自定义邮件发送服务接口
*
* @date 2014-07-18
*/
public class SendMailSAOImpl implements SendMailSAO {
private static Logger logger = Logger.getLogger(SendMailSAOImpl.class);
/** eMail以HTML发送编码格式 */
private final static String ENCODING = "UTF-8";
private Session defaultSession = null;
private static String DO_MAIN = "pingan.com.cn";
private java.util.Properties props;
public java.util.Properties getProps() {
return props;
}
public void setProps(java.util.Properties props) {
this.props = props;
}
/**
* 自定义邮件初始化
*/
private void init() {
try {
defaultSession = Session.getInstance(props);
String domain = defaultSession.getProperty("mail.default.domain");
if (StrUtil.isEmpty(domain)) {
throw new Exception("默认邮件发送DOMAIN配置为空,domain=" + domain);
} else {
DO_MAIN = domain;
}
} catch (Throwable e) {
logger.error("自定义邮件初始化失败", e);
}
}
/**
* 发送邮件
*
* @param sFrom
* 发件人 --一律为: LPMS-ADMIN@pingan.com.cn
* @param sTo
* 收件人列表
* @param sSubject
* 标题
* @param sContent
* 邮件内容
*/
@SuppressWarnings("static-access")
public void sendEmail(String sFrom, String[] sTo,
String sSubject, String sContent)
throws Exception {
try {
this.init();
logger.debug(new StringBuilder("SendMailDaoImpl.sendMessage发件人:")
.append(sFrom).append("收件人列表:").append(sTo).append("标题:")
.append(sSubject).append("邮件内容:").append(sContent));
sTo = this.appendDoMain(sTo);
if (StrUtil.isEmpty((sFrom))) {
throw new Exception("发件人为空。sFrom=" + sFrom);
}
sFrom = this.processDomain(sFrom, DO_MAIN);
Message message = message = MailUtils.createHtmlMessage(defaultSession, ENCODING,
sFrom, sTo, null, sSubject, sContent);
logger.debug(new StringBuilder("message创建成功:").append(message)
.append("开始发送Email请求"));
long startTime = System.currentTimeMillis();
// 发送邮件
javax.mail.Transport.send(message);
long endTime = System.currentTimeMillis();
logger.debug(new StringBuilder("邮件发送请求成功!共计花费:").append(
(endTime - startTime)).append("ms"));
} catch (Throwable ex) {
StringBuffer message = new StringBuffer();
message.append("'").append(sFrom).append("'").append(" 发送邮件给'");
for (int i = 0; i < sTo.length; i++) {
message.append(sTo[i]).append(",");
message.append(" '失败");
}
throw new Exception("sendMessage:" + message.toString() + ex);
}
}
/**
* 追加默认domain
*
* @param strs
* @return
* @throws Exception
*/
private String[] appendDoMain(String[] strs) throws Exception {
if (strs == null)
return null;
strs = processDomain(strs, DO_MAIN);
if ((null != strs) && (0 < strs.length)) {
StringBuffer logInfo = new StringBuffer("发送邮件给" + strs.length
+ "个收件人。\n");
for (int i = 0, n = strs.length; i < n; i++) {
logInfo.append("收件人:").append(strs[i]).append("\n");
}
logger.debug(logInfo.toString());
}
return strs;
}
/**
* 处理邮件接收人
*
* @param receiver
* @param domain
* @return
* @throws Exception
*/
private String[] processDomain(String[] receiver, String domain)
throws Exception {
if ((null != receiver) && (0 < receiver.length)) {
String[] receivers = new String[receiver.length];
for (int i = 0; i < receiver.length; i++) {
receivers[i] = processDomain(receiver[i], domain);
}
return receivers;
} else {
logger.error("邮件接收人列表为空。receiver=" + receiver.toString());
}
return receiver;
}
/**
* 重载处理邮件接收人
*
* @param name
* @param domain
* @return
*/
private static String processDomain(String name, String domain) {
if (StrUtil.isEmpty((name))) {
logger.error("地址为空:" + name);
return null;
}
return ((null != name) && (0 > name.indexOf("@"))) ? (name + "@" + domain)
: name;
}
}
============================================================
spring-mail.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="emailProperties" class="java.util.Properties">
<constructor-arg>
<props>
<prop key="mail.smtp.host">
${mail.smtp.host}
</prop>
<prop key="mail.smtp.port">
${mail.smtp.port}
</prop>
<prop key="mail.default.domain">
${mail.default.domain}
</prop>
====================================================
spring-placeholders.properties
#邮件配置
mail.smtp.host= devsmtprelay.paic.com.cn
mail.smtp.port=25
mail.default.domain=paic.com.cn
=====================================================
eMailUtil.java
package com.paic.batch.util;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.internet.AddressException;
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;
import org.apache.log4j.Logger;
/**
* 邮件工具类
*
* @date 2014/08/05
*/
public class MailUtils {
private final static Logger logger = Logger.getLogger(MailUtils.class);
private final static String TEXT_MAIL = "textMail";
private final static String HTML_MAIL = "htmlMail";
/**** 以纯文本的形式 <h2>带附件 </h2>发邮件
* 构造一个Message
* @param session 邮件的session
* @param sFrom 发件人
* @param sTo 收件人
* @param sCC 抄送人
* @param sSubject 标题
* @param sContent 内容 (text格式)
* @param sFileName 附件文件名
* @return 构造完的Message
* @throws Exception
*/
public static Message createTextMessage(Session session,String sFrom,
String[] sTo,String[] sCC,
String sSubject, String sContent,
String[] sFileName) throws Exception{
return createMessage(session, null, sFrom, sTo, sCC, sSubject, sContent, sFileName, TEXT_MAIL);
}
/**** 以纯文本的形式 <h2>不带附件</h2> 发邮件
* 构造一个Message
* @param session 邮件的session
* @param sFrom 发件人
* @param sTo 收件人
* @param sCC 抄送人
* @param sSubject 标题
* @param sContent 内容 (text格式)
* @return 构造完的Message
* @throws Exception
*/
public static Message createTextMessage(Session session,String sFrom,
String[] sTo,String[] sCC,
String sSubject, String sContent
) throws Exception {
return createMessage(session, null, sFrom, sTo, sCC, sSubject, sContent, null, TEXT_MAIL);
}
/*** 以html的形式发邮件<h2>不带附件</h2> 发邮件
* 构造一个Message
* @param session 邮件的session
* @param sEncoding 信息编码
* @param sFrom 发件人
* @param sTo 收件人
* @param sCC 抄送人
* @param sSubject 标题
* @param sContent 内容 ( html格式)
* @param flag (HtmlMail:构造Multipart格式 TextMail:添加html格式的文本内容)
* @return 构造完的Message
* @throws Exception
*/
public static Message createHtmlMessage(Session session, String sEncoding,
String sFrom, String[] sTo,String[] sCC,
String sSubject, String sContent
) throws Exception {
return createMessage(session, sEncoding, sFrom, sTo, sCC, sSubject, sContent, null, HTML_MAIL);
}
/*** 以html的形式发邮件 <h2>带附件 </h2>发邮件
* 构造一个Message
* @param session 邮件的session
* @param sEncoding 信息编码
* @param sFrom 发件人
* @param sTo 收件人
* @param sCC 抄送人
* @param sSubject 标题
* @param sContent 内容 ( html格式)
* @param sFileName 附件文件名
* @param flag (HtmlMail:构造Multipart格式 TextMail:添加html格式的文本内容)
* @return 构造完的Message
* @throws Exception
*/
public static Message createHtmlMessage(Session session, String sEncoding,
String sFrom, String[] sTo,String[] sCC,
String sSubject, String sContent,
String[] sFileName) throws Exception {
return createMessage(session, sEncoding, sFrom, sTo, sCC, sSubject, sContent, sFileName, HTML_MAIL);
}
/**
* 构造一个Message
* @param session 邮件的session
* @param sEncoding 信息编码
* @param sFrom 发件人
* @param sTo 收件人
* @param sCC 抄送人
* @param sSubject 标题
* @param sContent 内容 ( html格式)
* @param sFileName 附件文件名
* @param flag (HtmlMail:构造Multipart格式 TextMail:添加html格式的文本内容)
* @return 构造完的Message
* @throws Exception
*/
private static Message createMessage(Session session, String sEncoding,
String sFrom, String[] sTo,String[] sCC,
String sSubject, String sContent,
String[] sFileName,String flag) throws Exception{
MimeMessage message = new MimeMessage(session);
InternetAddress from = null;
InternetAddress[] to = null;
InternetAddress[] cc = null;
logger.debug("===============================进入邮件工具类,开始进行Message对象!");
try {
logger.debug("===============================开始构建发件人的InternetAddress对象--------");
from = new InternetAddress(sFrom);
logger.debug("===============================已经完成构建发件人的InternetAddress对象:"+from);
} catch (AddressException ex) {
throw new Exception(sFrom, ex);
}
if (sTo != null) {
int i = 0;
try {
logger.debug("===============================开始构建收件人的InternetAddress对象--------");
to = new InternetAddress[sTo.length];
for (i = 0; i < sTo.length; i++) {
to[i] = new InternetAddress( sTo[i]);
}
logger.debug("===============================已经完成构建收件人的InternetAddress对象:"+to);
} catch (AddressException ex) {
throw new Exception(sTo[i], ex);
}
}
if (sCC != null) {
int i = 0;
try {
logger.debug("===============================开始构建抄送人的InternetAddress对象--------");
cc = new InternetAddress[sCC.length];
for (i = 0; i < sCC.length; i++) {
cc[i] = new InternetAddress( sCC[i]);
}
logger.debug("===============================已经完成构建抄送人的InternetAddress对象:"+cc);
} catch (AddressException ex) {
throw new Exception(sCC[i], ex);
}
}
try {
if(to == null && cc == null){
logger.error("===============================message构建异常:主发件人和超送人都为null.....抛出异常");
throw new Exception("===============================message构建异常:主发件人和超送人都为null.....抛出异常");
}
// 添加邮件信息的基本参数
message.setFrom(from);
if(to != null){
message.addRecipients(Message.RecipientType.TO, to);
}
if(cc != null){
message.addRecipients(Message.RecipientType.CC, cc);
}
// message.setHeader("Content-Type", "text/html;charset=" + sEncoding);
message.setSentDate(new Date());
message.setSubject( sSubject );
// 构造Multipart格式
Multipart mp = new MimeMultipart();
// 添加html格式的文本内容
MimeBodyPart mbpContent = new MimeBodyPart();
if(flag != null && flag.equals(HTML_MAIL)){
logger.debug("===============================以html的形式发送邮件中,编码格式为:"+sEncoding);
mbpContent.setContent(sContent, "text/html;charset=" + sEncoding); //这里设置发送的邮件内容以HTML格式发送
}
if(flag != null && flag.equals(TEXT_MAIL)){
logger.debug("===============================以纯文本的形式发送邮件中");
mbpContent.setText(sContent); //这里设置发送的内容以纯文本方式发送
}
mp.addBodyPart(mbpContent);
// 添加附件
if (sFileName != null && sFileName.length > 0) {
logger.debug("===============================存在附件,开始整理附件------------");
String profix = ""; //附件的后缀名
for (int j = 0; j < sFileName.length; j++) {
MimeBodyPart mbp = new MimeBodyPart();
FileDataSource fds = new FileDataSource(sFileName[j]);
mbp.setDataHandler(new DataHandler(fds));
mbp.setFileName(fds.getName());
mp.addBodyPart(mbp);
String[] strArr = sFileName[j].split("/");
String fileName = "未命名文件";
if (strArr != null) { //组装附件名
fileName = strArr[strArr.length-1];
int li = 0;
if ((li = fileName.lastIndexOf(".")) >0) {
profix = fileName.substring(li+1); //取得后缀名
}
fileName = fileName.substring(0,fileName.lastIndexOf("("));
if(fileName.length() > 15){ //附件名字成度做限制不能超过15个字符
fileName = fileName.substring(0,13)+"..";
}
}
fileName = fileName +"."+profix;
mbp.setFileName(MimeUtility.encodeWord(fileName));
}
logger.debug("===============================存在附件,整理附件完毕------------");
}
logger.debug("===============================开始设置mail message参数构建message------------");
// 添加Multipart
message.setContent(mp);
logger.debug("===============================已经完成设置mail message参数构建message,构建成功------------");
} catch (MessagingException ex) {
logger.error("===============================message构建异常:"+ex);
throw new Exception(ex);
} catch (UnsupportedEncodingException ex) {
logger.error("===============================message构建异常:"+ex);
throw new Exception(ex);
}
return message;
}
}
</props>
</constructor-arg>
</bean>
</beans>