Java 實現 HtmlEmail 發送郵件功能

来源:https://www.cnblogs.com/zhaosq/archive/2019/06/27/11088586.html
-Advertisement-
Play Games

引言 在平常的企業級應用開發過程中,可能會涉及到一些資訊通知需要傳達,以及軟體使用過程中有一些安全性的東西需要及早知道和瞭解,這時候在區域網之間就可以通過發送郵件的方式了。以下就是代碼實現了: 註意:要想發送郵件還必須在伺服器上創建一個郵件伺服器和本地安裝接收郵件客戶端 (FoxmailSetup. ...


引言

     在平常的企業級應用開發過程中,可能會涉及到一些資訊通知需要傳達,以及軟體使用過程中有一些安全性的東西需要及早知道和瞭解,這時候在區域網之間就可以通過發送郵件的方式了。以下就是代碼實現了: 

  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 = "[email protected]";
 22     private static final String fromName = "測試公司";
 23     private static final String charSet = "utf-8";
 24     private static final String username = "[email protected]";
 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("[email protected]", "發件郵箱密碼");
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("[email protected]", "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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • EventLoop 在之前介紹Bootstrap的初始化以及啟動過程時,我們多次接觸了NioEventLoopGroup這個類,關於這個類的理解,還需要瞭解netty的線程模型。NioEventLoopGroup可以理解為一組線程,這些線程每一個都可以獨立地處理多個channel產生的io事件。 N ...
  • Spring從2.5版本引入註解,從而讓開發者的工作變得非常的輕鬆 springmvc註解Controller org.springframework.stereotype.Controller註解類型用於指示Spring類的實例是一個控制器,使用該註解不需要繼承特定的類或實現特定的介面,相比較配置 ...
  • 官網:www.fhadmin.org 此項目為Springboot工作流版本 windows 風格,瀏覽器訪問操作使用,非桌面應用程式。 1.代碼生成器: [正反雙向](單表、主表、明細表、樹形表,快速開發利器) freemaker模版技術 ,0個代碼不用寫,生成完整的一個模塊,帶頁面、建表sql腳 ...
  • 消息隊列中間件是分散式系統中重要的組件,主要解決應用耦合,非同步消息,流量削鋒等問題 實現高性能,高可用,可伸縮和最終一致性架構。 RabbitMQ 是採用 Erlang 語言實現 AMQP (Advanced Message Queuing Protocol,高級消息 隊列協議)的消息中間件,它最初 ...
  • 因為這系列篇幅較長,所以在這裡也不進行任何鋪墊,直奔主題去啦。 利用組合設計菜單 我們要如何在菜單上應用組合模式呢?一開始,我們需要創建一個組件介面來作為菜單和菜單項的共同介面,讓我們能夠用統一的做法來處理菜單和菜單項。換句話說,我們可以針對菜單或菜單項調用相同的方法。 讓我們從頭來看看如何讓菜單能 ...
  • 兩種能力境界 1.解決問題 在工程師中有一種人被稱為”救火隊長“。哪裡出了問題,哪裡就有他的身影,他的出現,燃眉之急就有救了。他們是解決問題的高人。但是“救火隊長”在晉升上往往會遇到瓶頸。 對標人物:漫威-美國隊長 每天嚴陣以待,隨時準備拯救世界。無法接受鋼鐵俠防患於未然用機器來解決問題解放自己的方 ...
  • 此階段的最高目標是瞭解如何升級包含實現CQRS模式和事件源的限界上下文的系統。團隊在這一階段實現的用戶場景包括對代碼的更改和對數據的更改:更改了一些現有的數據模式並添加了新的數據模式。除了升級系統和遷移數據外,團隊還計劃在沒有停機時間的情況下進行升級和遷移,以便在Microsoft Azure中運... ...
  • hMialServer是Windows下一款免費開源的郵件伺服器軟體,支持smtp、pop3、imap。 本文主要根據官方文檔Quick-Start guide整理而成。 一、下載 下載地址:https://www.hmailserver.com/download 二、安裝 直接雙擊下載的安裝程式 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...