Java實現郵件推送功能

来源:https://www.cnblogs.com/ProgramOwn/p/18086465
-Advertisement-
Play Games

java 實現郵件推送 Java實現郵件推送功能 一、引入依賴 <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-email</artifactId> <version>1.4</version> </dep ...


java 實現郵件推送

Java實現郵件推送功能

一、引入依賴

 <dependency>
           <groupId>org.apache.commons</groupId>
           <artifactId>commons-email</artifactId>
           <version>1.4</version>
</dependency>

二、郵件來源用戶信息

private static Logger log = Log.getLogger();
private static ThreadPoolExecutor threadPool;
private static String emailServer;
private static String userName;
private static String password;
private static String emailEncoding;
private static String emailFrom;
private static String sysEmailFromName;
private static String encoding;

private static void initMail(Email mail) throws EmailException {
mail.setHostName(emailServer);
mail.setAuthentication(userName, password);
mail.setCharset(emailEncoding);
mail.setFrom(emailFrom, sysEmailFromName);
}

三、線程池非同步

static {
threadPool = new ThreadPoolExecutor(5, 10, 3L, TimeUnit.SECONDS, new ArrayBlockingQueue(50), new ThreadPoolExecutor.DiscardPolicy());
//郵箱伺服器地址
emailServer = "smtp.163.com";
//用戶名
userName = "****";
//用戶密碼
password = "****";
//編碼格式
emailEncoding = "GBK";
//郵件來源
emailFrom = "*****.com.cn";
//郵件來源用戶名稱
sysEmailFromName = "****";
//編碼格式
encoding = "UTF-8";
}

四、非同步發送

 private static void sendMail(Email mail) {
      threadPool.execute(new Runnable() {
          @Override
          public void run() {
              try {
                  mail.send();
              } catch (EmailException var2) {
                  log.error("[郵件抄送失敗]-", var2);
              }
          }
      });
  }

五 完整發送

import org.apache.commons.lang.StringUtils;
import org.apache.commons.mail.*;
import org.slf4j.Logger;

import javax.mail.internet.MimeUtility;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
* 郵件發送工具
*/
public class MailUtil {

private static Logger log = Log.getLogger();
   private static ThreadPoolExecutor threadPool;
   private static String emailServer;
   private static String userName;
   private static String password;
   private static String emailEncoding;
   private static String emailFrom;
   private static String sysEmailFromName;
   private static String encoding;
   
   private static void initMail(Email mail) throws EmailException {
       mail.setHostName(emailServer);
       mail.setAuthentication(userName, password);
       mail.setCharset(emailEncoding);
       mail.setFrom(emailFrom, sysEmailFromName);
  }
   
   static {
threadPool = new ThreadPoolExecutor(5, 10, 3L, TimeUnit.SECONDS,
                                       new ArrayBlockingQueue(50),
                                       new ThreadPoolExecutor.DiscardPolicy());
//郵箱伺服器地址
emailServer = "mailha.sinosafe.local";
//用戶名
userName = "****";
//用戶密碼
password = "****";
//編碼格式
emailEncoding = "GBK";
//郵件來源
emailFrom = "*****.com.cn";
//郵件來源用戶名稱
sysEmailFromName = "****";
//編碼格式
encoding = "UTF-8";
}
   
    /**
    * 非同步發送郵件
    */
   private static void sendMail(Email mail) {
       threadPool.execute(new Runnable() {
           @Override
           public void run() {
               try {
                   mail.send();
              } catch (EmailException var2) {
                   log.error("[郵件抄送失敗]-", var2);
              }
          }
      });
  }
   
   /**
   * 抄送郵件
   */
   public static void bccHtmlEmail(String subject, String html, List<String> users) throws Exception {
       HtmlEmail email = new HtmlEmail();
       initMail(email);
       email.setSubject(subject);
       for (String r : users){
           email.addBcc(r);
}
       email.setHtmlMsg(html);
       email.setTextMsg("Your email client does not support HTML messages");
       sendMail(email);
  }
   
   /**
   * 單附件郵件
   */
   public static void sendEmailWithFile(String subject, String html, List<String> receivers,
                                        File file) throws UnsupportedEncodingException {
       //附件
       EmailAttachment att1 = new EmailAttachment();
       att1.setPath(file.getPath());
       att1.setDisposition(EmailAttachment.ATTACHMENT);
       att1.setDescription("attachemnt description gril 中文");
       att1.setName(MimeUtility.encodeText(file.getName()));
       MultiPartEmail email = new MultiPartEmail();
       email.setHostName(emailServer);
       email.setAuthentication(userName, password);
       email.setCharset(emailEncoding);
       email.setSubject(subject);
       try {
           email.setMsg(html);
           for (String user : receivers) {
               email.addTo(user);
          }
           email.setFrom(emailFrom, sysEmailFromName);
           email.attach(att1);  
           email.send();
      } catch (EmailException e1) {
           e1.printStackTrace();
      }
  }
   
