Spring+javamail+velocity发送邮件

时间:2025-03-23 15:52:41

最精做到一个项目需要用到邮箱验证,所研究了一下

 

首先需要jar包:

-3.1. (封装了javamail的相关api)

;   velocity-1.  velocity-tools-view-1.        commons-collections-3.        (为了防止出现位置错误,所以就全导入了)

 

首先建议一个    配置相关的信息

 

#必要的信息,服务器,用户名,密码,端口
host=smtp.
username=yourEmail
password=yourPassword
port=25
=true
=25000
=true
=
=25
=false

#默认发送者
=CoderZone<coderzone@>
#默认标题
=默认标题
=text/html; charset=GBK

#不同类型邮件模板
=默认的模板标题
=模板VM文件路径

 

然后配置Spring配置文件,同Spring的注入,大大的方便了我们编程

 

新建一个

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="/schema/beans"
	xmlns:xsi="http:///2001/XMLSchema-instance"
	xsi:schemaLocation="/schema/beans
           /schema/beans/spring-beans-2.
         
           ">

	<!-- 邮箱配置文件读取 -->
	<bean name="propertyConfigurer"
		class="">
		<property name="locations">
			<list>
				<value>classpath:</value>
			</list>
		</property>
	</bean>

	<!-- 邮件的发送器,非常的重要 ,传入配置文件的信息-->
	<bean name="mailSender" class="">
		<property name="host">
			<value>${host}</value>
		</property>
		<property name="username">
			<value>${username}</value>
		</property>
		<property name="password">
			<value>${password}</value>
		</property>
		<property name="port">
			<value>${port}</value>
		</property>

		<property name="javaMailProperties">
			<props>
				<prop key="">${}</prop>
				<prop key="">${}</prop>
				<prop key="">${}</prop>
				<prop key="">${}</prop>
				<prop key="">${}</prop>
			</props>

		</property>
	</bean>

	<!-- 邮件发送工具,也是一个基础的模板类,其他类型的模板都是"继承"这个的 -->
	<bean name="baseMailTemplate" class="com."
		abstract="true">
		<property name="velocityEngine" ref="velocityEngine" />
		<property name="mailHeaders">
			<props>
				<prop key="Content-Type">
					${}
				</prop>
			</props>
		</property>
		<property name="from">
			<value>${}</value>
		</property>
	</bean>

	<!-- 读取velocity模板的工厂类,也就是的不同的模板的 -->
	<bean 
		class="">
		<property name="velocityProperties">
			<props>
				<!-- 设置从classPath下读取模板文件 vm文件 -->
				<prop key="">class</prop>
				<prop key="">
					
				</prop>
				<prop key=""></prop>
			</props>
		</property>
	</bean>

</beans>


基本配置完成了,下面就是配置相应的模板了,新建一个 ,这里我有两个模板,一个是激活帐号的,一个是找回密码的

 

 

别忘了把这两个xml文件包含到主配置文件里去哦

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="/schema/beans"
	xmlns:xsi="http:///2001/XMLSchema-instance"
	xsi:schemaLocation="/schema/beans /schema/beans/
       ">

	
	<bean  parent="baseMailTemplate">
		<property name="subject">
			<value>${}</value>
		</property>
		<property name="templateName">
			<value>${}</value>
		</property>
	</bean>
	
	
	<bean  parent="baseMailTemplate">
		<property name="subject">
			<value>${}</value>
		</property>
		<property name="templateName">
			<value>${}</value>
		</property>
	</bean>
	
	
</beans>
	

接下来就是主要的操作类了

 

 

package com.;


import ;
import ;
import ;

import ;
import ;
import ;
import ;
import ;

import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;


/**
 * 类描述:邮件发送模板
 * @author zzy
 * @date: 日期:2012-9-29 时间:上午10:58:21
 * @version 1.0
 */
public class VelocityMailUtil{

	
	private Properties mailHeaders = new Properties();
	
	/**
	 * 邮件发送者,包括发送者姓名和地址,用于设置在邮件的from栏目中
	 */
	private String from;

	/**
	 * 邮件主题
	 */
	private String subject;

	/**
	 * 邮件内容模板地址/名称
	 */
	private String templateName;

	/**
	 * velocity引擎
	 */
	private VelocityEngine velocityEngine;

	/**
	 * JavMail发送器,通过Spring诸注入
	 */
	@Autowired
	private JavaMailSender mailSender;


	/**
	 * 使用提供的数据,套入velocity模板,生成最后文本信息。
	 * 
	 * 大部分情况下,这个信息应该就是邮件的内容。
	 */
	public String renderText(Map model) throws VelocityException {
		//防止乱码,需设置为GBK
		return (getVelocityEngine(),
				getTemplateName(),"GBK", model);
	}


	public Properties getMailHeaders() {
		return mailHeaders;
	}


