package edu.fudan.eservice.common.smtp; import java.io.UnsupportedEncodingException; import java.net.*; import java.util.List; import javax.mail.*; import javax.mail.internet.*; import javax.activation.*; import java.util.*; import org.apache.commons.logging.*; public abstract class SMTP { private static Log log = LogFactory.getLog(SMTP.class); protected String username; protected String password; protected String host; protected String to; protected String cc; protected String bcc; protected String reply; protected Address from; protected String title; private MimeMultipart top = null; //private MimeMultipart related = null; /** * 获取SMTP连接的会话,由子类实现 */ protected abstract Session getSession(); /** * 设置登录服务器的用户名 * @param loginUser */ public void setLoginUser(String loginUser) { username = loginUser; } /** * 设置登录服务器的密码 * @param password */ public void setLoginPassword(String password) { this.password = password; } /** * 添加收件人地址,不同地址间以,分隔 * @param addresses */ public void addTo(String addresses) { if (to == null) to = addresses; else to += "," + addresses; } /** * 添加收件人地址,List中的每个地址也可以为,分隔的多个收件人 * @param address */ public void addTo(List<String> address) { for (String add : address) { if (to == null) to = add; else to += "," + add; } } /** * 添加抄送人地址,要求同收件人 * @param addresses */ public void addCc(String addresses) { if (cc == null) cc = addresses; else cc += "," + addresses; } /** * 添加抄送人地址,要求同收收件人 * @param address */ public void addCc(List<String> address) { for (String add : address) { if (cc == null) cc = add; else cc += "," + add; } } /** * 添加暗送人地址,要求同收件人 * @param addresses */ public void addBcc(String addresses) { if (bcc == null) bcc = addresses; else bcc += "," + addresses; } /** * 添加暗送人地址,要求同收件人 * @param address */ public void addBcc(List<String> address) { for (String add : address) { if (bcc == null) bcc = add; else bcc += "," + add; } } /** * 设置邮件标题 * @param title */ public void setTitle(String title) { this.title = title; } /** * 设置发信人 * @param address * @throws AddressException */ public void setFrom(String address) throws AddressException { try { from = new InternetAddress(address); } catch (AddressException ex) { log.error("[setFrom]:" + address + "\n" + ex.getMessage()); throw ex; } } /** * 设置发信人 * @param address */ public void setFrom(Address address) { from=address; } /** * 设置SMTP服务器地址 * @param host */ public void setHost(String host) { this.host = host; } /** * 设置回复地址 * @param reply */ public void setReply(String reply) { this.reply = reply; } /** * 设置邮件内容 * @param body * @param isHTML 内容是否为HTML格式 * @throws MessagingException */ public void setMailbody(String body, boolean isHTML) throws MessagingException { String conText = null; BodyPart bp = new MimeBodyPart(); if (top == null) top = new MimeMultipart(); try { if (isHTML) { conText = "<HTML><HEAD><TITLE>" + title + "</TITLE><BODY>" + body + "</BODY></HTML>"; bp.setContent(conText, "text/html; charset=gbk"); } else { bp.setContent(body, "text/plain; charset=gbk"); } top.addBodyPart(bp); } catch (MessagingException ex) { log.error("[setMailBody]:" + body + "\nHTML:" + isHTML + "\n" + ex.getMessage()); throw ex; } } /** * 添加附件 * @param filename 附件路径,可为URL或文件系统路径 * @throws MessagingException * @throws MalformedURLException */ public void addAttachment(String filename) throws MessagingException, MalformedURLException { if (top == null) top = new MimeMultipart(); else { String subtype=top.getContentType(); if(subtype.equals("multipart/related")); { BodyPart old=new MimeBodyPart(); old.setContent(top); top=new MimeMultipart(); top.addBodyPart(old); } } BodyPart bp = new MimeBodyPart(); try { if (filename.indexOf("://")>0) { URLDataSource uds = new URLDataSource(new URL(filename)); bp.setDataHandler(new DataHandler(uds)); bp.setFileName(MimeUtility.encodeWord(uds.getName(), "GBK", null)); } else { FileDataSource fds = new FileDataSource(filename); bp.setDataHandler(new DataHandler(fds)); bp.setFileName(MimeUtility.encodeWord(fds.getName(), "GBK", null)); } top.addBodyPart(bp); } catch (MessagingException ex) { log.error("[addAttachment]:" + filename + "\n" + ex.getMessage()); throw ex; } catch (UnsupportedEncodingException ex) { log.error("[addAttachment]:" + ex.getMessage()); } catch (MalformedURLException ex) { log.error("[addAttachment URL]:" + filename + "\n" + ex.getMessage()); throw ex; } } /** * 添加相关附件,一般为图片 * 当filename为URL时,HTML中<img>的src写为此URL * 当filename为文件路径是,<img>的src写为"cid:文件名",注意此处文件名不要有中文,不然必乱 * @param filename 相关附件地址(URL或文件路径) * @throws MessagingException * @throws MalformedURLException */ public void addRelated(String filename) throws MessagingException, MalformedURLException { if (top == null) top = new MimeMultipart("related"); else top.setSubType("related"); BodyPart bp = new MimeBodyPart(); try { if (filename.indexOf("://")>0) { URLDataSource uds = new URLDataSource(new URL(filename)); bp.setDataHandler(new DataHandler(uds)); bp.setFileName(MimeUtility.encodeWord(uds.getName(), "GBK", null)); bp.setHeader("Content-Location", MimeUtility.encodeWord(filename, "GBK", null)); } else { FileDataSource fds = new FileDataSource(filename); bp.setDataHandler(new DataHandler(fds)); bp.setFileName(MimeUtility.encodeWord(fds.getName(), "GBK", null)); bp.setHeader("Content-ID", "<" + MimeUtility .encodeWord(fds.getName(), "GBK", null) + ">"); } top.addBodyPart(bp); } catch (MessagingException ex) { log.error("[addRelated]:" + filename + "\n" + ex.getMessage()); throw ex; } catch (UnsupportedEncodingException ex) { log.error("[addRelated]:" + ex.getMessage()); }catch (MalformedURLException ex) { log.error("[addAttachment URL]:" + filename + "\n" + ex.getMessage()); throw ex; } } /** * 发送邮件 * @throws MessagingException */ public void send() throws MessagingException { Session s = getSession(); //s.setDebug(true); try { Transport trans = s.getTransport("smtp"); trans.connect(host, username, password); MimeMessage msg = new MimeMessage(s); msg.setFrom(from); msg.setSubject(title,"GBK"); msg.setRecipients(Message.RecipientType.TO, InternetAddress .parse(to)); if (cc != null) msg.setRecipients(Message.RecipientType.CC, InternetAddress .parse(cc)); if (bcc != null) msg.setRecipients(Message.RecipientType.BCC, InternetAddress .parse(bcc)); if (reply != null) msg.setReplyTo(InternetAddress.parse(reply)); msg.setContent(top); msg.setHeader("X-Mailer", "ESERVICE"); msg.setSentDate(new Date()); trans.sendMessage(msg, msg.getAllRecipients()); trans.close(); } catch (MessagingException ex) { if (ex instanceof AddressException) log.error("[send]: AddressError" + ((AddressException) ex).getRef()); log.error("[send]:" + ex.toString()); throw ex; } } }