首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Spring 框架實現郵件發送完整指南:整合 JavaMail 與 FreeMarker 模板

     編輯:Java 相關知識

在開發用戶註冊功能時,郵件驗證是不可或缺的環節。雖然這項任務原本由其他同事負責,但我對 Spring 整合郵件發送的機制充滿好奇,便自行搭建了一個輕量級項目進行實踐。本文將詳細記錄從配置到模板渲染的完整流程,供有類似需求的開發者參考。

核心依賴與環境準備

項目基於 Spring Framework 構建,核心依賴包括 spring-context、spring-context-support(提供 JavaMail 整合)、javax.mail 以及 freemarker 模板引擎。確保專案類路徑下已包含這些 JAR 包。

Spring 容器配置:JavaMailSender Bean 定義

在 applicationContext.xml 中定義 JavaMailSenderImpl Bean,配置 SMTP 伺服器參數、認證資訊及連線超時設定。以下以新浪郵箱為例:

<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
    <property name="host" value="smtp.sina.com" />
    <property name="javaMailProperties">
        <props>
            <prop key="mail.smtp.auth">true</prop>
            <prop key="mail.smtp.timeout">25000</prop>
        </props>
    </property>
    <property name="username" value="your_email@sina.com" />
    <property name="password" value="your_email_password" />
</bean>

關鍵說明:

  • host:SMTP 伺服器地址,不同郵箱服務商地址不同(如 Gmail 為 smtp.gmail.com)。
  • mail.smtp.auth:必須設為 true 以啟用身份驗證。
  • username/password:發件郵箱賬號與授權碼(部分服務商需使用專用授權碼而非登錄密碼)。

郵件發送服務類實現

編寫 SpringMail 類封裝發送邏輯,利用 SimpleMailMessage 構建郵件主體,並整合 FreeMarker 實現動態模板渲染:

public class SpringMail {
    private Configuration cfg = new Configuration(Configuration.VERSION_2_3_31);

    public void sendMail(JavaMailSender sender) throws Exception {
        // 1. 準備郵件基礎資訊
        SimpleMailMessage mail = new SimpleMailMessage();
        mail.setTo("recipient@example.com");
        mail.setFrom("your_email@sina.com");
        mail.setSubject("歡迎註冊 - 系統通知");

        // 2. 配置 FreeMarker 模板加載路徑(classpath:/mail 目錄下)
        cfg.setClassForTemplateLoading(getClass(), "/mail");

        // 3. 準備模板數據模型
        Map model = new HashMap<>();
        model.put("username", "新用戶");
        model.put("activationLink", "https://example.com/activate?token=abc123");

        // 4. 渲染模板生成郵件內容
        Template template = cfg.getTemplate("notify-mail.ftl");
        StringWriter writer = new StringWriter();
        template.process(model, writer);
        mail.setText(writer.toString());

        // 5. 發送郵件
        sender.send(mail);
        System.out.println("郵件發送成功!");
    }
}

FreeMarker 郵件模板設計

在 src/main/resources/mail/notify-mail.ftl 建立模板文件,支援變量插值、條件判斷等指令:

歡迎加入我們的平台!

親愛的 ${username}

請點擊下方鏈接完成郵箱驗證:
${activationLink}

若您的郵件客戶端不支援鏈接點擊,請將上述地址複製至瀏覽器地址欄訪問。

驗證成功後,您將享受:
- 最新影視資訊瀏覽
- 相關消費產品查詢
- 社區交流互動

祝您使用愉快!

---
(此為系統自動發送郵件,請勿直接回覆)

項目目錄結構參考

項目目錄結構

關鍵點:模板文件放置於 resources/mail 目錄,Java 類通過 setClassForTemplateLoading 正確定位。

測試驗證

編寫主方法啟動 Spring 容器,獲取 mailSender Bean 並調用發送方法:

public static void main(String[] args) throws Exception {
    ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
    JavaMailSender sender = ctx.getBean("mailSender", JavaMailSender.class);
    new SpringMail().sendMail(sender);
}

控制台輸出 郵件發送成功! 且收件箱收到格式完整的 HTML/文本郵件,即表示整合成功。

常見問題與最佳實踐

  • 連線超時:若發送失敗,檢查防火牆/網絡策略是否放行 SMTP 端口(25/465/587),適當調大 mail.smtp.timeout。
  • 認證失敗:確認郵箱開啟了 SMTP 服務並使用正確授權碼;Gmail 需開啟「低安全性應用存取」或使用應用專用密碼。
  • 模板編碼:確保 FreeMarker 配置 cfg.setDefaultEncoding("UTF-8") 避免中文亂碼。
  • 生產環境優化:建議使用連接池、異步發送(@Async)、重試機制及發送日誌記錄。

通過以上步驟,即可在 Spring 應用中穩健實現基於模板的郵件發送功能。完整代碼結構清晰,易於擴展支援附件、內嵌圖片、多模板等高級場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved