如下:
package com.thinkgem.jeesite.common.utils; import freemarker.template.Configuration; import freemarker.template.Template; import org.apache.commons.mail.HtmlEmail; import org.springframework.ui.freemarker.FreeMarkerTemplateUtils; import java.io.File; import java.util.HashMap; import java.util.Locale; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 发送电子邮件 */ public class SendMailUtil { private static final String fromName = "管理员"; private static final String charSet = "utf-8"; // TODO 邮箱和密码要改,如果邮箱不是下面列出的域名的还需要手动加域名和端口 private static final String from = "xxx@qq.com";//发件人 private static final String username = "xxx@qq.com";//发件人账户名 private static final String password = "xxx";//发件人密码 private static Map<String, String> hostMap = new HashMap<String, String>(); static { // 126 hostMap.put("smtp.126", "smtp.126.com"); // qq hostMap.put("smtp.qq", "smtp.qq.com"); // 163 hostMap.put("smtp.163", "smtp.163.com"); // sina hostMap.put("smtp.sina", "smtp.sina.com.cn"); // tom hostMap.put("smtp.tom", "smtp.tom.com"); // 263 hostMap.put("smtp.263", "smtp.263.net"); // yahoo hostMap.put("smtp.yahoo", "smtp.mail.yahoo.com"); // hotmail hostMap.put("smtp.hotmail", "smtp.live.com"); // gmail hostMap.put("smtp.gmail", "smtp.gmail.com"); hostMap.put("smtp.port.gmail", "465"); hostMap.put("xxx", "smtp.exmail.qq.com"); hostMap.put("xxx", "465"); } public static String getHost(String email) throws Exception { Pattern pattern = Pattern.compile("\w+@(\w+)(\.\w+){1,2}"); Matcher matcher = pattern.matcher(email); String key = "unSupportEmail"; if (matcher.find()) { key = "smtp." + matcher.group(1); } if (hostMap.containsKey(key)) { return hostMap.get(key); } else { throw new Exception("unSupportEmail"); } } public static int getSmtpPort(String email) throws Exception { Pattern pattern = Pattern.compile("\w+@(\w+)(\.\w+){1,2}"); Matcher matcher = pattern.matcher(email); String key = "unSupportEmail"; if (matcher.find()) { key = "smtp.port." + matcher.group(1); } if (hostMap.containsKey(key)) { return Integer.parseInt(hostMap.get(key)); } else { return 25; } } /** * 发送模板邮件 * * @param toMailAddr * 收信人地址 * @param subject * email主题 * @param templatePath * 模板地址 * @param map * 模板map */ public static void sendFtlMail(String toMailAddr, String subject, String templatePath, Map<String, Object> map) { Template template = null; Configuration freeMarkerConfig = null; HtmlEmail hemail = new HtmlEmail(); try { hemail.setHostName(getHost(from)); hemail.setSmtpPort(getSmtpPort(from)); hemail.setCharset(charSet); hemail.addTo(toMailAddr); hemail.setFrom(from, fromName); hemail.setAuthentication(username, password); hemail.setSubject(subject); freeMarkerConfig = new Configuration(); freeMarkerConfig.setDirectoryForTemplateLoading(new File( getFilePath())); // 获取模板 template = freeMarkerConfig.getTemplate(getFileName(templatePath), new Locale("Zh_cn"), "UTF-8"); // 模板内容转换为string String htmlText = FreeMarkerTemplateUtils .processTemplateIntoString(template, map); System.out.println(htmlText); hemail.setMsg(htmlText); hemail.send(); System.out.println("email send true!"); } catch (Exception e) { e.printStackTrace(); System.out.println("email send error!"); } } /** * 发送普通邮件 * * @param toMailAddr * 收信人地址 * @param ccList * 抄送列表,多个邮件地址用分号分隔 * @param subject * email主题 * @param message * 发送email信息 */ public static void sendCommonMail(String toMailAddr, String ccList, String subject, String message) { HtmlEmail hemail = new HtmlEmail(); try { hemail.setHostName(getHost(from)); int port = getSmtpPort(from); if(465 == port){ hemail.setSSLOnConnect(true); hemail.setSslSmtpPort("465"); }else{ hemail.setSmtpPort(getSmtpPort(from)); } hemail.setCharset(charSet); hemail.addTo(toMailAddr); if(StringUtils.isNotBlank(ccList)){ String[] ccLists = ccList.split(";"); for(String s:ccLists){ hemail.addCc(s); } } hemail.setFrom(from, fromName); hemail.setAuthentication(username, password); hemail.setSubject(subject); hemail.setMsg(message); hemail.send(); System.out.println("email send true!"); } catch (Exception e) { e.printStackTrace(); System.out.println("email send error!"); } } /** * 发送普通邮件 * * @param toMailAddr * 收信人地址 * @param subject * email主题 * @param message * 发送email信息 */ public static void sendCommonMail(String toMailAddr, String subject, String message) { sendCommonMail(toMailAddr, "", subject, message); } public static String getHtmlText(String templatePath, Map<String, Object> map) { Template template = null; String htmlText = ""; try { Configuration freeMarkerConfig = null; freeMarkerConfig = new Configuration(); freeMarkerConfig.setDirectoryForTemplateLoading(new File( getFilePath())); // 获取模板 template = freeMarkerConfig.getTemplate(getFileName(templatePath), new Locale("Zh_cn"), "UTF-8"); // 模板内容转换为string htmlText = FreeMarkerTemplateUtils.processTemplateIntoString( template, map); System.out.println(htmlText); } catch (Exception e) { e.printStackTrace(); } return htmlText; } private static String getFilePath() { String path = getAppPath(SendMailUtil.class); path = path + File.separator + "mailtemplate" + File.separator; path = path.replace("\", "/"); System.out.println(path); return path; } private static String getFileName(String path) { path = path.replace("\", "/"); System.out.println(path); return path.substring(path.lastIndexOf("/") + 1); } // @SuppressWarnings("unchecked") public static String getAppPath(Class<?> cls) { // 检查用户传入的参数是否为空 if (cls == null) throw new java.lang.IllegalArgumentException("参数不能为空!"); ClassLoader loader = cls.getClassLoader(); // 获得类的全名,包括包名 String clsName = cls.getName() + ".class"; // 获得传入参数所在的包 Package pack = cls.getPackage(); String path = ""; // 如果不是匿名包,将包名转化为路径 if (pack != null) { String packName = pack.getName(); // 此处简单判定是否是Java基础类库,防止用户传入JDK内置的类库 if (packName.startsWith("java.") || packName.startsWith("javax.")) throw new java.lang.IllegalArgumentException("不要传送系统类!"); // 在类的名称中,去掉包名的部分,获得类的文件名 clsName = clsName.substring(packName.length() + 1); // 判定包名是否是简单包名,如果是,则直接将包名转换为路径, if (packName.indexOf(".") < 0) path = packName + "/"; else {// 否则按照包名的组成部分,将包名转换为路径 int start = 0, end = 0; end = packName.indexOf("."); while (end != -1) { path = path + packName.substring(start, end) + "/"; start = end + 1; end = packName.indexOf(".", start); } path = path + packName.substring(start) + "/"; } } // 调用ClassLoader的getResource方法,传入包含路径信息的类文件名 java.net.URL url = loader.getResource(path + clsName); // 从URL对象中获取路径信息 String realPath = url.getPath(); // 去掉路径信息中的协议名"file:" int pos = realPath.indexOf("file:"); if (pos > -1) realPath = realPath.substring(pos + 5); // 去掉路径信息最后包含类文件信息的部分,得到类所在的路径 pos = realPath.indexOf(path + clsName); realPath = realPath.substring(0, pos - 1); // 如果类文件被打包到JAR等文件中时,去掉对应的JAR等打包文件名 if (realPath.endsWith("!")) realPath = realPath.substring(0, realPath.lastIndexOf("/")); /*------------------------------------------------------------ ClassLoader的getResource方法使用了utf-8对路径信息进行了编码,当路径 中存在中文和空格时,他会对这些字符进行转换,这样,得到的往往不是我们想要 的真实路径,在此,调用了URLDecoder的decode方法进行解码,以便得到原始的 中文及空格路径 -------------------------------------------------------------*/ try { realPath = java.net.URLDecoder.decode(realPath, "utf-8"); } catch (Exception e) { throw new RuntimeException(e); } System.out.println("realPath----->" + realPath); return realPath; } // private static File getFile(String path){ // File file = // SendMail.class.getClassLoader().getResource("mailtemplate/test.ftl").getFile(); // return file; // } // public static void main(String[] args) { // HtmlEmail hemail = new HtmlEmail(); // try { // hemail.setHostName("smtp.exmail.qq.com"); // hemail.setCharset("utf-8"); // hemail.addTo("fly.1206@qq.com"); // hemail.setFrom("zhoujunfeng@et-bank.com", "周俊峰"); // hemail.setAuthentication("zhoujunfeng@et-bank.com", "31415926@aa"); // hemail.setSubject("sendemail test!"); // hemail.setMsg("<a href="http://www.google.cn">谷歌</a><br/>"); // hemail.send(); // System.out.println("email send true!"); // } catch (Exception e) { // e.printStackTrace(); // System.out.println("email send error!"); // } Map<String, Object> map = new HashMap<String, Object>(); map.put("subject", "测试标题"); map.put("content", "测试 内容"); String templatePath = "mailtemplate/test.ftl"; sendFtlMail("test@163.com", "sendemail test!", templatePath, map); // System.out.println(getFileName("mailtemplate/test.ftl")); } }
调用方法:
SendMailUtil.sendCommonMail("xxx.qq.com", "", "XXX异常", e.getMessage());