在这个例子中,将与发送方相关的配置信息放在了一个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
模板文件:
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://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd
http://www.springframework.org/schema/flex
http://www.springframework.org/schema/flex/spring-flex-1.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<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;
//JavaMailSender用来发送邮件的类
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() {
//注意MimeMessagePreparator接口只有这一个回调函数
public void prepare(MimeMessage mimeMessage) throws Exception
{
MimeMessageHelper message = new MimeMessageHelper(mimeMessage,true,"GBK");
//这是一个生成Mime邮件简单工具,如果不使用GBK这个,中文会出现乱码
//如果您使用的都是英文,那么可以使用MimeMessageHelper message = new MimeMessageHelper(mimeMessage);
message.setTo(mailTo);//设置接收方的email地址
message.setSubject(subject);//设置邮件主题
message.setFrom("woshiguanxinquan@163.com");//设置发送方地址
String text = VelocityEngineUtils.mergeTemplateIntoString(
velocityEngine, vmfile,"GBK", model);
//从模板中加载要发送的内容,vmfile就是模板文件的名字
//注意模板中有中文要加GBK,model中存放的是要替换模板中字段的值
message.setText(text, true);
//将发送的内容赋值给MimeMessageHelper,后面的true表示内容解析成html
//如果您不想解析文本内容,可以使用false或者不添加这项
FileSystemResource file;
for(String s:files)//添加附件
{
file = new FileSystemResource(new File(s));//读取附件
message.addAttachment(s, file);//向email中添加附件
}
}
};
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"});
//参数说明:替换velocity模板的变量和值对,邮件主题,velocity模板文件的路径,接收方email地址,附件
//简单说明,如果您要群发,可以在接收方email地址中多传入几个email地址,附件可以一次发送多个
}
}
这个程序对一个email来说功能已经很全面了,您可以对其更改然后应用于您的程序中。
再次简单说明一下,主机的信息配置在mail.properties文件中,发送的内容写在velocity模板文件中,在执行的时候将相应的字段进行替换。使用了MimeMessagePreparator进行复杂邮件的发送,MimeMessageHelper帮助简化邮件信息过程。解决了中文乱码问题。
http://blog.sina.com.cn/s/blog_616e189f0100m7qq.html
分享到:
相关推荐
Spring 3.0 是一个里程碑式的版本,在Java企业级应用开发领域中占据着核心地位。这个版本的发布引入了许多新特性、改进和优化,旨在提升开发者的工作效率和应用程序的可维护性。Spring 框架以其强大的依赖注入...
此外,Spring 3.0的MVC框架支持模板引擎,如FreeMarker和Velocity,简化了视图层的开发。 在数据访问和事务管理领域,Spring 3.0加强了JPA和Hibernate的支持,提供了更好的ORM集成。同时,它改进了对JDBC的支持,...
Spring 3.0是Spring框架的一个重要版本,它引入了许多新特性和改进,极大地扩展了其功能和灵活性。本文将详细解析Spring 3.0 API的主要特性,帮助开发者更好地理解和利用这一强大的Java企业级开发工具。 一、核心...
Spring MVC 是一个基于Java的轻量级Web应用框架,它是Spring框架的重要组成部分,主要用于构建Web应用程序的后端控制器。在Spring 3.0版本中,它引入了许多改进和新特性,提高了开发效率和灵活性。本篇文章将深入...
7. **Spring MVC**:Spring的Web MVC模块在3.0版本中也有所提升,支持更多视图技术(如Freemarker、Velocity),并改进了模型绑定和异常处理。 8. **测试支持**:Spring 3.0提供了丰富的测试工具,如`@...
《Spring 3.0、Spring MVC 3.0与MyBatis 3.0整合详解》 在现代Java企业级应用开发中,Spring框架因其强大的功能和灵活性而被广泛使用。Spring 3.0作为其重要的一个版本,引入了诸多改进和新特性,提升了开发效率和...
标题 "spring velocity 发邮件(单发,群发,图片,附件)" 涉及到的是在Java开发中使用Spring框架集成Velocity模板引擎来发送电子邮件的功能。这个话题涵盖了多个知识点,包括Spring的邮件服务、Velocity模板引擎的应用...
总的来说,Spring 3.0 开发包是一套完整的Java开发解决方案,涵盖了从数据访问到Web应用的各个层面,它的易用性和灵活性使其成为了Java开发者首选的框架之一。通过深入学习和实践Spring 3.0,开发者能够构建出高效、...
6. **模板引擎集成**:Spring 3.0加强了对各种模板引擎(如FreeMarker、Velocity等)的集成,使得视图层的处理更加便捷。 7. **JDBC与ORM改进**:Spring 3.0在数据库操作上提供了更强大的抽象层,包括对JDBC的简化...
【Spring3.0 MVC框架简介】 Spring3.0 MVC是Spring框架的重要组成部分,专注于构建高性能、健壮的Web应用程序。这个框架具有高度可配置性,允许开发者将各个逻辑和功能模块进行分离,增强了代码的可维护性和可扩展性...
5. **MVC框架的改进**:Spring MVC在3.0版本中进行了大量优化,包括模板引擎的集成(例如FreeMarker、Velocity、Thymeleaf等)、RESTful支持、ModelAndView的改进以及异常处理的增强。 6. **Spring Expression ...
5. **MVC框架增强**:Spring 3.0的Web MVC框架有了重大提升,包括模型-视图-控制器的改进、视图技术的支持(如FreeMarker、Velocity、JSP等)、RESTful风格的处理、ModelAndView对象的优化等,为构建高性能的Web应用...
总之,这个实例结合了Struts2、Spring和Mybatis的强大功能,提供了一个完整的邮件发送系统,包括邮件的创建、附件上传和数据库操作。对这个实例的学习和实践,可以帮助开发者深入理解Java企业级应用的开发流程和技巧...
这个API文档详细地介绍了Spring 3.0版本中的各种组件、接口、类以及它们的方法、属性和注解,帮助开发者理解和使用Spring框架的功能。 Spring框架是一个全面的企业级应用开发框架,它为Java开发者提供了一个轻量级...
- **MVC增强**:Spring MVC在3.0版本中得到显著提升,增加了RESTful支持、模型验证、模板引擎集成(如FreeMarker、Velocity、Thymeleaf)等特性,提高了Web应用的开发效率。 2. **ASM-3.2** ASM是一个字节码操作...
Spring 3.0引入了对消息传递(如JMS)的支持,提供了消息模板和监听器接口,方便了企业级消息系统的集成。 ### 9. **国际化和本地化** Spring 3.0加强了对国际化和本地化处理的支持,提供了MessageSource接口和...
当用户通过浏览器发送请求时,Struts2框架会根据配置找到对应的Action进行处理,并返回结果给前端显示。 #### Action的动态调用方法 - 可以通过URL参数的形式动态调用Action中的不同方法,如`/actionName!method...
Spring3.0 MVC框架是Spring框架的一个重要组成部分,专门用于构建强大的Web应用程序。该框架具有高度的可配置性,允许开发者灵活地设计每个逻辑和功能模块。Spring MVC不仅能够独立工作,还可以与其他流行的Web框架...
本示例将详细介绍如何利用Velocity模板和Spring框架来发送邮件,以及如何实现通用性和多扩展性。 首先,我们需要在项目中引入Velocity和Spring的相关依赖。对于Spring框架,通常我们会使用Spring Framework的MVC...