	/**
	 * 设置非空mime hader,一般可以利用此设置contentType等
	 * @param mailHeaders
	 */
	public void setMailHeaders(Properties mailHeaders) {
		 = mailHeaders;
	}
	
	
	public String getFrom() {
		return ;
	}
	
	public Address getFromAddress() throws AddressException {
		return new InternetAddress();
	}

	/**
	 * 设置邮件发送者,包括发送者姓名和地址,用于设置在邮件的from栏目中
	 * 
	 * @param from
	 */
	public void setFrom(String from) {
		 = from;
	}

	public String getSubject() {
		return subject;
	}

	public void setSubject(String subject) {
		 = subject;
	}

	public String getTemplateName() {
		return templateName;
	}

	/**
	 * 设置邮件内容模板地址/名称
	 * 
	 * @param templateName
	 */
	public void setTemplateName(String templateName) {
		 = templateName;
	}

	public VelocityEngine getVelocityEngine() {
		return velocityEngine;
	}

	public void setVelocityEngine(VelocityEngine velocityEngine) {
		 = velocityEngine;
	}

	
	/**
	 * 获取下层配置的mail发送器,发送邮件, 该mail发送器必须是JavaMailSender,否则抛出CaseException。
	 * 
	 * @return
	 */
	public JavaMailSender getJavaMailSender() {
		return (JavaMailSender)mailSender;
	}

	/**
	 * 设置mail发送器
	 * 
	 * @param mailEngine
	 */
	public void setMailSender(JavaMailSender mailSender) {
		 = mailSender;
	}

	
	/**
	 * 
	 * 发送Mime邮件简易方法。
	 * 
	 * 以Mime的方式发送邮件,这主要是为能够支持发送html或类似功能(非简单文本)的邮件
	 * 
	 * @param nameOfTo 邮件接收收人姓名 或 昵称
	 * @param emailOfTo 邮件接收人邮件地址
	 * @param model 邮件velocity模板中变量的值
	 * @throws MailException
	 */
	public void sendMime(String nameOfTo, String emailOfTo, Map<String, Object> model) throws MailException {
		sendMime(nameOfTo + "<" + emailOfTo + ">", model);
	}

	
	/**
	 *  发送Mime邮件简易方法。
	 * 
	 * 以Mime的方式发送邮件,这主要是为能够支持发送html或类似功能(非简单文本)的邮件
	 * 
	 * @param to 邮件接收人邮件地址以及可能的收件人姓名或昵称
	 * @param model 邮件velocity模板中变量的值
	 */
	public void sendMime(String to, Map<String, Object> model) throws MailException {
		sendMime(mergeSimpleMessage(to, model));
	}
	

	/**
	 * 发送Mime邮件简易方法。
	 * 
	 * 以Mime的方式发送SimpleMailMessage,这主要是为能够支持发送html或类似功能(非简单文本)的邮件
	 * 
	 * @param simpleMessage
	 * @throws MailException
	 */
	public void sendMime(SimpleMailMessage simpleMessage) throws MailException {
		(toMimeMessage(simpleMessage));
	}
	

	
	/**
	 * 产生简单信息
	 * @param to
	 * @param model
	 * @return
	 */
	public SimpleMailMessage mergeSimpleMessage(String to, Map<String, Object> model) {
		//render text of mail from velocity template with the data
		String text = null;
		try {
			text = renderText(model);
		} catch (VelocityException e) {
			();
		}
		
		(text);
		
		//mail message setting
		SimpleMailMessage message = new SimpleMailMessage();
		(getSubject());
		(getFrom());
		(to);
		(text);
		return message;
	}
	
	/**
	 * 产生html文本信息
	 * @param simpleMailMessage
	 * @return
	 */
	public MimeMessagePreparator toMimeMessage(final SimpleMailMessage simpleMailMessage) {
		 MimeMessagePreparator preparator = new MimeMessagePreparator(){

			public void prepare(MimeMessage mimeMessage) throws Exception {
				// TODO Auto-generated method stub
				 MimeMessageHelper message = new MimeMessageHelper(mimeMessage,true,"GBK");
				 (());
				 (());
				 ((),true);
				 (());
			}
			 
		 };
		
		return preparator;	
	}
}


下面就是模板文件了 举一个例子 account_activity.vm

 

此处的 $!{user}  为占位符,具体替换为你在 VelocityMailUtil中传入的map文件,根据键值对进行替换。

要注意的这个vm文件放置的位置,前面我们设置了是从classPath下读取(因为不同的运行环境路径不同,所以还是不要设置绝对路径了),把这里路径写在就可以了

 

<html>
<body>
<h3>您好 $!{username}, 欢迎您加入CoderZone!</h3>
 
<div>
    	您的email地址是<a href="$!{url}">$!{url}</a>.
  		本条信息是系统自动发送,请勿回复!
</div>
</body>
 
</html>
到这里就一切OK了,怎么调用就不说了把,直接调用VelocityMailUtil的sendMime方法就可以了,自己去试试把