前言:談過如何用 Spring 發送普通 Email 和帶有附件的 Email 之后,接著來談一下如何用 Spring 來發送 Html 式的 Email。
發送 Html 格式的 Email 也是很必要的,現在的很多網站在用戶注冊之后都會發一封 Email 到用戶的郵箱,用戶需要點擊
郵件中的鏈接來完成注冊,這個鏈接如果是用普通文本式的 Email 來發送的話,這個鏈接是不能被點擊的,因為它是文本內容,
所以有必要要學一下 怎么樣發送 Html 式的 Email。但這個初次嘗試起來有點糾結,先來看問題,然后再貼代碼:
在測試的時候,遇到兩個問題,問題一:
中文亂碼 ,問題二:
資源無法顯示;下面是收到的郵件截圖:

問題一可以在 Spring 的 API 中找到答案,就是要花點時間來調試

;
說到問題二,這個有點讓人頭疼,因為官方文檔是這么說的(Spring 2.5.6):

我測試的時候也是按著官方文檔的示例來實驗的,但事實證明,這是不行的,收到的郵件,這個圖片資源總是顯示不出來,
右鍵查看一下沒有顯示出來的資源屬性:

這個問題在官方文檔上沒有做出相關的解釋,于是自己試著去實驗,原來是 jar 包版本的問題,當然,這不可能是一下子就
能想得到是 jar 包出的問題,也沒有一個人會輕易的去懷疑官方的東西吧,不過這個算是 Spring 2.5.6 的 Bug 吧。
我把 Spring 2.5.6 的 spring-context-support 的 jar 包換成 Spring 3.1.0 的 spring-context-support jar 包之后來實驗,OK,問題解決。
順便說一下 Spring 的 spring-context-support 這個 jar 包,就像你看到的,support,就是 Spring 支持的一些擴展服務(如果沒有解釋錯誤的話-_-|)
這個 jar 包封裝了一些 Email 和 Scheduling(Spring 定時服務,計劃任務),還有 Freemarker、Velocity,下次會說一下 Spring 定時服務。
好了,就到這吧,接下來貼代碼:
環境:
Spring 2.5.6
Spring-context-support 3.1.0
Javamail 1.4.4
Maven 3.0.4
Myeclipse 8.6.1項目結構:

spring-smtp-mail-inline.xml
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean id="javaMailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<!-- 服務器 -->
<property name="host" value="smtp.yeah.net" />
<!-- 端口號 -->
<property name="port" value="25" />
<!-- 用戶名 -->
<property name="username" value=fancydeepin@yeah.net />
<!-- 密碼 -->
<property name="password" value="***********"/>
<!-- SMTP服務器驗證 -->
<property name="javaMailProperties">
<props>
<!-- 驗證身份 -->
<prop key="mail.smtp.auth">true</prop>
</props>
</property>
</bean>
<!--
目前我用過的EMAIL賬號都是網易的,下面列出網易的SMTP服務器名和端口號:
網易郵箱 SMTP服務器 SMTP端口 POP3服務器 POP3端口
@126.com smtp.126.com 25 pop3.126.com 110
@163.com smtp.163.com 25 pop3.163.com 110
@yeah.net smtp.yeah.net 25 pop3.yeah.net 110
-->
<bean id="simpleMailMessage" class="org.springframework.mail.SimpleMailMessage">
<!-- 發件人email -->
<property name="from" value="fancydeepin@yeah.net" />
<!--
收件人email
<property name="to" value="to@yeah.net" />
email主題(標題)
<property name="subject" value="Subject" />
email主題內容
<property name="text">
<value>ContentText</value>
</property>
-->
</bean>
<bean id="simpleMail" class="com.fancy.util.Email">
<property name="javaMailSender" ref="javaMailSender" />
<property name="simpleMailMessage" ref="simpleMailMessage" />
</bean>
</beans>Email.java
package com.fancy.util;

import javax.mail.internet.MimeMessage;
import org.springframework.core.io.ClassPathResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
/**
* -----------------------------------------
* @文件: Email.java
* @作者: fancy
* @郵箱: fancydeepin@yeah.net
* @時間: 2012-6-12
* @描述: 發送Email工具類
* -----------------------------------------
*/

public class Email {
private JavaMailSender javaMailSender;
private SimpleMailMessage simpleMailMessage;

/**
* @方法名: sendMail
* @參數名:@param subject 郵件主題
* @參數名:@param content 郵件主題內容
* @參數名:@param to 收件人Email地址
* @描述語: 發送郵件
*/

public void sendMail(String subject, String content, String to) {

try {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();

/**
* new MimeMessageHelper(mimeMessage,true)之true個人見解:
* 關于true參數,官方文檔是這樣解釋的:
* use the true flag to indicate you need a multipart message
* 翻譯過來就是:使用true,以表明你需要多個消息
* 再去翻一下MimeMessageHelper的API,找到這樣一句話:
* supporting alternative texts, inline elements and attachments
* 也就是說,如果要支持內聯元素(HTML)和附件就必須給定第二個參數為true
* 否則拋出 java.lang.IllegalStateException 異常
*/

/**
* 剛開始收到郵件顯示中文亂碼,于是趕緊查看官方文檔,沒有提到,再查閱API,也沒有查到Set編碼的方法,
* 于是就在HTML里面自己指定編碼,也不起作用,郵件還是顯示中文亂碼;
* 最后的結論是:如果HTML內容含有中文必須指定HTML的編碼,默認是ISO-8859-1,所以會顯示中文亂碼
* 在MimeMessageHelper的構造方法中找到:
* MimeMessageHelper(MimeMessage mimeMessage, boolean multipart, String encoding)
* 實驗一下,OK,原來編碼是在這兒設置,沒事了,中文正常顯示
*/
MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage,true,"UTF-8");
messageHelper.setFrom(simpleMailMessage.getFrom()); //設置發件人Email
messageHelper.setSubject(subject); //設置郵件主題
messageHelper.setText(content); //設置郵件主題內容
messageHelper.setTo(to); //設定收件人Email
//步驟 1
//資源的引用方法:cid:你自己設置的資源ID
messageHelper.setText(
"<html>" +
"<body>" +
"<BR>" +
"<div align='center'>" +
"<img src='cid:imageid'/>" +
"<BR>" +
"<h4>" +
"返回 fancydeepin 的Blogjava:" +
"<a href='http://www.tkk7.com/fancydeepin/'>http://www.tkk7.com/fancydeepin/</a>" +
"</h4>" +
"</div>" +
"</body>" +
"</html>", true);

/**
* ClassPathResource:很明顯就是類路徑資源,我這里的附件是在項目里的,所以需要用ClassPathResource
* 如果是系統文件資源就不能用ClassPathResource,而要用FileSystemResource,例:
* FileSystemResource file = new FileSystemResource(new File("D:/woniu.png"));
*/

/**
* 如果想在HTML中使用資源,必須在HTML中通過資源 ID 先引用資源,然后才來加載資源
*/
//步驟 2
ClassPathResource image = new ClassPathResource("images/body.png");
messageHelper.addInline("imageid", image);
javaMailSender.send(mimeMessage); //發送HTML郵件

} catch (Exception e) {System.out.println("異常信息:" + e);}
}
//Spring 依賴注入

public void setSimpleMailMessage(SimpleMailMessage simpleMailMessage) {
this.simpleMailMessage = simpleMailMessage;
}
//Spring 依賴注入

public void setJavaMailSender(JavaMailSender javaMailSender) {
this.javaMailSender = javaMailSender;
}
}

接下來的是測試類,這里的測試類我又用了兩個,一個是 Main 方法測試,另外一個 Junit 測試,個人不太喜歡 Junit 的測試,下面貼 Main 方法的測試
Test.java
package test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.fancy.util.Email;
/**
* -----------------------------------------
* @文件: Test.java
* @作者: fancy
* @郵箱: fancydeepin@yeah.net
* @時間: 2012-6-12
* @描述: 測試HTML郵箱發送類
* -----------------------------------------
*/

public class Test {


public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("spring-smtp-mail-inline.xml");
Email mail = (Email)context.getBean("simpleMail");
mail.sendMail("Spring SMTP Mail HTML Subject", "Spring SMTP HTML Text Content", "fancyzero@yeah.net");
//mail.sendMail("標題", "內容", "收件人郵箱");
}
}

pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.fancy</groupId>
<artifactId>spring-mail-inline-example</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<name>spring-mail-inline-example</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>
<!-- Spring framework -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
<version>2.5.6</version>
</dependency>
<!-- Spring Support -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>3.1.0.RELEASE</version>
</dependency>
<!-- Javamail API -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.4</version>
</dependency>
<!-- Junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

Run Test.java,收到并打開郵件:

OK,沒問題了這回。最后提一下在 Email.java 中為什么步驟1和步驟2不能倒過來的原因,其實你看到這里也可以自己試一下,你會
發現倒過來真的不行的,原因嘛,這個官方文檔有提到一點,這個我就不貼了,我貼一下 API 中對這個的解釋,在 API 中還給出了
如何通過資源 ID 來引用資源的,英文的,自己看哦:

posted on 2012-06-12 13:05
fancydeepin 閱讀(4235)
評論(0) 編輯 收藏