SpringBoot整合郵箱mail發(fā)送,javax內(nèi)置郵箱mail發(fā)送

直接引入整合后的官方依賴

一、Springboot整合mail

配置

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>



以QQ郵箱為例,開啟授權(quán)碼,粘貼到配置文件中的password項(xiàng)

https://mail.qq.com/

application.yml配置

spring:
  mail:
    #smtp服務(wù)主機(jī)  qq郵箱則為smtp.qq.com、smtp.163.com
    host: smtp.qq.com
    #服務(wù)協(xié)議
    protocol: smtp
    # 編碼集
    default-encoding: UTF-8
    #發(fā)送者郵件的賬戶
    username: 599999999@qq.com
    #發(fā)送者郵箱授權(quán)碼
    password: sadfasdggh
    test-connection: true
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true
            required: true

controller

package priv.yuey.wheels.emailDemo.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import priv.yuey.wheels.commonUtilsDemo.ResponseData;
import priv.yuey.wheels.emailDemo.SimpleEmailEntity;
import priv.yuey.wheels.emailDemo.service.EmailService;

/**
 * @Author yue
 * @Date 2022-01-02
 * @Version V1.0.1
 * @Description 郵箱服務(wù)接口
 */

@RestController
@RequestMapping("email")
public class EmailController {

    @Autowired
    private EmailService emailService;


    /**
     * 發(fā)送文本郵件
     */
    @PostMapping("text")
    public ResponseData sendTestEmail(@RequestBody SimpleEmailEntity simpleEmailEntity){

        return emailService.sendTextMail(simpleEmailEntity);
    }

    /**
     * 發(fā)送html郵件
     */
    @PostMapping("html")
    public ResponseData sendEmail(@RequestBody SimpleEmailEntity simpleEmailEntity){

        return emailService.sendHtmlMail(simpleEmailEntity);
    }

    /**
     * 發(fā)送附件郵件
     */
    @PostMapping("attachments")
    public ResponseData sendAttachmentsMail(@RequestBody SimpleEmailEntity simpleEmailEntity){

        return emailService.sendAttachmentsMail(simpleEmailEntity);
    }

}


===================================================================================   參數(shù)類
===================================================================================   參數(shù)類
===================================================================================   參數(shù)類

package priv.yuey.wheels.emailDemo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @Author yue
 * @Date 2022-01-02
 * @Version V1.0.1
 * @Description
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SimpleEmailEntity {

    /**
     * 主題
     */
    private String subject;

    /**
     * 主題內(nèi)容
     */
    private String text;

    /**
     * 接收人郵箱列表
     */
    private String tos;
//    private String[] tos;

    /**
     * 附件路徑
     */
    private String filePath;

}


Service


package priv.yuey.wheels.emailDemo.service;

import org.springframework.mail.SimpleMailMessage;
import priv.yuey.wheels.commonUtilsDemo.ResponseData;
import priv.yuey.wheels.emailDemo.SimpleEmailEntity;

/**
 * @Author yue
 * @Date 2022-01-02
 * @Version V1.0.1
 * @Description 郵箱服務(wù)
 */

public interface EmailService {

    /**
     * 發(fā)送文本郵件
     * @param simpleEmailEntity 郵件信息
     */
    ResponseData sendTextMail(SimpleEmailEntity simpleEmailEntity);

    /**
     * 發(fā)送HTML郵件
     * @param simpleEmailEntity 郵件信息
     */
    ResponseData sendHtmlMail(SimpleEmailEntity simpleEmailEntity);

    /**
     * 發(fā)送帶附件的郵件
     * @param simpleEmailEntity 郵件信息
     * @param filePath 附件路徑
     */
    ResponseData sendAttachmentsMail(SimpleEmailEntity simpleEmailEntity);

}


===================================================================================   實(shí)現(xiàn)類
===================================================================================   實(shí)現(xiàn)類
===================================================================================   實(shí)現(xiàn)類


