天天看點

Springboot 郵件發送(html内嵌圖檔、附件)1、引入依賴包2、配置檔案3、業務邏輯

1、引入依賴包

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

2、配置檔案

spring:
  mail:
    host: smtp.qq.com
    # 發送者的郵箱賬号
    username: [email protected]
    # 郵箱密碼授權碼
    password: ****
    default-encoding: utf-8
    properties:
      mail:
      	debug: true
        smtp:
          auth: true
          starttls:
            enable: true
            required: true
           

3、業務邏輯

3.1 定義郵件發送類

@Data
public  class MailInfo {
    // 郵件接收人
    private String[] receiver;
    // 郵件主題
    private String subject;
    // 郵件的文本内容
    private String content;
    // 抄送人
    private String[] cc;
    // 郵件附件的檔案名
    private String[] attachFileNames;
    // 郵件内容内嵌圖檔
    private Map<String,String> imageMap;
}
           

3.2 定義 ISendMsgHandle

public interface ISendMsgHandle {

	/**
	 * 功能描述:發送text郵件
	 * @param mailInfo 郵件資訊
	 * @return {@link }
	 * @author weigang
	 * @date 2021/12/29 9:27 上午
	 */
	void sendSimpleTextEmail(MailInfo mailInfo);

	/**
	 * 功能描述:發送html郵件
	 * @param mailInfo 郵件資訊
	 * @param html 是否是html郵件
	 * @return {@link }
	 * @author weigang
	 * @date 2021/12/29 9:27 上午
	 */
	void sendHtmlEmail(MailInfo mailInfo,boolean html);

	/**
	 * 功能描述:發送文本内容(内嵌圖檔)且帶附件的html郵件
	 * @param mailInfo 郵件資訊
	 * @return {@link }
	 * @author wi-gang
	 * @date 2021/12/29 2:49 下午
	 */
	void sendEnclosureEmail(MailInfo mailInfo);
}
           

3.3 郵件處理邏輯

import com.weigang.email.bean.MailInfo;
import com.weigang.email.handle.ISendMsgHandle;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.annotation.Resource;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.util.*;

@Slf4j
@Component
public class EmailSendMsgHandle implements ISendMsgHandle {

    @Resource
    private JavaMailSender javaMailSender;

    @Value(value = "${spring.mail.username}")
    private String emailFrom;


    @Override
    public void sendSimpleTextEmail(MailInfo mailInfo) {
        try {
            SimpleMailMessage mailMessage = new SimpleMailMessage();
            //發件人
            mailMessage.setFrom(emailFrom);
            //接收人
            mailMessage.setTo(mailInfo.getReceiver());
            //郵件主題
            mailMessage.setSubject(mailInfo.getSubject());
            //郵件抄送
            mailMessage.setCc(mailInfo.getCc());
            //郵件内容
            mailMessage.setText(mailInfo.getContent());
            //發送郵件
            javaMailSender.send(mailMessage);
        } catch (Exception e) {
            log.error("郵件發送失敗:{}", e.getMessage());
        }
    }

