项目中经常会遇到发送邮件的问题,有时还需要发送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("wang704987562@vip.qq.com");
helper.setFrom("输入你的发送邮箱地址");
Map modal = new HashMap<>();
modal.put("userName", "wzx");
modal.put("emailAddress", "wang704987562@vip.qq.com");
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格式并显示中文。