精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

多樣化郵件功能實戰指南,你學會了嗎?

網絡 通信技術
本文將探討如何實現文本、附件、HTML、圖片類型郵件的發送,并在此基礎上增加一些實用功能,如批量發送郵件、動態郵件模板渲染等,助力開發者打造更強大的郵件服務。

前言

在當今數字化的時代,郵件作為一種重要的通信方式,廣泛應用于各類系統中。無論是系統通知、用戶交互,還是文件傳輸等場景,郵件都發揮著不可或缺的作用。

本文將探討如何實現文本、附件、HTML、圖片類型郵件的發送,并在此基礎上增加一些實用功能,如批量發送郵件、動態郵件模板渲染等,助力開發者打造更強大的郵件服務。

實現

依賴引入

<dependencies>
    <!-- Spring Boot Web支持,用于后續可能的Web接口開發 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- Spring Boot郵件啟動器 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-mail</artifactId>
    </dependency>
    <!-- JavaMail API -->
    <dependency>
        <groupId>com.sun.mail</groupId>
        <artifactId>javax.mail</artifactId>
    </dependency>
    <!-- Thymeleaf模板引擎,用于郵件模板渲染 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <!-- 測試依賴 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <!-- Lombok簡化代碼編寫 -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

配置信息

spring:
  mail:
    host: smtp.163.com
    port: 465
    username: your_email@163.com
    password: your_password
    properties:
      mail:
        debug: true
        smtp:
          auth: true
          starttls.enable: true
          socketFactoryClass: javax.net.ssl.SSLSocketFactory
    default-encoding: UTF-8
    protocol: smtps
  thymeleaf:
    prefix: classpath:/templates/
    suffix: .html
    cache: false


from:
  mail:
    address: your_email@163.com

請將your_email@163.com替換為實際的郵箱地址,your_password替換為郵箱的授權碼(非登錄密碼)。若使用其他郵箱服務器,需相應修改spring.mail.host等配置。

核心代碼

public interface MailService {
    void sendSimpleMail(String to, String subject, String content);
    void sendHtmlMail(String to, String subject, String content);
    void sendAttachmentsMail(String to, String subject, String content, String filePath);
    void sendInlineResourceMail(String to, String subject, String content, String rscPath, String rscId);
    void sendBatchSimpleMail(String[] tos, String subject, String content);
    void sendDynamicTemplateMail(String to, String subject, String templateName, Object model);
}
實現類
import lombok.extern.slf4j.Slf4j;
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 org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.yian.service.MailService;

import javax.annotation.Resource;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;


@Service
@Slf4j
public class MailServiceImpl implements MailService {
    @Resource
    private JavaMailSender mailSender;
    @Resource
    private TemplateEngine templateEngine;
    @Value("${from.mail.address}")
    private String from;

    @Override
    public void sendSimpleMail(String to, String subject, String content) {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom(from);
        message.setTo(to);
        message.setSubject(subject);
        message.setText(content);
        try {
            mailSender.send(message);
            log.info("文本郵件已經發送");
        } catch (Exception e) {
            log.error("發生發送文本郵件錯誤!", e);
        }
    }

    @Override
    public void sendHtmlMail(String to, String subject, String content) {
        MimeMessage message = mailSender.createMimeMessage();
        try {
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(from);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(content, true);
            mailSender.send(message);
            log.info("html郵件發送成功");
        } catch (MessagingException e) {
            log.error("發生發送html郵件錯誤!", e);
        }
    }

    @Override
    public void sendAttachmentsMail(String to, String subject, String content, String filePath) {
        MimeMessage message = mailSender.createMimeMessage();
        try {
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(from);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(content, true);
            FileSystemResource file = new FileSystemResource(new File(filePath));
            String fileName = filePath.substring(filePath.lastIndexOf(File.separator));
            helper.addAttachment(fileName, file);
            mailSender.send(message);
            log.info("帶附件的郵件已經發送");
        } catch (MessagingException e) {
            log.error("發生發送帶附件郵件錯誤!", e);
        }
    }

    @Override
    public void sendInlineResourceMail(String to, String subject, String content, String rscPath, String rscId) {
        MimeMessage message = mailSender.createMimeMessage();
        try {
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(from);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(content, true);
            FileSystemResource res = new FileSystemResource(new File(rscPath));
            helper.addInline(rscId, res);
            mailSender.send(message);
            log.info("嵌入靜態圖片的郵件已經發送");
        } catch (MessagingException e) {
            log.error("發生發送嵌入靜態圖片郵件錯誤!", e);
        }
    }

