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

Java實現發郵件功能

前言

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

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

開發環境

請參照: 基於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. 發送郵件工具類session

    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. 郵件內容對象-MailVoapp

    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. 發件人信息及受權ide

    注: 此處我假定有多個發件人,且不肯定,能夠動態添加、選擇由哪一個發件人發送,所以我將發件人信息存儲在數據庫中。假如你的應用中發件人是固定的,則此處可寫在項目中或配在配置文件!工具

    咱們正常發送郵件時須要輸入密碼,登陸咱們的郵箱帳戶。而經過程序發送郵件不須要密碼登陸,而是使用受權碼,網易郵箱受權碼得到方式以下this

    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);
    }

效果

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

發送

接受

結束語

本人已開通公衆號,歡迎你們前來灌水

公衆號

相關文章
相關標籤/搜索