package priv.yuey.wheels.emailDemo.service.impl;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import priv.yuey.wheels.commonUtilsDemo.ResponseData;
import priv.yuey.wheels.emailDemo.SimpleEmailEntity;
import priv.yuey.wheels.emailDemo.service.EmailService;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;

/**
 * @Author yue
 * @Date 2022-01-02
 * @Version V1.0.1
 * @Description 郵箱服務(wù)
 */

@Service
public class EmailServiceImpl implements EmailService {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Value("${spring.mail.username}")
    private String from;

    @Autowired
    private JavaMailSender mailSender;

    @Override
    public ResponseData sendTextMail(SimpleEmailEntity simpleEmailEntity) {
        SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
        //發(fā)件人
        simpleMailMessage.setFrom(from);
        //收件人
        simpleMailMessage.setTo(simpleEmailEntity.getTos());
        //郵件主題
        simpleMailMessage.setSubject(simpleEmailEntity.getSubject());
        //郵件內(nèi)容
        simpleMailMessage.setText(simpleEmailEntity.getText());
        //發(fā)送郵件
        mailSender.send(simpleMailMessage);

        return ResponseData.ok("郵件發(fā)送成功");
    }

    @Override
    public ResponseData sendHtmlMail(SimpleEmailEntity simpleEmailEntity) {
        MimeMessage message = mailSender.createMimeMessage();
        MimeMessageHelper messageHelper;
        try {
            messageHelper = new MimeMessageHelper(message,true);
            messageHelper.setFrom(from);
            messageHelper.setTo(simpleEmailEntity.getTos());
            message.setSubject(simpleEmailEntity.getSubject());
            messageHelper.setText(simpleEmailEntity.getText(),true);
            mailSender.send(message);
            logger.info("郵件已經(jīng)發(fā)送!");
        } catch (MessagingException e) {
            logger.error("發(fā)送郵件時(shí)發(fā)生異常:"+e);
            return ResponseData.ok("郵件發(fā)送失敗");
        }
        return ResponseData.ok("郵件發(fā)送成功");
    }

    @Override
    public ResponseData sendAttachmentsMail(SimpleEmailEntity simpleEmailEntity) {
        MimeMessage message = mailSender.createMimeMessage();
        MimeMessageHelper messageHelper;
        String filePath = simpleEmailEntity.getFilePath();
        try {
            messageHelper = new MimeMessageHelper(message,true);
            messageHelper.setFrom(from);
            messageHelper.setTo(simpleEmailEntity.getTos());
            messageHelper.setSubject(simpleEmailEntity.getSubject());
            messageHelper.setText(simpleEmailEntity.getText(),true);
            //攜帶附件
            File file = new File(filePath);
            String fileName = filePath.substring(filePath.lastIndexOf(File.separator));
            messageHelper.addAttachment(fileName,file);

            mailSender.send(message);
            logger.info("郵件加附件發(fā)送成功!");
        } catch (MessagingException e) {
            logger.error("發(fā)送失?。?+e);
            return ResponseData.ok("郵件發(fā)送失敗");
        }
        return ResponseData.ok("郵件發(fā)送成功");
    }

}


后續(xù)邏輯根據(jù)自己業(yè)務(wù)來
例如:郵箱校驗(yàn)用戶(類似于手機(jī)號(hào)校驗(yàn))、定時(shí)任務(wù)郵箱推送xx信息


pom.xml引入maven依賴

<!-- https://mvnrepository.com/artifact/javax.mail/mail -->
        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
            <version>1.4.7</version>
        </dependency>

具體實(shí)現(xiàn)

調(diào)用過程就不放了,比較簡單

請(qǐng)求數(shù)據(jù)參考:
url:http://localhost:8080/email/sendMixedMail
{
  "subject": "測(cè)試主題",
  "content": "測(cè)試正文內(nèi)容safds63369",
  "tos": "接受郵件的郵箱地址",
  "cc": "抄送人,下面代碼暫時(shí)沒添加抄送人,所以這個(gè)值無所謂",
  "attachmentsPath": "附件地址,需要就添加,不需要無所謂。例如:D:\em\企業(yè)微信截圖.png"
}

package priv.yuey.wheels.emailDemo.service.impl;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import priv.yuey.wheels.commonUtilsDemo.ResponseData;
import priv.yuey.wheels.emailDemo.SimpleEmailEntity;
import priv.yuey.wheels.emailDemo.service.EmailService;

import java.io.FileOutputStream;
import java.util.Date;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.*;

/**
 * @Author yue
 * @Date 2022-01-02
 * @Version V1.0.1
 * @Description 郵箱服務(wù)
 */

@Service
public class EmailServiceImpl implements EmailService {