    @Override
    public void sendBatchSimpleMail(String[] tos, String subject, String content) {
        for (String to : tos) {
            sendSimpleMail(to, subject, content);
        }
        log.info("批量文本郵件已發送完成");
    }

    @Override
    public void sendDynamicTemplateMail(String to, String subject, String templateName, Object model) {
        Context context = new Context();
        if (model instanceof Map) {
            context.setVariables((Map<String, Object>) model);
        } elseif (model != null) {
            Map<String, Object> map = new HashMap<>();
            Field[] fields = model.getClass().getDeclaredFields();
            for (Field field : fields) {
                field.setAccessible(true);
                try {
                    map.put(field.getName(), field.get(model));
                } catch (IllegalAccessException e) {
                    log.error("轉換對象為Map時出錯", e);
                }
            }
            context.setVariables(map);
        }
        String emailContent = templateEngine.process(templateName, context);
        sendHtmlMail(to, subject, emailContent);
        log.info("動態模板郵件已發送");
    }
}

在 src/main/resources/templates 目錄下創建 userInfoTemplate.html 文件(Thymeleaf 默認會從該目錄加載模板),示例內容如下:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>用戶信息模板</title>
</head>
<body>
    <h1>用戶信息</h1>
    <p>姓名:<span th:text="${name}"></span></p>
    <p>年齡:<span th:text="${age}"></span></p>
</body>
</html>

單元測試

import cn.example.mail.service.MailService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class MailBootTest {
    @Autowired
    private MailService mailService;

    @Test
    public void testSimpleMail() {
        mailService.sendSimpleMail("test@example.com", "測試簡單文本郵件", "這是一封簡單的文本郵件");
    }

    @Test
    public void testHtmlMail() {
        String content = "<html><body><h2>hello! 這是一封html郵件!</h2></body></html>";
        mailService.sendHtmlMail("test@example.com", "這是html郵件", content);
    }

    @Test
    public void sendAttachmentsMail() {
        String filePath = "C:\\example\\attachment.pdf";
        mailService.sendAttachmentsMail("test@example.com", "主題:帶附件的郵件", "有附件,請查收!", filePath);
    }

    @Test
    public void sendInlineResourceMail() {
        String rscId = "exampleImage";
        String content = "<html><body>這是有圖片的郵件:<img src='cid:" + rscId + "'></body></html>";
        String imgPath = "C:\\example\\image.jpg";
        mailService.sendInlineResourceMail("test@example.com", "主題:這是有圖片的郵件", content, imgPath, rscId);
    }

    @Test
    public void sendBatchSimpleMail() {
        String[] tos = {"test1@example.com", "test2@example.com"};
        mailService.sendBatchSimpleMail(tos, "批量測試郵件", "這是批量發送的文本郵件");
    }

    @Test
    public void sendDynamicTemplateMail() {
        User user = new User("一安", 25);
        mailService.sendDynamicTemplateMail("test@example.com", "動態模板郵件測試", "userInfoTemplate", user);
    }

    // 測試用的用戶類
    private static class User {
        private String name;
        private int age;

        public User(String name, int age) {
            this.name = name;
            this.age = age;
        }

        // 省略getter和setter方法
    }
}

總結

在實際項目中,還可以進一步拓展郵件服務的功能,例如:

  • 異步發送郵件:使用 Spring 的異步任務機制,將郵件發送任務異步化,避免阻塞主線程,提高系統性能和響應速度。
  • 郵件發送狀態跟蹤:通過郵件服務器的反饋或自定義的跟蹤機制,記錄郵件的發送狀態(如發送成功、失敗、已讀等),方便系統進行后續處理。
責任編輯:武曉燕 來源: 一安未來
相關推薦

2023-01-30 09:01:54

圖表指南圖形化

2023-07-30 22:29:51

BDDMockitoAssert測試

2023-05-04 08:01:35

umi 插件開發插件

2022-05-06 09:00:56

CSS元素Flex

2022-10-09 09:30:33

CSS瀏覽器十六進制

2023-10-13 09:04:09

2023-05-04 10:08:00

Windows 10WinAFL二進制

2022-04-13 09:01:45

SASSCSS處理器

2022-09-26 08:49:11

Java架構CPU

