項目中經常會遇到發送郵件的問題,有時還需要發送html格式的郵件,如果直接在java檔案寫死寫html,那麼維護起來将會非常麻煩,利用Velocity模闆引擎可以解決這個問題,使得業務處理和視圖渲染相分離,友善維護。
項目依賴:
<properties>
<springframework>4.2.6.RELEASE</springframework>
</properties>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${springframework}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${springframework}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${springframework}</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${springframework}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${springframework}</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.5.5</version>
</dependency>
接下寫一個服務類,提供發送郵件的功能:
public class SendEmailService {
private JavaMailSender sender;
private VelocityEngine velocityEngine;
public void sendEmail() {
MimeMessagePreparator preparator = new MimeMessagePreparator() {
@Override
public void prepare(MimeMessage mimeMessage) throws Exception {
//設定内容顯示的編碼格式
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, "UTF-8");
helper.setTo("[email protected]");
helper.setFrom("輸入你的發送郵箱位址");
Map modal = new HashMap<>();
modal.put("userName", "wzx");
modal.put("emailAddress", "[email protected]");
String content = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, "email_tempalte.vm", "UTF-8", modal);
helper.setSubject("郵件主題");
helper.setText(content, true);
}
};
this.sender.send(preparator);
}
public void setSender(JavaMailSender sender) {
this.sender = sender;
}
public void setVelocityEngine(VelocityEngine velocityEngine) {
this.velocityEngine = velocityEngine;
}
}
添加一個簡單的模闆檔案:
<html>
<body>
<h3>Hi ${userName}, welcome to the Chipping Sodbury On-the-Hill message boards!</h3>
<div>
Your email address is ${emailAddress}.
</div>
</body>
</html>
在配置檔案中配置bean:
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="smtp.mxhichina.com"/>
<property name="username" value="輸入發送郵箱位址"/>
<property name="password" value="輸入發送郵箱密碼"/>
</bean>
<bean id="sendEmailService" class="cn.ssm.service.SendEmailService">
<property name="sender" ref="mailSender"/>
<property name="velocityEngine" ref="velocityEngine"/>
</bean>
<bean id="velocityEngine" class="org.springframework.ui.velocity.VelocityEngineFactoryBean">
<property name="velocityProperties">
<props>
<prop key="resource.loader">class</prop>
<prop key="class.resource.loader.class">
org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
</prop>
<!-- 配置引擎讀取資料的編碼格式 -->
<prop key="input.encoding">UTF-8</prop>
<!-- 配置引擎輸出資料的編碼格式 -->
<prop key="output.encoding">UTF-8</prop>
<prop key="default.contentType">application/x-www-form-urlencoded; charset=UTF-8</prop>
</props>
</property>
</bean>
注意:需要将代碼替換成自己的郵箱帳号和密碼,否則發送失敗
最後,寫個測試用例:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext.xml")
public class SendEmailTest {
@Autowired
private SendEmailService emailService;
@Test
public void test() {
emailService.sendEmail();
}
}
運作後,效果如下:

可以正确顯示html格式并顯示中文。