在開發用戶註冊功能時,郵件驗證是不可或缺的環節。雖然這項任務原本由其他同事負責,但我對 Spring 整合郵件發送的機制充滿好奇,便自行搭建了一個輕量級項目進行實踐。本文將詳細記錄從配置到模板渲染的完整流程,供有類似需求的開發者參考。
項目基於 Spring Framework 構建,核心依賴包括 spring-context、spring-context-support(提供 JavaMail 整合)、javax.mail 以及 freemarker 模板引擎。確保專案類路徑下已包含這些 JAR 包。
在 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("郵件發送成功!");
}
}
在 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/文本郵件,即表示整合成功。
mail.smtp.timeout。cfg.setDefaultEncoding("UTF-8") 避免中文亂碼。通過以上步驟,即可在 Spring 應用中穩健實現基於模板的郵件發送功能。完整代碼結構清晰,易於擴展支援附件、內嵌圖片、多模板等高級場景。