    @Override
    public void sendHtmlEmail(MailInfo mailInfo,boolean html) {
        try {
            MimeMessage mimeMailMessage = javaMailSender.createMimeMessage();
            //true 表示需要建立一個multipart message
            MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMailMessage);
            //發件人
            mimeMessageHelper.setFrom(emailFrom);
            //接收人
            mimeMessageHelper.setTo(mailInfo.getReceiver());
            //郵件主題
            mimeMessageHelper.setSubject(mailInfo.getSubject());
            //郵件抄送
            mimeMessageHelper.setCc(mailInfo.getCc());
            //郵件内容
            mimeMessageHelper.setText(mailInfo.getContent(), html);
            javaMailSender.send(mimeMailMessage);
        } catch (Exception e) {
            log.error("郵件發送失敗:{}", e.getMessage());
        }
    }


    @Override
    public void sendEnclosureEmail(MailInfo mailInfo) {
        try {
            MimeMessage mimeMailMessage = javaMailSender.createMimeMessage();
            //true 表示需要建立一個multipart message
            MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMailMessage, true);
            //發件人
            mimeMessageHelper.setFrom(emailFrom);
            //郵件接收人
            mimeMessageHelper.setTo(mailInfo.getReceiver());
            //郵件主題
            mimeMessageHelper.setSubject(mailInfo.getSubject());
            //郵件抄送
            mimeMessageHelper.setCc(mailInfo.getCc());
            //設定顯示的發件時間
            mimeMessageHelper.setSentDate(new Date());

            MimeMultipart allMultipart = new MimeMultipart();

            //建立代表郵件正文和附件的各個MimeBodyPart對象
            MimeBodyPart contentPart = createContent(mailInfo.getContent(), mailInfo.getImageMap());
            allMultipart.addBodyPart(contentPart);

            //建立用于組合郵件正文和附件的MimeMultipart對象
            for (int i = 0; i < mailInfo.getAttachFileNames().length; i++) {
                allMultipart.addBodyPart(createAttachment(mailInfo.getAttachFileNames()[i]));
            }

            //設定整個郵件内容為最終組合出的MimeMultipart對象
            mimeMailMessage.setContent(allMultipart);
            mimeMailMessage.saveChanges();

            javaMailSender.send(mimeMailMessage);
        } catch (Exception e) {
            log.error("郵件發送失敗:{}", e.getMessage());
        }
    }

    /**
     * 功能描述:郵件附件
     * @param filename 檔案路徑
     * @return {@link MimeBodyPart}
     * @author wi-gang
     * @date 2021/12/29 2:50 下午
     */
    public MimeBodyPart createAttachment(String filename) throws Exception {
        //建立儲存附件的MimeBodyPart對象,并加入附件内容和相應的資訊
        MimeBodyPart attachPart = new MimeBodyPart();
        FileDataSource fsd = new FileDataSource(filename);
        attachPart.setDataHandler(new DataHandler(fsd));
        attachPart.setFileName(fsd.getName());
        return attachPart;
    }

    /**
     * 功能描述:文本内容
     * @param body html格式的文本内容
     * @return {@link MimeBodyPart}
     * @author wi-gang
     * @date 2021/12/29 2:50 下午
     */
    public MimeBodyPart createContent(String body) throws Exception {
        //建立代表組合Mime消息的MimeMultipart對象,将該MimeMultipart對象儲存到MimeBodyPart對象
        MimeBodyPart contentPart = new MimeBodyPart();
        MimeMultipart contentMultipart = new MimeMultipart("related");

        //建立用于儲存HTML正文的MimeBodyPart對象,并将它儲存到MimeMultipart中
        MimeBodyPart htmlBodyPart = new MimeBodyPart();
        htmlBodyPart.setContent(body, "text/html;charset=UTF-8");
        contentMultipart.addBodyPart(htmlBodyPart);

        //将MimeMultipart對象儲存到MimeBodyPart對象
        contentPart.setContent(contentMultipart);
        return contentPart;
    }

    /**
     * 功能描述:文本内嵌圖檔
     * @param body html格式的文本内容
	 * @param map 圖檔集合
     * @return {@link MimeBodyPart}
     * @author wi-gang
     * @date 2021/12/29 2:50 下午
     */
    public MimeBodyPart createContent(String body, Map<String, String> map) throws Exception {
        //建立代表組合Mime消息的MimeMultipart對象,将該MimeMultipart對象儲存到MimeBodyPart對象
        MimeBodyPart contentPart = new MimeBodyPart();
        MimeMultipart contentMultipart = new MimeMultipart("related");

        //建立用于儲存HTML正文的MimeBodyPart對象,并将它儲存到MimeMultipart中
        MimeBodyPart htmlBodyPart = new MimeBodyPart();
        htmlBodyPart.setContent(body, "text/html;charset=UTF-8");
        contentMultipart.addBodyPart(htmlBodyPart);

        if (map != null && map.size() > 0) {
            Set<Map.Entry<String, String>> set = map.entrySet();
            for (Map.Entry<String, String> entry : set) {
                //建立用于儲存圖檔的MimeBodyPart對象,并将它儲存到MimeMultipart中
                MimeBodyPart gifBodyPart = new MimeBodyPart();
                FileDataSource fds = new FileDataSource(entry.getValue());//圖檔所在的目錄的絕對路徑

                gifBodyPart.setDataHandler(new DataHandler(fds));
                gifBodyPart.setContentID(entry.getKey());    //cid的值
                contentMultipart.addBodyPart(gifBodyPart);
            }
        }

        //将MimeMultipart對象儲存到MimeBodyPart對象
        contentPart.setContent(contentMultipart);
        return contentPart;
    }
}
           

