package com.norteksoft.product.util; import java.io.File; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Properties; import java.util.Map.Entry; import javax.activation.DataHandler; import javax.activation.DataSource; import javax.activation.FileDataSource; 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.apache.commons.lang.math.NumberUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.util.Assert; import com.norteksoft.acs.base.enumeration.MailboxDeploy; import com.norteksoft.acs.entity.organization.MailDeploy; import com.norteksoft.acs.service.organization.CompanyManager; import com.norteksoft.product.api.ApiFactory; import com.norteksoft.product.api.entity.User; /** * 邮件发送工具 * */ public final class MailUtils { private static Log log = LogFactory.getLog(MailUtils.class); private MailUtils(){ } private static MailInfo getMailInfo(String email){ CompanyManager companyManager = (CompanyManager) ContextUtils.getBean("companyManager"); MailDeploy mailDeploy=companyManager.getMailDeployByCompanyId(); User user=ApiFactory.getAcsService().getUserByEmail(email); if(user!=null){ Boolean isAutheticate; String protocol="smtp"; String host; Integer port=25; String userName; String password; String from; if(MailboxDeploy.INSIDE.equals(user.getMailboxDeploy())){ isAutheticate=getSmtpAuth(mailDeploy.getSmtpAuthInside()); if(StringUtils.isNotEmpty(mailDeploy.getTransportProtocolInside())){ protocol=mailDeploy.getTransportProtocolInside(); } Assert.notNull(mailDeploy.getSmtpHostInside(), "内网配置中的[邮件服务器地址]不能为空 "); host=mailDeploy.getSmtpHostInside(); if(StringUtils.isNotEmpty(mailDeploy.getSmtpPortInside())){ port=NumberUtils.toInt(mailDeploy.getSmtpPortInside(), 25); } Assert.notNull(mailDeploy.getHostUserInside(), "内网配置中的[默认服务器端用户名]不能为空 "); userName=mailDeploy.getHostUserInside(); Assert.notNull(mailDeploy.getHostUserPasswordInside(), "内网配置中的[默认服务器用户密码]不能为空 "); password=mailDeploy.getHostUserPasswordInside(); Assert.notNull(mailDeploy.getHostUserFromInside(), "内网配置中的[默认主机地址]不能为空 "); from=mailDeploy.getHostUserFromInside(); }else{ isAutheticate=getSmtpAuth(mailDeploy.getSmtpAuthExterior()); if(StringUtils.isNotEmpty(mailDeploy.getTransportProtocolExterior())){ protocol=mailDeploy.getTransportProtocolExterior(); } Assert.notNull(mailDeploy.getSmtpHostExterior(), "外网配置中的[邮件服务器地址]不能为空 "); host=mailDeploy.getSmtpHostExterior(); if(StringUtils.isNotEmpty(mailDeploy.getSmtpPortExterior())){ port=NumberUtils.toInt(mailDeploy.getSmtpPortExterior(), 25); } Assert.notNull(mailDeploy.getHostUserExterior(), "外网配置中的[默认服务器端用户名]不能为空 "); userName=mailDeploy.getHostUserExterior(); Assert.notNull(mailDeploy.getHostUserPasswordExterior(), "外网配置中的[默认服务器用户密码]不能为空 "); password=mailDeploy.getHostUserPasswordExterior(); Assert.notNull(mailDeploy.getHostUserFromExterior(), "外网配置中的[默认主机地址]不能为空 "); from=mailDeploy.getHostUserFromExterior(); } return new MailInfo(isAutheticate, protocol, host, port, userName, password, from); } return null; } private static Boolean getSmtpAuth(String smtpAuth) { Boolean isAutheticate; if(StringUtils.isEmpty(smtpAuth)){ isAutheticate=true; }else{ isAutheticate=Boolean.valueOf(smtpAuth); } return isAutheticate; } public static void sendMail(Collection<String> consignees, String subject, String content) { Map<String, String> fileMap = new HashMap<String, String>(); for(String to : consignees){ try { MailInfo info = getMailInfo(to); sendMail(info.isAutheticate(), info.getProtocol(), info.getHost(), info.getPort(), info.getUser(), info.getPassword(), info.getFrom(), to, subject, content, fileMap); } catch (AddressException e) { log.debug(PropUtils.getExceptionInfo(e)); } catch (MessagingException e) { log.debug(PropUtils.getExceptionInfo(e)); } } } public static boolean sendMail(String to, String subject, String content) throws AddressException, MessagingException { Map<String, String> fileMap = new HashMap<String, String>(); MailInfo info = getMailInfo(to); return sendMail(info.isAutheticate(), info.getProtocol(), info.getHost(), info.getPort(), info.getUser(), info.getPassword(), info.getFrom(), to, subject, content, fileMap); } public static boolean sendMailQuietly(String to, String subject, String content){ Map<String, String> fileMap = new HashMap<String, String>(); MailInfo info = getMailInfo(to); try { return sendMail(info.isAutheticate(), info.getProtocol(), info.getHost(), info.getPort(), info.getUser(), info.getPassword(), info.getFrom(), to, subject, content, fileMap); } catch (AddressException e) { log.debug(PropUtils.getExceptionInfo(e)); } catch (MessagingException e) { log.debug(PropUtils.getExceptionInfo(e)); } return false; } /** * @param isAutheticate * 邮件务器是否验证用户 * @param protocol * 协认 * @param host * 邮件务器地址 * @param port * 端口 * @param user * 用户 * @param password * 密码 * @param from * 邮件发送地址 * @param to * 邮件接收地址 * @param subject * 标题 * @param content * 内容 * @param filePathMap * 附件,它是一个“文件名=全路径地址”的映射 * @return * @throws AddressException * @throws MessagingException */ public static boolean sendMail(Boolean isAutheticate, String protocol, String host, Integer port, String user, String password, String from, String to, String subject, String content, Map<String, String> filePathMap) throws AddressException, MessagingException { boolean bool = false; Properties p = new Properties(); p.put("mail.smtp.auth", isAutheticate.toString()); p.put("mail.transport.protocol", protocol); p.put("mail.smtp.host", host); p.put("mail.smtp.port", port); // 建立会话 Session session = Session.getInstance(p); // 建立消息 Message msg = new MimeMessage(session); // 设置发件人 msg.setFrom(new InternetAddress(from)); // 收件人 msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to)); // 发送日期 msg.setSentDate(new Date()); // 主题 msg.setSubject(subject); // 设置邮件内容,作为Multipart对象的一部分 MimeBodyPart mbp = new MimeBodyPart(); mbp.setText(content); Multipart mulp = new MimeMultipart(); mulp.addBodyPart(mbp); // 文件件名 String fileName = null; // 全路径 String fileFullPath = null; DataSource source = null; if (filePathMap != null && filePathMap.size() > 0) { Iterator<Entry<String, String>> it = filePathMap.entrySet().iterator(); while (it.hasNext()) { // 为每个附件做为Multipart对象的一部分 mbp = new MimeBodyPart(); Map.Entry<String, String> entry = it.next(); fileName = entry.getKey(); fileFullPath = entry.getValue(); if (fileName == null || fileName.equals("") || fileFullPath == null || fileFullPath.equals("")) { continue; } File f = new File(fileFullPath); if (!f.exists()) { continue; } source = new FileDataSource(fileFullPath); mbp.setDataHandler(new DataHandler(source)); mbp.setFileName(fileName); mulp.addBodyPart(mbp); } } // 设置信息内容,将Multipart 对象加入信息中 msg.setContent(mulp); // 登陆邮件服务器进行用户验证 Transport tran = session.getTransport(protocol); tran.connect(host, user, password); // 发送 tran.sendMessage(msg, msg.getAllRecipients()); bool = true; return bool; } /** * @param args * @throws MessagingException * @throws AddressException */ // public static void main(String[] args) throws AddressException, // MessagingException { // // 调试使用 // HashMap<String, String> map = new HashMap<String, String>(); // map.put("mail.jar", "D:\\lib\\mail.jar"); // map.put("1.txt", "D:\\lib\\1.txt"); // //sendMail(true, "smtp", "smtp.126.com", 25, "username", "password", // // "from@126.com", "to@163.com", "title", "content", map); // sendMail("to@gmail.com", "mail test", "是否收到?"); // System.out.println("ok!"); // // } } class MailInfo{ private boolean isAutheticate; private String protocol; private String host; private Integer port; private String user; private String password; private String from; public boolean isAutheticate() { return isAutheticate; } public void setAutheticate(boolean isAutheticate) { this.isAutheticate = isAutheticate; } public String getProtocol() { return protocol; } public void setProtocol(String protocol) { this.protocol = protocol; } public String getHost() { return host; } public void setHost(String host) { this.host = host; } public Integer getPort() { return port; } public void setPort(Integer port) { this.port = port; } public String getUser() { return user; } public void setUser(String user) { this.user = user; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getFrom() { return from; } public void setFrom(String from) { this.from = from; } public MailInfo(boolean isAutheticate, String protocol, String host, Integer port, String user, String password, String from) { this.isAutheticate = isAutheticate; this.protocol = protocol; this.host = host; this.port = port; this.user = user; this.password = password; this.from = from; } }