Java 实现 HtmlEmail 邮件发送功能
引言
在平常的企业级应用开发过程中,可能会涉及到一些资讯通知需要传达,以及软件使用过程中有一些安全性的东西需要及早知道和了解,这时候在局域网之间就可以通过发送邮件的方式了。以下就是代码实现了:
1 package com.sh.xrsite.common.utils; 2 3 import java.io.File; 4 import java.util.HashMap; 5 import java.util.Locale; 6 import java.util.Map; 7 import java.util.regex.Matcher; 8 import java.util.regex.Pattern; 9 10 import org.apache.commons.mail.HtmlEmail; 11 import org.springframework.ui.freemarker.FreeMarkerTemplateUtils; 12 13 import freemarker.template.Configuration; 14 import freemarker.template.Template; 15 16 /** 17 * 发送电子邮件 18 */ 19 public class SendMailUtil { 20 21 private static final String from = "zsq@163.com"; 22 private static final String fromName = "测试公司"; 23 private static final String charSet = "utf-8"; 24 private static final String username = "zsq@163.com"; 25 private static final String password = "123456"; 26 27 private static Map<String, String> hostMap = new HashMap<String, String>(); 28 static { 29 // 126 30 hostMap.put("smtp.126", "smtp.126.com"); 31 // qq 32 hostMap.put("smtp.qq", "smtp.qq.com"); 33 34 // 163 35 hostMap.put("smtp.163", "smtp.163.com"); 36 37 // sina 38 hostMap.put("smtp.sina", "smtp.sina.com.cn"); 39 40 // tom 41 hostMap.put("smtp.tom", "smtp.tom.com"); 42 43 // 263 44 hostMap.put("smtp.263", "smtp.263.net"); 45 46 // yahoo 47 hostMap.put("smtp.yahoo", "smtp.mail.yahoo.com"); 48 49 // hotmail 50 hostMap.put("smtp.hotmail", "smtp.live.com"); 51 52 // gmail 53 hostMap.put("smtp.gmail", "smtp.gmail.com"); 54 hostMap.put("smtp.port.gmail", "465"); 55 } 56 57 public static String getHost(String email) throws Exception { 58 Pattern pattern = Pattern.compile("\\w+@(\\w+)(\\.\\w+){1,2}"); 59 Matcher matcher = pattern.matcher(email); 60 String key = "unSupportEmail"; 61 if (matcher.find()) { 62 key = "smtp." + matcher.group(1); 63 } 64 if (hostMap.containsKey(key)) { 65 return hostMap.get(key); 66 } else { 67 throw new Exception("unSupportEmail"); 68 } 69 } 70 71 public static int getSmtpPort(String email) throws Exception { 72 Pattern pattern = Pattern.compile("\\w+@(\\w+)(\\.\\w+){1,2}"); 73 Matcher matcher = pattern.matcher(email); 74 String key = "unSupportEmail"; 75 if (matcher.find()) { 76 key = "smtp.port." + matcher.group(1); 77 } 78 if (hostMap.containsKey(key)) { 79 return Integer.parseInt(hostMap.get(key)); 80 } else { 81 return 25; 82 } 83 } 84 85 /** 86 * 发送模板邮件 87 * 88 * @param toMailAddr 89 * 收信人地址 90 * @param subject 91 * email主题 92 * @param templatePath 93 * 模板地址 94 * @param map 95 * 模板map 96 */ 97 public static void sendFtlMail(String toMailAddr, String subject, 98 String templatePath, Map<String, Object> map) { 99 Template template = null; 100 Configuration freeMarkerConfig = null; 101 HtmlEmail hemail = new HtmlEmail(); 102 try { 103 hemail.setHostName(getHost(from)); 104 hemail.setSmtpPort(getSmtpPort(from)); 105 hemail.setCharset(charSet); 106 hemail.addTo(toMailAddr); 107 hemail.setFrom(from, fromName); 108 hemail.setAuthentication(username, password); 109 hemail.setSubject(subject); 110 freeMarkerConfig = new Configuration(); 111 freeMarkerConfig.setDirectoryForTemplateLoading(new File( 112 getFilePath())); 113 // 获取模板 114 template = freeMarkerConfig.getTemplate(getFileName(templatePath), 115 new Locale("Zh_cn"), "UTF-8"); 116 // 模板内容转换为string 117 String htmlText = FreeMarkerTemplateUtils 118 .processTemplateIntoString(template, map); 119 System.out.println(htmlText); 120 hemail.setMsg(htmlText); 121 hemail.send(); 122 System.out.println("email send true!"); 123 } catch (Exception e) { 124 e.printStackTrace(); 125 System.out.println("email send error!"); 126 } 127 } 128 129 /** 130 * 发送普通邮件 131 * 132 * @param toMailAddr 133 * 收信人地址 134 * @param subject 135 * email主题 136 * @param message 137 * 发送email信息 138 */ 139 public static void sendCommonMail(String toMailAddr, String subject, 140 String message) { 141 HtmlEmail hemail = new HtmlEmail(); 142 try { 143 hemail.setHostName(getHost(from)); 144 hemail.setSmtpPort(getSmtpPort(from)); 145 hemail.setCharset(charSet); 146 hemail.addTo(toMailAddr); 147 hemail.setFrom(from, fromName); 148 hemail.setAuthentication(username, password); 149 hemail.setSubject(subject); 150 hemail.setMsg(message); 151 hemail.send(); 152 System.out.println("email send true!"); 153 } catch (Exception e) { 154 e.printStackTrace(); 155 System.out.println("email send error!"); 156 } 157 158 } 159 160 161 /** 162 * 发送普通邮件 163 * @param hostIp 邮件服务器地址 164 * @param sendMailAddr 发送发邮箱地址 165 * @param sendUserName 发送方姓名 166 * @param username 邮箱用户名 167 * @param password 邮箱密码 168 * @param toMailAddr 收信人邮箱地址 169 * @param subject email主题 170 * @param message 发送email信息 171 */ 172 public static boolean sendCommonMail(String hostIp, String sendMailAddr, String sendUserName, String username, String password,String toMailAddr, String subject, 173 String message) { 174 HtmlEmail hemail = new HtmlEmail(); 175 boolean flag; 176 try { 177 178 hemail.setHostName(hostIp); 179 hemail.setSmtpPort(getSmtpPort(sendMailAddr)); 180 hemail.setCharset(charSet); 181 hemail.addTo(toMailAddr); 182 hemail.setFrom(sendMailAddr, sendUserName); 183 hemail.setAuthentication(username, password); 184 hemail.setSubject(subject); 185 hemail.setMsg(message); 186 hemail.send(); 187 flag=true; 188 System.out.println("email send true!"); 189 190 } catch (Exception e) { 191 e.printStackTrace(); 192 flag=false; 193 System.out.println("email send error!"); 194 } 195 196 return flag; 197 } 198 199 200 201 public static String getHtmlText(String templatePath, 202 Map<String, Object> map) { 203 Template template = null; 204 String htmlText = ""; 205 try { 206 Configuration freeMarkerConfig = null; 207 freeMarkerConfig = new Configuration(); 208 freeMarkerConfig.setDirectoryForTemplateLoading(new File( 209 getFilePath())); 210 // 获取模板 211 template = freeMarkerConfig.getTemplate(getFileName(templatePath), 212 new Locale("Zh_cn"), "UTF-8"); 213 // 模板内容转换为string 214 htmlText = FreeMarkerTemplateUtils.processTemplateIntoString( 215 template, map); 216 System.out.println(htmlText); 217 } catch (Exception e) { 218 e.printStackTrace(); 219 } 220 return htmlText; 221 } 222 223 private static String getFilePath() { 224 String path = getAppPath(SendMailUtil.class); 225 path = path + File.separator + "mailtemplate" + File.separator; 226 path = path.replace("\\", "/"); 227 System.out.println(path); 228 return path; 229 } 230 231 private static String getFileName(String path) { 232 path = path.replace("\\", "/"); 233 System.out.println(path); 234 return path.substring(path.lastIndexOf("/") + 1); 235 } 236 237 // @SuppressWarnings("unchecked") 238 public static String getAppPath(Class<?> cls) { 239 // 检查用户传入的参数是否为空 240 if (cls == null) 241 throw new java.lang.IllegalArgumentException("参数不能为空!"); 242 ClassLoader loader = cls.getClassLoader(); 243 // 获得类的全名,包括包名 244 String clsName = cls.getName() + ".class"; 245 // 获得传入参数所在的包 246 Package pack = cls.getPackage(); 247 String path = ""; 248 // 如果不是匿名包,将包名转化为路径 249 if (pack != null) { 250 String packName = pack.getName(); 251 // 此处简单判定是否是Java基础类库,防止用户传入JDK内置的类库 252 if (packName.startsWith("java.") || packName.startsWith("javax.")) 253 throw new java.lang.IllegalArgumentException("不要传送系统类!"); 254 // 在类的名称中,去掉包名的部分,获得类的文件名 255 clsName = clsName.substring(packName.length() + 1); 256 // 判定包名是否是简单包名,如果是,则直接将包名转换为路径, 257 if (packName.indexOf(".") < 0) 258 path = packName + "/"; 259 else {// 否则按照包名的组成部分,将包名转换为路径 260 int start = 0, end = 0; 261 end = packName.indexOf("."); 262 while (end != -1) { 263 path = path + packName.substring(start, end) + "/"; 264 start = end + 1; 265 end = packName.indexOf(".", start); 266 } 267 path = path + packName.substring(start) + "/"; 268 } 269 } 270 // 调用ClassLoader的getResource方法,传入包含路径信息的类文件名 271 java.net.URL url = loader.getResource(path + clsName); 272 // 从URL对象中获取路径信息 273 String realPath = url.getPath(); 274 // 去掉路径信息中的协议名"file:" 275 int pos = realPath.indexOf("file:"); 276 if (pos > -1) 277 realPath = realPath.substring(pos + 5); 278 // 去掉路径信息最后包含类文件信息的部分,得到类所在的路径 279 pos = realPath.indexOf(path + clsName); 280 realPath = realPath.substring(0, pos - 1); 281 // 如果类文件被打包到JAR等文件中时,去掉对应的JAR等打包文件名 282 if (realPath.endsWith("!")) 283 realPath = realPath.substring(0, realPath.lastIndexOf("/")); 284 /*------------------------------------------------------------ 285 ClassLoader的getResource方法使用了utf-8对路径信息进行了编码,当路径 286 中存在中文和空格时,他会对这些字符进行转换,这样,得到的往往不是我们想要 287 的真实路径,在此,调用了URLDecoder的decode方法进行解码,以便得到原始的 288 中文及空格路径 289 -------------------------------------------------------------*/ 290 try { 291 realPath = java.net.URLDecoder.decode(realPath, "utf-8"); 292 } catch (Exception e) { 293 throw new RuntimeException(e); 294 } 295 System.out.println("realPath----->" + realPath); 296 return realPath; 297 } 298 299 // private static File getFile(String path){ 300 // File file = 301 // SendMail.class.getClassLoader().getResource("mailtemplate/test.ftl").getFile(); 302 // return file; 303 // } 304 // 305 306 public static void main(String[] args) { 307 HtmlEmail hemail = new HtmlEmail(); 308 try { 309 hemail.setHostName("smtp.163.com"); 310 hemail.setCharset("utf-8"); 311 hemail.addTo("收件邮箱地址"); 312 hemail.setFrom("发件邮箱地铁", "网易"); 313 hemail.setAuthentication("wang_yi@163.com", "发件邮箱密码"); 314 hemail.setSubject("sendemail test!"); 315 hemail.setMsg("<a href=\"http://www.google.cn\">谷歌</a><br/>"); 316 hemail.send(); 317 System.out.println("email send true!"); 318 } catch (Exception e) { 319 e.printStackTrace(); 320 System.out.println("email send error!"); 321 } 322 // Map<String, Object> map = new HashMap<String, Object>(); 323 // map.put("subject", "测试标题"); 324 // map.put("content", "测试 内容"); 325 // String templatePath = "mailtemplate/test.ftl"; 326 // sendFtlMail("test@163.com", "sendemail test!", templatePath, map); 327 328 // System.out.println(getFileName("mailtemplate/test.ftl")); 329 } 330 331 }
注意:要想发送邮件还必须在服务器上创建一个邮件服务器和本地安装接收邮件客户端 (FoxmailSetup.exe + hMailServer.exe)!
具体的安装和配置参考: https://www.cnblogs.com/zhaosq/p/11088787.html