    private final Logger logger = LoggerFactory.getLogger(EmailService.class);

    //    @Value("${spring.mail.username}")
    private static final String from = "發(fā)送人郵箱@qq.com";
    private static final String mailHost = "smtp.qq.com";// 具體郵箱服務(wù)類型來寫,這是qq郵箱的
    private static final String mailPassword = "fdsgfdsggf";// 郵箱密碼,參考文章頂部圖片
    private static final String mailTransportProtocol = "smtp";
    private static final String mailSmtpAuth = "true";// 開啟密碼校驗(yàn),默認(rèn)關(guān)閉的。


    @Override
    public ResponseData sendTextMail(SimpleEmailEntity simpleEmailEntity) {

        try {
            Properties properties = emailConfig();
            Session session = Session.getInstance(properties);
            //2、通過session得到transport對(duì)象
            Transport transport = session.getTransport();
            //3、使用郵箱的用戶名和密碼連上郵件服務(wù)器,發(fā)送郵件時(shí),發(fā)件人需要提交郵箱的用戶名和密碼給smtp服務(wù)器,用戶名和密碼都通過驗(yàn)證之后才能夠正常發(fā)送郵件給收件人。
            transport.connect(mailHost, from, mailPassword);
            // 4、創(chuàng)建消息
            MimeMessage message = new MimeMessage(session);

            //指明郵件的發(fā)件人
            message.setFrom(new InternetAddress(from));
            //指明郵件的收件人,現(xiàn)在發(fā)件人和收件人是一樣的,那就是自己給自己發(fā)
            message.setRecipient(Message.RecipientType.TO, new InternetAddress(simpleEmailEntity.getTos()));
            //郵件的標(biāo)題
            message.setSubject(simpleEmailEntity.getSubject(),"UTF-8");
            //郵件的文本內(nèi)容
            message.setContent(simpleEmailEntity.getContent(), "text/html;charset=UTF-8");
            //返回創(chuàng)建好的郵件對(duì)象
            //5、發(fā)送郵件
            transport.sendMessage(message, message.getAllRecipients());
            transport.close();
        } catch (Exception e) {
            logger.error("發(fā)送失敗", e);
        }
        return ResponseData.ok("郵件發(fā)送成功");
    }