3.4 測試

(1)簡單郵件發送

@Test
    void sendSimpleTextEmail() {
        MailInfo mailInfo = new MailInfo();
        mailInfo.setReceiver(new String[]{"[email protected]"});
        mailInfo.setSubject("測試主題");
        mailInfo.setContent("郵件内容");
        emailSendMsgHandle.sendSimpleTextEmail(mailInfo);
    }
           

​​​​

Springboot 郵件發送(html内嵌圖檔、附件)1、引入依賴包2、配置檔案3、業務邏輯

(2)以html格式發送

@Test
    public void sendHTMLMail() {
        MailInfo mailBean = new MailInfo();
        //接收人
        mailBean.setReceiver(new String[]{"[email protected]"});
        mailBean.setSubject("SpringBootMailHTML之這是一封HTML格式的郵件");
        //抄送給誰
        mailBean.setCc(new String[]{"[email protected]","winsky.com"});
        StringBuilder sb = new StringBuilder();
        sb.append("<h2>SpirngBoot測試郵件HTML</h2>")
                .append("<p style='text-align:left'>這是一封HTML郵件...</p>")
                .append("<p> 時間為:"+ new Date() +"</p>");
        mailBean.setContent(sb.toString());
        //true、false控制以普通文本發送還是以html格式發送
        emailSendMsgHandle.sendHtmlEmail(mailBean,true);
    }
           
Springboot 郵件發送(html内嵌圖檔、附件)1、引入依賴包2、配置檔案3、業務邏輯

(2)以html格式發送并帶附件

@Test
    void sendEmail() {
        MailInfo mailBean = new MailInfo();
        mailBean.setReceiver(new String[]{"[email protected]"});
        mailBean.setSubject("SpringBootMailHTML之這是一封HTML格式的郵件");
        mailBean.setCc(new String[]{"[email protected]","winsky.com"});
        StringBuilder sb = new StringBuilder();
        sb.append("<h2>SpirngBoot測試郵件HTML</h2>")
                .append("<p style='text-align:left'>這是一封HTML郵件...</p>")
                .append("<p> 時間為:"+ new Date() +"</p>");
        mailBean.setContent(sb.toString());
        mailBean.setAttachFileNames(new String[]{"/Users/Downloads/密碼管理.xlsx","/Users/Downloads/1635834323888.jpg"});
        emailSendMsgHandle.sendEnclosureEmail(mailBean);
    }
           
Springboot 郵件發送(html内嵌圖檔、附件)1、引入依賴包2、配置檔案3、業務邏輯

(3)以html格式内嵌圖檔并帶附件發送

@Test
    void sendEmail2() {
        MailInfo mailBean = new MailInfo();
        mailBean.setReceiver(new String[]{"[email protected]"});
        mailBean.setSubject("SpringBootMailHTML之這是一封HTML格式的郵件");
        mailBean.setCc(new String[]{"[email protected]","winsky.com"});
        StringBuilder sb = new StringBuilder();
        sb.append("<h2>SpirngBoot測試郵件HTML</h2>")
                .append("<p style='text-align:left'>這是一封HTML郵件...</p>")
                .append("<a href=http://www.baidu.com>點選進入百度</a><br/>")
                //内嵌圖檔
                .append("<img src=\"cid:a00000001\"><br/><br/>")
                .append("<img src=\"cid:a00000002\">")
                .append("<p> 時間為:"+ new Date() +"</p>");
        mailBean.setContent(sb.toString());
        //附件
        mailBean.setAttachFileNames(new String[]{"/Users/Downloads/密碼管理.xlsx","/Users/Downloads/1635834323888.jpg"});
        //内嵌了多少張圖檔,如果沒有,則new一個不帶值的Map
        Map<String,String> image = new HashMap<>();
        image.put("a00000001", "/Users/Downloads/WechatIMG22.jpg");
        image.put("a00000002", "/Users/Downloads/face_1631083961355.png");

        mailBean.setImageMap(image);
        emailSendMsgHandle.sendEnclosureEmail(mailBean);
    }
           
