/**
* Copyright 2007-2010 非也
* All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License v3 as published by the Free Software
* Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along
* with this library; if not, see http://www.gnu.org/licenses/lgpl.html.
*
*/
package org.fireflow.service.email.send;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import java.util.StringTokenizer;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
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 org.apache.commons.lang.StringUtils;
import org.fireflow.engine.exception.ServiceInvocationException;
import org.fireflow.service.email.MailMessage;
/**
*
* @author 非也 nychen2000@163.com
* Fire Workflow 官方网站:www.firesoa.com 或者 www.fireflow.org
*
*/
public class MailSenderImpl implements MailSender {
private static final String CONTENT_TYPE_HTML = "text/html";
private static final String CONTENT_TYPE_CHARSET_SUFFIX = ";charset=";
private final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
MailSendServiceDef mailServiceDef = null;
Date sentDate = null;
public MailSendServiceDef getMailSentServiceDef() {
return mailServiceDef;
}
public void setMailSentServiceDef(MailSendServiceDef mailServiceDef) {
this.mailServiceDef = mailServiceDef;
}
public Date getSentDate() {
return sentDate;
}
public void setSentDate(Date sentDate) {
this.sentDate = sentDate;
}
/* (non-Javadoc)
* @see org.fireflow.service.email.send.MailSender#sendEMail(java.lang.String, java.util.List, java.util.List, java.lang.String, java.lang.String)
*/
public void sendEMail(String mailToList,
String carbonCopyList, String subject, String body,Boolean bodyIsHtml)
throws ServiceInvocationException {
MailMessage mailMessage = new MailMessage();
mailMessage.setFrom(mailServiceDef.getFrom());
mailMessage.setMailToList(string2StringList(mailToList));
mailMessage.setCarbonCopyList(string2StringList(carbonCopyList));
mailMessage.setSubject(subject);
mailMessage.setBody(body);
mailMessage.setBodyIsHtml(bodyIsHtml);
this.checkMailMessage(mailMessage);
this.sendEMail( mailMessage);
}
private List<String> string2StringList(String addresses){
List<String> list = new ArrayList<String>();
if (StringUtils.isEmpty(addresses)) return list;
StringTokenizer tokenizer = new StringTokenizer(addresses,";");
while (tokenizer.hasMoreTokens()){
list.add(tokenizer.nextToken());
}
return list;
}
/* (non-Javadoc)
* @see org.fireflow.service.email.send.MailSender#sendEMail(java.lang.String, java.util.List, java.util.List, java.lang.String, org.fireflow.service.email.send.MailEntity)
*/
public void sendEMail(MailMessage mailMessage)
throws ServiceInvocationException {
//1、创建Session
Properties javaMailProperties = new Properties();
javaMailProperties.put("mail.transport.protocol", mailServiceDef.getProtocol());
javaMailProperties.put("mail.smtp.host", mailServiceDef.getSmtpServer());
javaMailProperties.put("mail.smtp.auth", mailServiceDef.isNeedAuth()?"true":"false");
if (mailServiceDef.isUseSSL()){
javaMailProperties.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);
javaMailProperties.setProperty("mail.smtp.socketFactory.fallback", "false");
javaMailProperties.setProperty("mail.smtp.socketFactory.port",Integer.toString(mailServiceDef.getSmtpPort()));
}
Session mailSession = Session.getInstance(javaMailProperties);
//2、创建MimeMessage
MimeMessage mimeMsg = null;
try {
mimeMsg = createMimeMessage(mailSession,mailMessage);
//3、发送邮件
Transport transport = mailSession.getTransport();
transport.connect(mailServiceDef.getUserName(), mailServiceDef.getPassword());
transport.sendMessage(mimeMsg,mimeMsg.getAllRecipients());
} catch (AddressException e) {
throw new ServiceInvocationException(e);
} catch (MessagingException e) {
throw new ServiceInvocationException(e);
}
}
/**
* TODO 需要加强校验
* @param mailSession
* @param mailMessage
* @return
* @throws MessagingException
* @throws AddressException
* @throws ServiceInvocationException
*/
private MimeMessage createMimeMessage(Session mailSession,MailMessage mailMessage) throws AddressException, MessagingException{
MimeMessage mimeMsg = new MimeMessage(mailSession);
//1、set from
//Assert.notNull(mailMessage.getFrom(),"From address must not be null");
mimeMsg.setFrom(new InternetAddress(mailMessage.getFrom()));
//2、set mailto
List<String> mailToList = mailMessage.getMailToList();
InternetAddress[] addressList = new InternetAddress[mailToList.size()];
for (int i=0;i<mailToList.size();i++){
String mailTo = mailToList.get(i);
addressList[i] = new InternetAddress(mailTo);
}
mimeMsg.setRecipients(Message.RecipientType.TO, addressList);
//3、set cc
List<String> ccList = mailMessage.getCarbonCopyList();
if (ccList!=null && ccList.size()>0){
addressList = new InternetAddress[ccList.size()];
for (int i=0;i<ccList.size();i++){
String mailTo = ccList.get(i);
addressList[i] = new InternetAddress(mailTo);
}
mimeMsg.setRecipients(Message.RecipientType.CC, addressList);
}
//4、set subject
mimeMsg.setSubject(mailMessage.getSubject(),mailServiceDef.getCharset());
//5、set sentDate
if (this.sentDate!=null){
mimeMsg.setSentDate(sentDate);
}
//6、set email body
Multipart multiPart = new MimeMultipart();
MimeBodyPart bp = new MimeBodyPart();
if (mailMessage.getBodyIsHtml())
bp.setContent(mailMessage.getBody(), CONTENT_TYPE_HTML + CONTENT_TYPE_CHARSET_SUFFIX +mailServiceDef.getCharset());
else
bp.setText(mailMessage.getBody(),mailServiceDef.getCharset());
multiPart.addBodyPart(bp);
mimeMsg.setContent(multiPart);
//7、set attachment
//TODO 待处理
return mimeMsg;
}
private void checkMailMessage(MailMessage mailMessage) throws ServiceInvocationException{
if (mailMessage.getFrom()==null || mailMessage.getFrom().trim().equals("")){
throw new ServiceInvocationException("The email from address can not be empty.");
}
if (mailMessage.getMailToList()==null || mailMessage.getMailToList().size()==0){
throw new ServiceInvocationException("The email recipient address can not be empty.");
}
}
}