2021-11-14 16:06:54

實戰中文Linkerd

2023-12-08 13:23:00

大數據MySQL存儲

2024-01-19 08:25:38

死鎖Java通信

2023-07-26 13:11:21

ChatGPT平臺工具

2024-02-04 00:00:00

Effect數據組件

2023-01-10 08:43:15

定義DDD架構

2022-10-11 08:48:08

HTTP狀態碼瀏覽器

2022-12-08 10:49:43

2023-08-01 12:51:18

WebGPT機器學習模型

2024-01-02 12:05:26

Java并發編程

2023-09-07 07:13:51

點贊
收藏

51CTO技術棧公眾號

中文字幕自拍偷拍| 91狠狠综合久久久久久| 在线观看特色大片免费视频| 久久久国产精华| 91精品久久久久久久久久| 欧美日韩中文字幕在线观看| 麻豆一区一区三区四区| 日本韩国精品在线| 中文字幕精品在线播放| 天天躁日日躁狠狠躁喷水| 免费在线观看视频一区| 国语自产精品视频在线看| 自拍偷拍你懂的| 国产suv精品一区二区四区视频| 日韩欧美在线免费| 男女啪啪免费观看| 不卡在线视频| eeuss国产一区二区三区| 国产精品爽黄69天堂a| 三级黄色在线视频| 欧美激情第二页| 深夜福利一区二区| 精品国产av色一区二区深夜久久| 欧美一级做a| 日韩欧美精品网址| 男人天堂a在线| 二区三区在线观看| 中文字幕不卡的av| 久久青青草综合| 囯产精品久久久久久| 麻豆91精品91久久久的内涵| 欧美专区在线观看| 国产午夜精品无码| 午夜久久黄色| 久久视频免费观看| 五月婷婷欧美激情| 免费欧美视频| 亚洲欧美精品伊人久久| 国产精品手机在线观看| 一区二区三区国产好| 欧美日韩国产另类一区| 老头吃奶性行交视频| 蜜桃视频动漫在线播放| 亚洲国产精品久久人人爱蜜臀| 综合久久国产| 欧美69xxx| 中文字幕一区二区三区精华液| 欧美精品123| 性xxxxbbbb| 91影院在线观看| 久久精品国产精品国产精品污| 亚洲精品视频专区| 不卡一区中文字幕| 激情久久av| 黄色www视频| www.久久精品| 久久久久高清| 邻家有女韩剧在线观看国语| 91热门视频在线观看| 久久久久网址| 韩国中文字幕2020精品| 国产视频一区二区在线| 亚洲国产高清国产精品| 永久免费在线观看视频| 亚洲丝袜另类动漫二区| 日韩精品免费一区| 欧美videosex性欧美黑吊| 亚洲国产精品久久久男人的天堂| 奇米影视亚洲色图| av最新在线| 日本高清视频一区二区| 69久久久久久| 欧美经典影片视频网站| 精品欧美一区二区久久| 懂色av粉嫩av蜜乳av| 久久97视频| 日日骚av一区| 国产一二三区精品| 亚洲高清av| 日韩美女视频在线观看| 国产又粗又黄又爽视频| 高清视频一区二区| 日本视频精品一区| а天堂中文在线官网| 亚洲成av人片www| 麻豆av免费在线| 4438五月综合| 亚洲精品国产福利| 91制片厂在线| 亚洲一区二区毛片| 国产精品自产拍在线观| 丰满人妻一区二区三区免费视频| 久久综合成人精品亚洲另类欧美 | 亚洲美女91| 国产精品成人免费电影| www.av日韩| 久久久99精品久久| 日韩视频 中文字幕| 一区二区电影免费观看| 777xxx欧美| 少妇按摩一区二区三区| 欧美黄色一级视频| 国产精品国产三级国产专播精品人| 国产免费高清av| 91毛片在线观看| 无码人妻精品一区二区三区99v| 永久免费毛片在线播放| 欧美一卡2卡3卡4卡| 中文字幕网站在线观看| 亚洲性人人天天夜夜摸| 成人激情在线观看| 蝌蚪视频在线播放| 亚洲午夜免费电影| www.se五月| 一区二区三区日本久久久 | 国产九色精品成人porny| 久久99国产精品| 性欧美video高清bbw| 欧美亚洲综合一区| 中国av免费看| 悠悠资源网久久精品| 国产欧美婷婷中文| 丁香婷婷在线| 色94色欧美sute亚洲线路一ni| 扒开伸进免费视频| 一个色综合网| 国产精品美女呻吟| 国产福利免费在线观看| 日韩欧美在线观看| 亚洲精品理论片| 9色国产精品| 国产精品裸体一区二区三区| 在线中文字幕-区二区三区四区| 欧美日韩亚洲国产综合| 欧美人妻一区二区三区| 亚洲欧美日韩专区| 久久综合九九| 一二三四视频在线中文| 亚洲精品久久久久久下一站| 国产无精乱码一区二区三区| 国产精品一区专区| 国产精品无码电影在线观看| 日本久久久久| 久久久精品久久久久| 一个人看的www日本高清视频| 欧美激情在线一区二区三区| 不卡影院一区二区| 欧美理论在线播放| 国产成人亚洲综合91精品| 国产一区二区三区福利| 91黄色激情网站| 一级片手机在线观看| 久久亚洲综合| 日韩欧美精品一区二区| 韩国成人在线| 久久久国产视频91| 99精品久久久久久中文字幕 | 亚洲欧洲第一视频| 中文字幕一区二区三区四区欧美| 国产午夜精品在线观看| 美女少妇一区二区| 亚洲精品成人无限看| 亚洲综合在线做性| 丁香花在线电影| 日韩精品视频三区| 乱子伦一区二区三区| 国产精品国产馆在线真实露脸| 成年网站免费在线观看| 女同性一区二区三区人了人一 | 亚洲国产精品suv| 亚洲午夜免费福利视频| 中文字幕一二三四区| 日本一区中文字幕| 久久天天东北熟女毛茸茸| 高清精品xnxxcom| 日本不卡高字幕在线2019| 在线观看免费黄色| 精品国产乱子伦一区| 国产99久久久| 国产精品久久久久久久久免费桃花 | 国产伦精品一区二区三区免费迷 | 91porn在线视频| 豆国产96在线|亚洲| 国产成人无码精品久久久性色| 久久91麻豆精品一区| 成人两性免费视频| 成年网站在线视频网站| 国产亚洲免费的视频看| 超碰免费在线97| 91久久国产综合久久| 极品颜值美女露脸啪啪| 久久亚洲综合av| 五月天国产视频| 免费精品视频| 四虎4hu永久免费入口| 九九热线有精品视频99| 亚洲在线一区二区| 美女福利一区二区| 欧美精品一二区| 国产视频三级在线观看播放| 日韩一级二级三级精品视频| 日韩欧美在线观看免费| 一区二区三区在线观看网站| 小早川怜子久久精品中文字幕| 国产激情91久久精品导航| 免费观看成人网| 伊人久久成人| 警花观音坐莲激情销魂小说| 九九久久成人| 精品久久久久久亚洲| 国产人与zoxxxx另类91| 国产精品看片资源| 高清视频在线观看三级| 久久99久久99精品中文字幕| 成人影院免费观看| 亚洲毛茸茸少妇高潮呻吟| 性色av蜜臀av| 欧美日韩国产另类一区| 91在线视频免费播放| 亚洲va国产天堂va久久en| 91麻豆免费视频网站| 国产欧美一区二区精品性| 成年女人免费视频| 国产91在线观看| 在线视频观看一区二区| 琪琪一区二区三区| 白嫩少妇丰满一区二区| 国产精品普通话对白| 亚洲精品久久久久久久蜜桃臀| 亚洲91久久| 自拍视频一区二区三区| 四季av一区二区三区免费观看| 欧美一进一出视频| 妖精一区二区三区精品视频 | 小日子的在线观看免费第8集| 日韩中文字幕一区二区三区| 欧美黄色免费影院| 午夜影院日韩| 日韩欧美xxxx| 日本成人在线电影网| 日韩精品无码一区二区三区免费| 亚洲啪啪91| 免费人成在线观看视频播放| 欧美午夜在线| 99在线精品免费视频| 欧美视频在线观看| 激情小视频网站| 99riav国产精品| 欧美深夜福利视频| 国产一区二区你懂的| 国产特级淫片高清视频| 免费一区视频| 青青草av网站| 蜜臀av一区二区三区| av在线网址导航| 激情综合色综合久久综合| 97人人模人人爽人人澡| 国产精品一卡二卡在线观看| 中国特级黄色片| 99视频一区二区| 久久无码人妻精品一区二区三区 | 中文字幕求饶的少妇| 亚洲日本va午夜在线影院| 欧美日韩精品在线观看视频| 亚洲成人tv网| 无码人妻aⅴ一区二区三区有奶水| 一本久道久久综合中文字幕| 做爰无遮挡三级| 欧美精品黑人性xxxx| 亚洲黄色在线播放| 亚洲欧美激情视频| 黄色网页在线观看| 午夜精品美女自拍福到在线| 亚洲国产成人二区| 91久久精品视频| 精品视频高潮| 污视频在线免费观看一区二区三区 | 日韩高清a**址| 999在线视频| 欧美高清在线播放| 欧美黑人粗大| 成人黄色短视频在线观看| 国产美女撒尿一区二区| 日韩欧美精品一区二区三区经典 | 国产a视频免费观看| 久久99国产精品久久99| 91精品又粗又猛又爽| 国产日产欧美一区二区三区| 中文字幕在线有码| 欧美性xxxx在线播放| 国产精品自拍电影| 日韩精品免费观看| 国产丝袜在线| 青青久久av北条麻妃黑人| 久久综合给合| 日韩免费中文专区| 尤物精品在线| 男女视频在线观看网站| 久久先锋资源网| 538任你躁在线精品视频网站| 欧美午夜激情视频| 午夜精品久久久久久久99老熟妇| 亚洲人成在线观看网站高清| 牛牛在线精品视频| 91精品国产综合久久男男| 羞羞色国产精品网站| 久久99国产精品一区| 日日夜夜精品视频免费| 波多野结衣影院| 亚洲在线免费播放| 国产精品人妻一区二区三区| 亚洲欧美综合精品久久成人| 51精品视频| 91久久伊人青青碰碰婷婷| 精品视频亚洲| 久草青青在线观看| 成人h版在线观看| 久久国产一级片| 日韩网站在线看片你懂的| av在线首页| 国产成人综合精品| 亚洲综合福利| 免费毛片小视频| 成人教育av在线| 亚洲成人生活片| 欧美电影影音先锋| 中文字幕在线播放| 国产精品旅馆在线| 欧美亚洲高清| 欧美日韩在线免费播放| 91免费国产在线| 中文字幕激情小说| 日韩成人久久久| av第一福利在线导航| 丁香婷婷久久久综合精品国产| 综合精品久久| 四虎1515hh.com| 亚洲一区影音先锋| 性猛交富婆╳xxx乱大交天津| 九色91av视频| julia中文字幕一区二区99在线| 久久视频免费在线| 国产成人免费视频一区| 国产精品第108页| 亚洲第一网中文字幕| av手机在线观看| 美女被啪啪一区二区| 一区二区三区福利| 久久久久久久久久久久| 日本韩国精品在线| 在线免费观看黄色网址| 成人做爰www免费看视频网站| 99久久国产综合精品成人影院| 中文字幕成人免费视频| 亚洲精选在线视频| 亚洲精品久久久久久动漫器材一区| 欧美精品www| 亚洲aa在线| www.99在线| 亚洲欧美日韩久久| 蜜臀久久精品久久久久| 欧美亚洲国产视频小说| 国产精品中文字幕亚洲欧美| 男人插女人下面免费视频| 国产精品久久三区| 午夜久久久久久噜噜噜噜| 91精品国产九九九久久久亚洲| 亚洲瘦老头同性70tv| 一道本视频在线观看| 亚洲乱码精品一二三四区日韩在线 | 手机电影在线观看| 久久久久久国产精品免费免费| 日日欢夜夜爽一区| 日韩一区二区三区四区在线| 日韩精品一区二区三区视频在线观看| 97人人在线视频| 日韩电影免费观看在| 国产一区二区成人久久免费影院| 久久久久久久久久99| 亚洲片国产一区一级在线观看| 天天综合在线观看| 免费毛片网站在线观看| 国产精品网站在线播放| 亚洲毛片在线播放| 国产精品激情av在线播放| 一级欧洲+日本+国产 | 一区二区三区中文字幕电影| 五月婷婷免费视频| 国产在线观看一区二区三区 | 黄色片在线免费观看| 91香蕉亚洲精品| 久久九九国产| 久久久久久天堂| 亚洲最新在线视频| 久久草在线视频| 肉色超薄丝袜脚交| 91成人免费在线视频| 超清av在线| 波多野结衣激情| 国产日韩精品一区二区三区 |