Springboot 郵件發送(html内嵌圖檔、附件)1、引入依賴包2、配置檔案3、業務邏輯

(4)以表格的形式發送郵件

log.info(" --- 任務排程開始 --- ");
        try {
            //查詢維保時間即将過期的産品
            List<CustomerProductVo> customerProductList = customerService.selectCustomerProductList();
            //根據項目編号去重
            List<CustomerProductVo> newCustomerProductList = customerProductList.stream().filter(distinctByKey(CustomerProductVo::getProjectCode)).collect(Collectors.toList());

            //發送郵件
            MailInfo mailBean = new MailInfo();
//            mailBean.setReceiver(new String[]{"[email protected]"});
            mailBean.setSubject("維保時間即将過期的客戶産品");
            mailBean.setCc(new String[]{"[email protected]"});
            StringBuilder stringBuilder = new StringBuilder();
            //表格制作
            stringBuilder.append("\r\n");
            stringBuilder.append("<html><head></head><body><h2>您好,以下内容是維保時間即将過期的客戶産品,請及時處理!</h2>");
            stringBuilder.append("<table 5\" style=\"border:solid 1px #E8F2F9;font-size=14px;;font-size:22px;\">");
            stringBuilder.append("<tr style=\"background-color: #428BCA; color:#ffffff\">" +
                    "<th width=\"180px\">客戶中文名稱</th>" +
                    "<th width=\"180px\">客戶英文名稱</th>" +
                    "<th width=\"180px\">項目名稱</th>" +
                    "<th width=\"180px\">項目編号</th>" +
//                    "<th width=\"180px\">産品名稱</th>" +
//                    "<th width=\"180px\">産品版本</th>" +
                    "<th width=\"180px\">查詢時間</th>" +
                    "<th width=\"200px\">維保結束時間</th>" +
                    "</tr>");
            for (CustomerProductVo vo : newCustomerProductList) {
                stringBuilder.append("</tr>");
                stringBuilder.append("<td style=\"text-align:center\">" + vo.getCustomerChName() + "</td>");
                stringBuilder.append("<td style=\"text-align:center\">" + vo.getCustomerEnName() + "</td>");
                stringBuilder.append("<td style=\"text-align:center\">" + vo.getProjectName() + "</td>");
                stringBuilder.append("<td style=\"text-align:center\">" + vo.getProjectCode() + "</td>");
//                stringBuilder.append("<td style=\"text-align:center\">" + vo.getProductName() + "</td>");
//                stringBuilder.append("<td style=\"text-align:center\">" + vo.getProductVersion() + "</td>");
                stringBuilder.append("<td style=\"text-align:center\">" + DateUtils.date2Str(new SimpleDateFormat("yyyy-MM-dd")) + "</td>");
                stringBuilder.append("<td style=\"text-align:center\">" + DateUtils.date2Str(vo.getDealine(),new SimpleDateFormat("yyyy-MM-dd")) + "</td>");
                stringBuilder.append("</tr>");
            }
            stringBuilder.append("</table>");
            stringBuilder.append("</body></html>");
            //發送郵件
            mailBean.setContent(stringBuilder.toString());
            emailSendMsgHandle.sendHtmlEmail(mailBean,true);

        } catch (Exception e) {
            e.printStackTrace();
            log.error("郵件發送失敗,失敗原因是:{}",e.getMessage());
        }
        log.info(" --- 執行完畢,時間:"+DateUtils.now()+"---");
           
Springboot 郵件發送(html内嵌圖檔、附件)1、引入依賴包2、配置檔案3、業務邏輯

繼續閱讀