    @Override
    public ResponseData sendAttachmentsMail(SimpleEmailEntity simpleEmailEntity) {

        try {
            Properties properties = emailConfig();
            Session session = Session.getInstance(properties);
            //2、通過session得到transport對(duì)象
            Transport transport = session.getTransport();
            //3、使用郵箱的用戶名和密碼連上郵件服務(wù)器,發(fā)送郵件時(shí),發(fā)件人需要提交郵箱的用戶名和密碼給smtp服務(wù)器,用戶名和密碼都通過驗(yàn)證之后才能夠正常發(fā)送郵件給收件人。
            transport.connect(mailHost, from, mailPassword);
            // 4、創(chuàng)建消息
            MimeMessage message = new MimeMessage(session);
            message.setFrom(new InternetAddress(from));
            message.setRecipient(Message.RecipientType.TO, new InternetAddress(simpleEmailEntity.getTos()));
            message.setSubject(simpleEmailEntity.getSubject(),"UTF-8");

            //創(chuàng)建郵件正文,為了避免郵件正文中文亂碼問題,需要使用charset=UTF-8指明字符編碼
            MimeBodyPart text = new MimeBodyPart();
            text.setContent(simpleEmailEntity.getContent(), "text/html;charset=UTF-8");

            //創(chuàng)建郵件附件
            MimeBodyPart attach = new MimeBodyPart();
            DataHandler dh = new DataHandler(new FileDataSource(simpleEmailEntity.getAttachmentsPath()));
            attach.setDataHandler(dh);
            attach.setFileName(MimeUtility.encodeText(dh.getName()));

            //創(chuàng)建容器描述數(shù)據(jù)關(guān)系
            MimeMultipart mp = new MimeMultipart();
            mp.addBodyPart(text);
            mp.addBodyPart(attach);
            mp.setSubType("mixed");

            message.setContent(mp);
            message.saveChanges();

            //5、發(fā)送郵件
            transport.sendMessage(message, message.getAllRecipients());
            transport.close();
            logger.info("郵件發(fā)送成功,收件人:{}", simpleEmailEntity.getTos());
        } catch (Exception e) {
            logger.error("發(fā)送附件郵件錯(cuò)誤!", e);
        }
        return ResponseData.ok("郵件發(fā)送成功");
    }



    /**
     * 生成一封郵件正文帶圖片的郵件
     */
    @Override
    public ResponseData sendImageMail(SimpleEmailEntity simpleEmailEntity) {

        try {
            Properties properties = emailConfig();
            Session session = Session.getInstance(properties);
            Transport transport = session.getTransport();
            transport.connect(mailHost, from, mailPassword);
            MimeMessage message = new MimeMessage(session);
            message.setFrom(new InternetAddress(from));
            message.setRecipient(Message.RecipientType.TO, new InternetAddress(simpleEmailEntity.getTos()));
            message.setSubject("帶圖片的郵件","UTF-8");

            // 準(zhǔn)備郵件數(shù)據(jù)
            // 1、準(zhǔn)備圖片數(shù)據(jù)
            MimeBodyPart image = new MimeBodyPart();
            DataHandler dh = new DataHandler(new FileDataSource("D:\\em\\企業(yè)微信截圖.png"));
            image.setDataHandler(dh);// 將圖片數(shù)據(jù)添加到"節(jié)點(diǎn)"
            image.setContentID("cstp");// 這個(gè)編號(hào)可在文本中引用

            // 2、準(zhǔn)備郵件正文數(shù)據(jù)
            MimeBodyPart text = new MimeBodyPart();
            text.setContent("這是一封郵件正文帶圖片<img src='cid:cstp'/></a>的郵件", "text/html;charset=UTF-8");


            // 3、描述數(shù)據(jù)關(guān)系
            MimeMultipart mm = new MimeMultipart();
            mm.addBodyPart(text);
            mm.addBodyPart(image);
            mm.setSubType("related");// 關(guān)聯(lián)關(guān)系

            message.setContent(mm);
            //設(shè)置郵件的發(fā)送時(shí)間,默認(rèn)立即發(fā)送
            message.setSentDate(new Date());
            message.saveChanges();


            //發(fā)送郵件
            transport.sendMessage(message, message.getAllRecipients());
            transport.close();
        } catch (Exception e) {
            logger.error("發(fā)送郵件失敗", e);
        }
        return ResponseData.ok("郵件發(fā)送成功");
    }


