在这个例子中,将与发送方相关的配置信息放在了一个email.properties文件中,spring容器启动的时候会从这个属性文件中读取发送方的配置信息,这样配置的主要原因在于,发送方一般都是固定不变的。
我将发送的内容放在一个velocity模板文件中,这个文件很像jsp文件,您可以从http://airport.iteye.com/blog/23634中获取更多的关于velocity使用方法相关的信息。(实际上velocity是Apache提供的一种模板语言)。我希望邮件接收方能够接收一个动态的网页,而不是一个简单的文本。
另外,程序提供了发送附件的部分,和群发的功能,只不过群发功能并不完善,因为群发过程中无法将模板变量替换成用户相关变量值,这是个缺陷,楼主也没想明白如何实现。
下面将代码贴出,希望对大家有帮助:
先是email.properties文件:
- email.host=smtp.163.com
- email.username=woshiguanxinquan
- email.password=*********
-
mail.smtp.auth=true
- email.host=smtp.163.com
- email.username=woshiguanxinquan
- email.password=*********
- mail.smtp.auth=true
模板文件:
- Wecome.vm
-
- <html>
- <body>
- <h3>您好 $!{userName}, 欢迎您加入编程爱好者俱乐部!</h3>
-
- <div>
-
您的email地址是<a href="mailto:${emailAddress}">$!{emailAddress}</a>.
- 本条信息是系统自动发送,请勿回复!
- </div>
- </body>
-
- </html>
- Wecome.vm
-
- <html>
- <body>
- <h3>您好 $!{userName}, 欢迎您加入编程爱好者俱乐部!</h3>
-
- <div>
- 您的email地址是<a href="mailto:${emailAddress}">$!{emailAddress}</a>.
- 本条信息是系统自动发送,请勿回复!
- </div>
- </body>
-
- </html>
简单解释一下,很明显这是个html文件,注意$!{userName}实际上是一个变量,在程序运行的时候,由model(一个hashmap类型的变量)传入的值会将其替换,(model的key就是变量的名字,这里是userName,而value就是要替换的值),!表示如果没有替换的值,此处为空。更多详细信息请参考:http://airport.iteye.com/blog/23634
下面是spring的配置文件:
ThirdVelocityEmailConfig.xml
- <?xml version="1.0" encoding="UTF-8"?>
-
<beans xmlns="http://www.springframework.org/schema/beans"
-
xmlns:security="http://www.springframework.org/schema/security"
-
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-
xmlns:flex="http://www.springframework.org/schema/flex"
-
xmlns:context="http://www.springframework.org/schema/context"
- xsi:schemaLocation="
-
http:
-
http:
-
http:
-
http:
-
http:
-
-
<context:property-placeholder location="classpath:/com/guan/chapter19/email/email.properties"/>
- <context:annotation-config/>
-
<context:component-scan base-package="com.guan.chapter19.email"/>
-
-
-
<bean id="velocityEngine" class="org.springframework.ui.velocity.VelocityEngineFactoryBean">
-
<property name="velocityProperties">
- <value>
-
resource.loader=class
-
class.resource.loader.class=org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
- </value>
- </property>
- </bean>
-
- </beans>
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:security="http://www.springframework.org/schema/security"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:flex="http://www.springframework.org/schema/flex"
- xmlns:context="http://www.springframework.org/schema/context"
- xsi:schemaLocation="
- http:
- http:
- http:
- http:
- http:
-
- <context:property-placeholder location="classpath:/com/guan/chapter19/email/email.properties"/>
- <context:annotation-config/>
- <context:component-scan base-package="com.guan.chapter19.email"/>
-
-
- <bean id="velocityEngine" class="org.springframework.ui.velocity.VelocityEngineFactoryBean">
- <property name="velocityProperties">
- <value>
- resource.loader=class
- class.resource.loader.class=org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
- </value>
- </property>
- </bean>
-
- </beans>
这个大家都熟悉,不多解释,开始的时候加载了email.properties文件,我们上面给出了,然后创建了velocityEngine的bean。
下面是spring的配置类:
- package com.guan.chapter19.email;
-
-
import java.util.Properties;
-
-
import org.springframework.beans.factory.annotation.Value;
-
import org.springframework.context.annotation.Bean;
-
import org.springframework.context.annotation.Configuration;
-
import org.springframework.mail.javamail.JavaMailSender;
-
import org.springframework.mail.javamail.JavaMailSenderImpl;
-
-
@Configuration
-
public class ThirdVelocityEmailAppConfig {
-
-
-
private @Value("${email.host}") String emailHost;
-
private @Value("${email.username}") String userName;
-
private @Value("${email.password}") String password;
-
private @Value("${mail.smtp.auth}") String mailAuth;
-
-
public @Bean JavaMailSender mailSender(){
-
JavaMailSenderImpl ms = new JavaMailSenderImpl();
- ms.setHost(emailHost);
- ms.setUsername(userName);
- ms.setPassword(password);
-
Properties pp = new Properties();
-
pp.setProperty("mail.smtp.auth", mailAuth);
- ms.setJavaMailProperties(pp);
-
return ms;
- }
- }
- package com.guan.chapter19.email;
-
- import java.util.Properties;
-
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.mail.javamail.JavaMailSender;
- import org.springframework.mail.javamail.JavaMailSenderImpl;
-
- @Configuration
- public class ThirdVelocityEmailAppConfig {
-
-
- private @Value("${email.host}") String emailHost;
- private @Value("${email.username}") String userName;
- private @Value("${email.password}") String password;
- private @Value("${mail.smtp.auth}") String mailAuth;
-
- public @Bean JavaMailSender mailSender(){
- JavaMailSenderImpl ms = new JavaMailSenderImpl();
- ms.setHost(emailHost);
- ms.setUsername(userName);
- ms.setPassword(password);
- Properties pp = new Properties();
- pp.setProperty("mail.smtp.auth", mailAuth);
- ms.setJavaMailProperties(pp);
- return ms;
- }
- }
对于spring是否应该由类来配置,我并不关心,一般情况下,我更倾向于annotation这种形式,因为看起来比xml舒服点,但是annotation不能完全取代xml配置方式(至少现在是这样的),当然您完全可以使用xml进行bean的配置,效果是一样的。在这个配置类中,将从email.properties中读取的值赋值给了JavaMailSenderImpl,这个对象是java邮件发送的主要类,使用其send方法可以将预先准备好的消息发送出去。
下面给出发送服务的源码
- package com.guan.chapter19.email;
-
-
import java.io.File;
-
import java.util.Map;
-
-
import javax.mail.internet.MimeMessage;
-
-
import org.apache.velocity.app.VelocityEngine;
-
import org.springframework.beans.factory.annotation.Autowired;
-
import org.springframework.core.io.FileSystemResource;
-
import org.springframework.mail.javamail.JavaMailSender;
-
import org.springframework.mail.javamail.MimeMessageHelper;
-
import org.springframework.mail.javamail.MimeMessagePreparator;
-
import org.springframework.stereotype.Component;
-
import org.springframework.ui.velocity.VelocityEngineUtils;
-
-
@Component
-
public class ThirdVelocityEmailService {
-
-
private JavaMailSender mailSender;
-
private VelocityEngine velocityEngine;
-
-
@Autowired
-
public void setMailSender(JavaMailSender mailSender)
- {
-
this.mailSender = mailSender;
- }
-
-
@Autowired
-
-
public void setVelocityEngine(VelocityEngine velocityEngine)
- {
-
this.velocityEngine = velocityEngine;
- }
-
-
public void sendEmail(final Map<String,Object> model,final String subject,final String vmfile,final String[] mailTo,final String [] files)
- {
-
MimeMessagePreparator preparator = new MimeMessagePreparator() {
-
-
public void prepare(MimeMessage mimeMessage) throws Exception
- {
-
MimeMessageHelper message = new MimeMessageHelper(mimeMessage,true,"GBK");
-
-
-
message.setTo(mailTo);
-
message.setSubject(subject);
-
message.setFrom("woshiguanxinquan@163.com");
- String text = VelocityEngineUtils.mergeTemplateIntoString(
-
velocityEngine, vmfile,"GBK", model);
-
-
-
message.setText(text, true);
-
-
- FileSystemResource file;
-
for(String s:files)
- {
-
file = new FileSystemResource(new File(s));
-
message.addAttachment(s, file);
- }
- }
- };
-
-
mailSender.send(preparator);
- }
-
- }
- package com.guan.chapter19.email;
-
- import java.io.File;
- import java.util.Map;
-
- import javax.mail.internet.MimeMessage;
-
- import org.apache.velocity.app.VelocityEngine;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.core.io.FileSystemResource;
- import org.springframework.mail.javamail.JavaMailSender;
- import org.springframework.mail.javamail.MimeMessageHelper;
- import org.springframework.mail.javamail.MimeMessagePreparator;
- import org.springframework.stereotype.Component;
- import org.springframework.ui.velocity.VelocityEngineUtils;
-
- @Component
- public class ThirdVelocityEmailService {
-
- private JavaMailSender mailSender;
- private VelocityEngine velocityEngine;
-
- @Autowired
- public void setMailSender(JavaMailSender mailSender)
- {
- this.mailSender = mailSender;
- }
-
- @Autowired
-
- public void setVelocityEngine(VelocityEngine velocityEngine)
- {
- this.velocityEngine = velocityEngine;
- }
-
- public void sendEmail(final Map<String,Object> model,final String subject,final String vmfile,final String[] mailTo,final String [] files)
- {
- MimeMessagePreparator preparator = new MimeMessagePreparator() {
-
- public void prepare(MimeMessage mimeMessage) throws Exception
- {
- MimeMessageHelper message = new MimeMessageHelper(mimeMessage,true,"GBK");
-
-
- message.setTo(mailTo);
- message.setSubject(subject);
- message.setFrom("woshiguanxinquan@163.com");
- String text = VelocityEngineUtils.mergeTemplateIntoString(
- velocityEngine, vmfile,"GBK", model);
-
-
- message.setText(text, true);
-
-
- FileSystemResource file;
- for(String s:files)
- {
- file = new FileSystemResource(new File(s));
- message.addAttachment(s, file);
- }
- }
- };
-
- mailSender.send(preparator);
- }
-
- }
主要是mailSend这个方法,在这个方法里先创建了一个消息,然后调用mailSender将消息发送出去。
最后给出测试程序:
- package com.guan.chapter19.email;
-
-
import java.util.HashMap;
-
import java.util.Map;
-
-
import org.junit.Test;
-
import org.springframework.context.ApplicationContext;
-
import org.springframework.context.support.ClassPathXmlApplicationContext;
-
-
public class ThirdVelocityEmailTest {
-
-
@Test
-
public void sendEmail()
- {
- ApplicationContext context =
-
new ClassPathXmlApplicationContext("com/guan/chapter19/email/ThirdVelocityEmailConfig.xml");
-
ThirdVelocityEmailService tves = context.getBean(ThirdVelocityEmailService.class);
-
Map<String,Object> model = new HashMap<String,Object>();
-
model.put("userName","大关");
-
model.put("emailAddress", "woshidaguan@126.com");
-
tves.sendEmail(model,"欢迎您的加入","com/guan/chapter19/email/welcome.vm",new String[]{"woshiguanxinquan@163.com"},new String[]{"F:/Sunset.jpg","F:/spring-hibernate.rar"});
-
-
- }
- }
- package com.guan.chapter19.email;
-
- import java.util.HashMap;
- import java.util.Map;
-
- import org.junit.Test;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
-
- public class ThirdVelocityEmailTest {
-
- @Test
- public void sendEmail()
- {
- ApplicationContext context =
- new ClassPathXmlApplicationContext("com/guan/chapter19/email/ThirdVelocityEmailConfig.xml");
- ThirdVelocityEmailService tves = context.getBean(ThirdVelocityEmailService.class);
- Map<String,Object> model = new HashMap<String,Object>();
- model.put("userName","大关");
- model.put("emailAddress", "woshidaguan@126.com");
- tves.sendEmail(model,"欢迎您的加入","com/guan/chapter19/email/welcome.vm",new String[]{"woshiguanxinquan@163.com"},new String[]{"F:/Sunset.jpg","F:/spring-hibernate.rar"});
-
-
- }
- }
这个程序对一个email来说功能已经很全面了,您可以对其更改然后应用于您的程序中。
再次简单说明一下,主机的信息配置在mail.properties文件中,发送的内容写在velocity模板文件中,在执行的时候将相应的字段进行替换。使用了MimeMessagePreparator进行复杂邮件的发送,MimeMessageHelper帮助简化邮件信息过程。解决了中文乱码问题。
分享到:
相关推荐
Velocity模板引擎Velocity模板引擎Velocity模板引擎Velocity模板引擎Velocity模板引擎Velocity模板引擎Velocity模板引擎Velocity模板引擎Velocity模板引擎Velocity模板引擎
Velocity模板邮件发送例子(Spring框架)(可通用,支持多扩展)Velocity模板邮件发送例子(Spring框架)(可通用,支持多扩展)
spring+velocity发送邮件,spring+velocity发送邮件
Velocity模板实例 Velocity模板实例 Velocity模板实例 Velocity模板实例
Velocity模板入门简单DEMO, 代码有注解;
Velocity模板技术语法详细介绍,包括很详细的示例代码 1.变量………………………………………………………………………………1 2.循环………………………………………………………………………………2 3.条件语句...
Spring Boot项目 自动生成数据表模板,包括:Mapper、Mapper.xml、Service、Controller、html 自定义模板生成
SpringBoot集成Mybatis,velocity模板
分享一个spring+mybatis+velocity项目demo,该项目是之前给一个学第学习用的,主要基于springMVC、mybatis、velocity搭建的,使用maven构建,其中zai service层编写了两个简单组件,一个是email发送,一个是认证授权...
Velocity.js 是velocity模板语法的javascript实现。Velocity 是基于Java的模板引擎,广泛应用在阿里集 体各个子公司。Velocity模板适用于大量模板使用的场景,支持复杂的逻辑运算,包含 基本数据类型、变量赋值和...
spring mvc与velocity整合
史上最全Velocity模板使用指南中文版,适合初学者读阅
Velocity模板解析,通过Velocity模板自动替换表达式中的变量
spring mvc mybatis velocity 示范
spring+velocity+ibatis
Spring+SpringMVC+Mybatis+Velocity+Maven整合
测试报告模板+guice-3.0.jar+reportng-1.1.6.jar+velocity-dep-1.4.jar
Velocity实现模板