Java實現發郵件功能---網易郵箱

来源:https://www.cnblogs.com/L-Wirepuller/archive/2019/08/26/11415652.html
-Advertisement-
Play Games

[TOC] Java實現發郵件功能 前言 電子郵件的應用場景非常廣泛,例如新用戶加入,即時發送優惠清單、通過郵件找回密碼、監聽後臺程式,出現異常自動郵件通知等。 本文以網易郵箱為例,通過Java代碼實現發送郵件功能。 開發環境 請參照: "基於SpringBoot構建分模塊項目" 代碼 1. pom ...


目錄

Java實現發郵件功能

前言

電子郵件的應用場景非常廣泛,例如新用戶加入,即時發送優惠清單、通過郵件找回密碼、監聽後臺程式,出現異常自動郵件通知等。

本文以網易郵箱為例,通過Java代碼實現發送郵件功能。

開發環境

請參照: 基於SpringBoot構建分模塊項目

代碼

  1. pom.xml引入依賴

    <properties>
        <java.version>1.8</java.version>
        <!-- 你的其他依賴... -->
        <javax.mail.version>1.6.0</javax.mail.version>
    </properties>
    
    <dependencies>
        <!-- 你的其他依賴... -->
        <!-- 發送簡訊 -->
        <dependency>
            <groupId>com.sun.mail</groupId>
            <artifactId>javax.mail</artifactId>
            <version>${javax.mail.version}</version>
        </dependency>
    </dependencies>
  2. 發送郵件工具類

    package com.wayne.common.utils;
    
    import com.wayne.common.entity.CmsMailConfig;
    import com.wayne.common.vo.MailVo;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    import javax.mail.*;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeMessage;
    import java.util.Date;
    import java.util.Properties;
    
    /**
     * 發送郵件工具類
     * @author Wayne
     * @date 2019/6/19
     */
    @Component
    public class MailUtils {
    
        /**
         * 發送郵件
         * @param isSingle 是否單發: true-單發 false-群發
         * @param mailVo 郵件內容
         * @param sendTime 發送時間, 如果為null,表示立即發送
         * @param mailConfig 發件人信息及授權
         */
        public void sendMail(Boolean isSingle, MailVo mailVo, Date sendTime, CmsMailConfig mailConfig) throws MessagingException {
            Session session = this.authenticationMail();
            MimeMessage message = getMimeMessage(isSingle, session, mailConfig.getMailAccount(), mailVo.getRecipients());
            message = getContent(message, mailVo.getMailTiTle(), mailVo.getMailContent(), sendTime);
    
            Transport transport = session.getTransport();
            transport.connect(mailConfig.getMailAccount(), mailConfig.getMailLicense());
            transport.sendMessage(message, message.getAllRecipients());
            transport.close();
        }
    
        /**
         * 校驗發送的郵件內容
         */
        private MimeMessage getContent(MimeMessage message, String messageTitle, String messageContent, Date sendTime) throws MessagingException {
            if (null == messageTitle) {
                throw new MessagingException("郵件標題不能為空");
            }
            if (null == messageContent) {
                throw new MessagingException("郵件內容不能為空");
            }
            sendTime = sendTime == null ? new Date() : sendTime;
            message.setSubject(messageTitle, "UTF-8");
            message.setContent(messageContent, "text/html;charset=UTF-8");
            message.setSentDate(sendTime);
            return message;
        }
    
        /**
         * 驗證認證信息
         */
        private Session authenticationMail() throws MessagingException {
            Session session;
            try {
                Properties props = new Properties();
                //設置用戶的認證方式
                props.setProperty("mail.smtp.auth", "true");
                //設置傳輸協議
                props.setProperty("mail.transport.protocol", "smtp");
                //設置發件人的SMTP伺服器地址
                props.setProperty("mail.smtp.host", "smtp.163.com");
                session = Session.getInstance(props);
                session.setDebug(true);
            } catch (Exception e) {
                e.printStackTrace();
                throw new MessagingException("認證失敗");
            }
            return session;
        }
    
        /**
         * @param isSingle 是否單發
         *                 <P>true-向指定的一個收件人發送郵件,比如:找回密碼、登錄驗證
         *                 <P>false-向多個收件人群發郵件,比如:優惠活動推送
         *                 <P>群發時多個收件人之間用英文逗號','分割
         * @param senderAddress 發件人地址
         * @param recipientAddress 收件人地址
         */
        private MimeMessage getMimeMessage(Boolean isSingle, Session session, String senderAddress, String recipientAddress) throws MessagingException {
            MimeMessage message = new MimeMessage(session);
            try {
                message.setFrom(new InternetAddress(senderAddress));
            } catch (MessagingException e) {
                throw new MessagingException("發件人地址錯誤");
            }
            /*
              設置收件人地址
              MimeMessage.RecipientType.TO:發送
              MimeMessage.RecipientType.CC:抄送
              MimeMessage.RecipientType.BCC:密送
             */
            if (isSingle) {
                message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(recipientAddress));
            } else {
                message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipientAddress));
            }
            return message;
        }
    }
  3. 郵件內容對象-MailVo

    package com.wayne.common.vo;
    
    import lombok.Data;
    
    /**
     * @author Wayne
     * @date 2019/6/24
     */
    @Data
    public class MailVo {
        /**
         * 郵件標題
         */
        private String mailTiTle;
        /**
         * 郵件內容
         */
        private String mailContent;
        /**
         * 收件人(們)
         */
        private String recipients;
    }
  4. 發件人信息及授權

    註: 此處我假定有多個發件人,且不確定,可以動態添加、選擇由哪個發件人發送,因此我將發件人信息存儲在資料庫中。假如你的應用中發件人是固定的,則此處可寫在項目中或配在配置文件!

    我們正常發送郵件時需要輸入密碼,登錄我們的郵箱賬戶。而通過程式發送郵件不需要密碼登錄,而是使用授權碼,網易郵箱授權碼獲得方式如下

    1. 啟用授權

    啟動授權

    1. 獲得授權碼

    授權碼

    package com.wayne.common.entity;
    
    import lombok.Data;
    
    import javax.persistence.*;
    
    @Data
    @Table(name = "cms_mail_config")
    public class CmsMailConfig {
        /**
         * 主鍵
         */
        @Id
        @Column(name = "MAIL_ID")
        private Integer mailId;
    
        /**
         * 郵箱賬號
         */
        @Column(name = "MAIL_ACCOUNT")
        private String mailAccount;
    
        /**
         * 授權碼
         */
        @Column(name = "MAIL_LICENSE")
        private String mailLicense;
    
        /**
         * 狀態,0:使用,1:未使用
         */
        @Column(name = "IS_USE")
        private String isUse;
    
        /**
         * 是否刪除,0:否,1:是
         */
        @Column(name = "IS_DELETE")
        private String isDelete;
    
        /**
         * 創建者ID
         */
        @Column(name = "CREATE_ADMIN_ID")
        private Integer createAdminId;
    
        @Column(name = "EXTEND1")
        private String extend1;
    
        @Column(name = "EXTEND2")
        private String extend2;
    
        @Column(name = "EXTEND3")
        private String extend3;
    
        @Column(name = "EXTEND4")
        private String extend4;
    
        @Column(name = "EXTEND5")
        private String extend5;
    
        @Column(name = "EXTEND6")
        private String extend6;
    }
  5. Service

    @Override
    public ResponseBean sendMails(MailVo mailVo) {
        if (null == mailVo) {
            return ResponseBean.createInstance(Boolean.FALSE, 400, "參數異常");
        }
        // 獲取當前正在使用的發件人配置
        List<CmsMailConfig> mailConfigList = mailConfigMapper.selectCurrUseMailConfig();
        if (null == mailConfigList || mailConfigList.size() != 1) {
            return ResponseBean.createInstance(Boolean.FALSE, 400, "參數異常");
        }
    
        try {
            // 發送郵件
            mailUtils.sendMail(Boolean.FALSE, mailVo, null, mailConfigList.get(0));
            return ResponseBean.createInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ResponseBean.createInstance(Boolean.FALSE, 400, "參數異常");
    }
  6. Controller

    @PostMapping("/mail/sendMails")
    public ResponseBean sendMails(MailVo mailVo) {
        return mailService.sendMails(mailVo);
    }

效果

此處發送為手動發送,主要體驗代碼功能。具體應用場景可根據實際生產環境,隨機應變。比如:通過結合定時器任務,每天定時發送報表;檢測用戶登錄地址不是常用地址時,自動發郵件通知用戶;普通用戶登錄時,觸發發送郵件向管理員等

發送

接受

結束語

本人已開通公眾號,歡迎大家前來灌水

公眾號


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

-Advertisement-
Play Games
更多相關文章
  • 1 題目描述 求出1~13的整數中1出現的次數,並算出100~1300的整數中1出現的次數?為此他特別數了一下1~13中包含1的數字有1、10、11、12、13因此共出現6次,但是對於後面問題他就沒轍了。ACMer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數(從1 ...
  • 文章瀏覽量統計,low的做法是:用戶每次瀏覽,前端會發送一個GET請求獲取一篇文章詳情時,會把這篇文章的瀏覽量 +1,存進資料庫里。 ...
  • 一、switch練習 註意:switch(int/String) 我們舉例,這裡傳入的是char類型,而實際上卻是'B',就是66 二、我們判斷一個學生成績的等級 三、源碼: d21_switch_exercise.java 地址:https://github.com/ruigege66/Java/ ...
  • [TOC] 原文鏈接: "Markdown模板" 一、概述 用Qt進行開發界面時,既想要實現友好的用戶交互又想界面漂亮,那麼自定義界面就必不可少。其中有一個操作就是是我們每一個Qter開發者都要會的,而且是經常進行的。 Qt::FramelessWindowHint這個屬性想必大家都使用過,有些同學 ...
  • 1 題目描述 數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。例如輸入一個長度為9的數組{1,2,3,2,2,2,5,4,2}。由於數字2在數組中出現了5次,超過數組長度的一半,因此輸出2。如果不存在則輸出0。 數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。例如輸入一個 ...
  • Spring 總覽及 IOC 容器的使用 —— Spring 官方文檔解讀(一) 什麼是 Spring? spring 這個詞在不同情況下有不同意義。可以指 Spring 框架本身,但更多地被用來表示 Spring 整個家族的產品。 設計理念 學習框架必須要知道它的設計理念,Spring 框架有著以 ...
  • 一、自己創建: 1.創建maven項目 2.pom.xml添加如下內容: 3.創建springboot項目啟動類: 二、Web下載基礎項目包 1.進入spring官網下載springboot項目包:http://https://start.spring.io/ 2.選擇需要的配置後下載: 3.下載後 ...
  • 基於鎖和線程的併發模型是目前最常用的一種併發模型,但是併發編程模型不僅僅只有這一種,瞭解和熟悉各種併發編程模型,在解決併發問題時會有更多思路。” ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...