    /**
     * 生成一封帶附件和帶圖片的郵件
     */
    @Override
    public ResponseData sendMixedMail(SimpleEmailEntity simpleEmailEntity) {

        try {

            Properties properties = emailConfig();
            Session session = Session.getInstance(properties);
            //2、通過session得到transport對(duì)象
            Transport transport = session.getTransport();
            //3、使用郵箱的用戶名和密碼連上郵件服務(wù)器,發(fā)送郵件時(shí),發(fā)件人需要提交郵箱的用戶名和密碼給smtp服務(wù)器,用戶名和密碼都通過驗(yàn)證之后才能夠正常發(fā)送郵件給收件人。
            transport.connect(mailHost, from, mailPassword);
            // 4、創(chuàng)建消息
            MimeMessage message = new MimeMessage(session);
            //設(shè)置郵件的基本信息
            message.setFrom(new InternetAddress(from));
            message.setRecipient(Message.RecipientType.TO, new InternetAddress(simpleEmailEntity.getTos()));
            message.setSubject("帶附件和帶圖片的的郵件");

            // 準(zhǔn)備郵件數(shù)據(jù)
            // 1、準(zhǔn)備圖片數(shù)據(jù)
            MimeBodyPart image = new MimeBodyPart();
            DataHandler dh = new DataHandler(new FileDataSource("D:\\em\\企業(yè)微信截圖.png"));
            image.setDataHandler(dh);// 將圖片數(shù)據(jù)添加到"節(jié)點(diǎn)"
            image.setContentID("cstp");// 這個(gè)編號(hào)可在文本中引用

            // 2、準(zhǔn)備郵件正文數(shù)據(jù)
            MimeBodyPart text = new MimeBodyPart();
            text.setContent("這是一封郵件正文帶圖片<img src='cid:cstp'/></a>的郵件", "text/html;charset=UTF-8");

            //描述關(guān)系:正文和圖片
            MimeMultipart mm_text_image = new MimeMultipart();
            mm_text_image.addBodyPart(text);
            mm_text_image.addBodyPart(image);
            mm_text_image.setSubType("related");// 關(guān)聯(lián)關(guān)系

            // 講圖片、文本轉(zhuǎn)成普通節(jié)點(diǎn)
            MimeBodyPart text_image = new MimeBodyPart();
            text_image.setContent(mm_text_image);

            //附件1
            MimeBodyPart attach1 = new MimeBodyPart();
            DataHandler dh2 = new DataHandler(new FileDataSource("D:\\em\\滴滴出行電子發(fā)票及行程報(bào)銷單.zip"));
            attach1.setDataHandler(dh2);
            attach1.setFileName(MimeUtility.encodeText(dh2.getName()));
            //附件2
            MimeBodyPart attach2 = new MimeBodyPart();
            DataHandler dh3 = new DataHandler(new FileDataSource("D:\\em\\滴滴出行行程報(bào)銷單.pdf"));
            attach2.setDataHandler(dh3);
            attach2.setFileName(MimeUtility.encodeText(dh3.getName()));


            // 10. 大匯總:設(shè)置(文本+圖片)的節(jié)點(diǎn) 和 附件 節(jié)點(diǎn) 的關(guān)系(合成一個(gè)大的混合"節(jié)點(diǎn)" / Multipart )
            MimeMultipart mm = new MimeMultipart();
            mm.addBodyPart(text_image);
            mm.addBodyPart(attach1);     // 如果有多個(gè)附件,可以創(chuàng)建多個(gè)多次添加
            mm.addBodyPart(attach2);     // 如果有多個(gè)附件,可以創(chuàng)建多個(gè)多次添加
            mm.setSubType("mixed");         // 混合關(guān)系

            message.setContent(mm);
            message.saveChanges();

            //5、發(fā)送郵件
            transport.sendMessage(message, message.getAllRecipients());
            transport.close();
        } catch (Exception e) {
            logger.error("發(fā)送郵件失敗", e);
        }
        return ResponseData.ok("發(fā)送成功");
    }

    /**
     * 郵箱基礎(chǔ)配置
     */
    public Properties emailConfig() {
        Properties prop = new Properties();
        prop.setProperty("mail.host", mailHost);
        prop.setProperty("mail.transport.protocol", mailTransportProtocol);
        prop.setProperty("mail.smtp.auth", mailSmtpAuth);
        return prop;
    }

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容