   public static void sendEmailMultifile(String subject, String html, List<String> receivers,
                                         List<File> files){
       HtmlEmail email = new HtmlEmail();
       email.setHostName(emailServer);
       email.setAuthentication(userName, password);
       email.setCharset(emailEncoding);
       email.setSubject(subject);
       try {
           for (String user : receivers) {
               email.addTo(user);
          }
           email.setFrom(emailFrom, sysEmailFromName);
           email.setHtmlMsg(html);
           //附件
           for(File f : files){
               EmailAttachment att1 = new EmailAttachment();
               att1.setPath(f.getPath());
               att1.setDisposition(EmailAttachment.ATTACHMENT);
               att1.setDescription("attachemnt description gril 中文"); //附件描述
               //防止附件名亂碼
               att1.setName(MimeUtility.encodeText(f.getName()));
               email.attach(att1);
          }
           email.send();
      }catch (EmailException | UnsupportedEncodingException e1) {
           e1.printStackTrace();
      }
  }
   
   /**
   * 抄送郵件
   */
  public static void ccHtmlEmail(String subject, String html, String receiver, String cc)
           throws Exception {
       ccHtmlEmail(subject, html, Arrays.asList(receiver.split(",")), cc, null);
  }

   /**
   * 抄送郵件帶附件
   */
   public static void ccHtmlEmail(String subject, String html, String receiver, String cc, File file)
       throws Exception {
       ccHtmlEmail(subject, html, Arrays.asList(receiver.split(",")), cc, file);
  }

}

五、總結

Java實現郵件發送,可以非同步使用線程池批量發送多人,減小伺服器的壓力,可以發送單頁面(可以是html語言寫的頁面),也可以單附件或者多附件發送郵件。


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

-Advertisement-
Play Games
更多相關文章
  • 零售商家為什麼要建設線上商城? 傳統的實體門店服務範圍有限,只能吸引周邊500米以內的消費者。因此,如何拓展服務範圍,吸引更多的消費者到店,成為了店家迫切需要解決的問題。 缺乏忠實顧客,客戶基礎不穩,往往是一次性購物,門店無法形成有效的顧客迴流。在當前的市場環境下,構建並維護粉絲群體,成為了商家的核 ...
  • 一、ORM基本介紹 ORM 是 python編程語言後端web框架 Django的核心思想,“Object Relational Mapping”,即對象-關係映射,簡稱ORM。 二、實現目標 創建一個實例對象,用創建它的類名當做數據表名,用創建它的類屬性對應數據表的欄位,當對這個實例對象操作時,能 ...
  • 我不會長大後再學習我不會長大後再學習我不會長大後再學習我不會長大後再學習我不會長大後再學習我不會長大後再學習 ...
  • 1.根目錄概念: 1.1 項目根目錄(Project Root) 項目根目錄是你在文件系統中為整個項目選擇的頂層目錄。 它通常包含了項目的所有內容,包括源代碼、構建配置文件、文檔、測試文件等。 在版本控制系統中(如 Git),項目根目錄通常是倉庫的根目錄。 1.2 內容根目錄(Content Roo ...
  • 在這篇文章中,我們深入學習了XPath作為一種常見的網路爬蟲技巧。XPath是一種用於定位和選擇XML文檔中特定部分的語言,儘管最初是為XML設計的,但同樣適用於HTML文檔的解析。我們探討瞭如何使用XPath來定位元素並提取所需信息。 ...
  • 拓展閱讀 Devops-01-devops 是什麼? Devops-02-Jpom 簡而輕的低侵入式線上構建、自動部署、日常運維、項目監控軟體 代碼質量管理 SonarQube-01-入門介紹 項目管理平臺-01-jira 入門介紹 缺陷跟蹤管理系統,為針對缺陷管理、任務追蹤和項目管理的商業性應用軟 ...
  • 概述:C++中模板必須在頭文件中實現,因為編譯器需要可見的實現以生成模板具體實例的代碼。通過頭文件,確保模板在每個編譯單元中都能被正確展開,提高可維護性。 在C++中,模板只能在頭文件中實現的主要原因是編譯器在使用模板時需要生成對應的代碼,而這部分代碼必須在編譯時可見。以下是詳細的解釋和示例。 基礎 ...
  • 概述:在C++中,儘管存在技巧在其範圍之外訪問局部變數的記憶體,但這是不安全和易導致未定義行為的做法。通過指針或動態記憶體分配可能違反變數的生命周期和作用域規則,應當避免使用以確保代碼安全性。 在C++中,局部變數的生命周期和作用域限制了它們的訪問範圍,通常不應該在其範圍之外訪問其記憶體。然而,通過一些技 ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...