`
uule
  • 浏览: 6337684 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

使用FreeMarker邮件模版来发送邮件

阅读更多

Spring为FreeMarker提供了一个FreeMarkerConfigurer类,通过此类可方便地创建FreeMarker的基础环境,Spring提供FreeMarkerTemplateUtils工具类来完成解析模板的任务。

 

下面以用户注册成功后发送的模板文件registerUser.ftl,将该文件放在src/mailTemplate下:


6.1 模板文件

<html>
   <head>
      <meta http-equiv="content-type" content="text/html;charset=utf8">
   </head>
   <body>
       恭喜您成功注册!您的用户名为:<font color='red' size='30'>${username}</font>
   </body>
</html>

 上面的${username}标签代表一个可被替换的动态属性。FreeMarker模板的标签支持级联属性,如${user.Id}则表示user对象的Id属性。

 

6.2 使用FreeMarker模板技术构造邮件内容

 

package com.bb.spring.email;
import org.springframework.ui.freemarker.*;
import org.springframework.web.servlet.view.freemarker.*;
import freemarker.template.*;
import ......
public class TemplateEmailService {
	private JavaMailSender sender;
	private FreeMarkerConfigurer freeMarkerConfigurer=null;//FreeMarker的技术类
	
	public void setFreeMarkerConfigurer(FreeMarkerConfigurer freeMarkerConfigurer) {
		this.freeMarkerConfigurer = freeMarkerConfigurer;
	}
	
	public void setSender(JavaMailSender sender) {
		this.sender = sender;
	}

    //通过模板构造邮件内容,参数username将替换模板文件中的${username}标签。
	private String getMailText(String username){
		String htmlText="";
		try {
			//通过指定模板名获取FreeMarker模板实例
			Template tpl=freeMarkerConfigurer.getConfiguration().getTemplate("registerUser.ftl");
			//FreeMarker通过Map传递动态数据
			Map map=new HashMap();
			map.put("username",username); //注意动态数据的key和模板标签中指定的属性相匹配
			//解析模板并替换动态数据,最终username将替换模板文件中的${username}标签。
			htmlText=FreeMarkerTemplateUtils.processTemplateIntoString(tpl,map);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return htmlText;
	}
	
	//发送模板邮件
	public void sendTemplateMail(String username) throws MessagingException{
		MimeMessage msg=sender.createMimeMessage();
		MimeMessageHelper helper=new MimeMessageHelper(msg,false,"utf8");//由于是html邮件,不是mulitpart类型
		helper.setFrom("dongsanbo@sina.com");
		helper.setTo("dongsanbo@sina.com");
		helper.setSubject("注册成功-模板邮件");
		String htmlText=getMailText(username);//使用模板生成html邮件内容
		helper.setText(htmlText, true);
		
		sender.send(msg);
		System.out.println("成功发送模板邮件");
	}
	public static void main(String[] args) throws MessagingException {
		// TODO Auto-generated method stub
		ApplicationContext ctx = new FileSystemXmlApplicationContext(   
        "src/applicationContext.xml"); 
		TemplateEmailService ms=(TemplateEmailService) ctx.getBean("templateEmail");
		
		//发送模板邮件
		ms.sendTemplateMail("yefriend");
	}//end method
}

 

6.3 applicationContext.xml配置文件  

<bean id="freeMarker" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
  <property name="templateLoaderPath" value="classpath:mailTemplate"/><!--指定模板文件目录--> 
  <property name="freemarkerSettings"><!-- 设置FreeMarker环境属性--> 
      <props>
          <prop key="template_update_delay">1800</prop><!--刷新模板的周期,单位为秒--> 
          <prop key="default_encoding">UTF-8</prop><!--模板的编码格式 -->
          <prop key="locale">zh_CN</prop><!-- 本地化设置-->
      </props>
  </property>
</bean>
<bean id="templateEmail" class="com.bb.spring.email.TemplateEmailService">
    <property name="sender" ref="mailsender"></property>
    <property name="freeMarkerConfigurer" ref="freeMarker"></property>
</bean> 
 

 

    在配置文件中已设置好模板目录,所以可在类中直接用模板文件名来定位模板文件。模板文件用UTF-8编码格式,避免中文乱码。通过设置template_update_delay属性,可让FreeMarker定期刷新模板,从而使应用程序在不重启下更新模板。

 

 至此,可以运行TemplateEmailService类发送邮件,实验表明"yefriend"将替换${username}。

以上来源:http://yefriendly.iteye.com/blog/404358


下面是自己的扩展:

 

实际项目中我们想要动态的指定数据源和模版,就需要如下构造获取方法:

public String getMailHtml(Map map, String templateName) {
    	String htmlText = null;
    	try {
			Template tpl = freeMarkerConfigurer.getConfiguration().getTemplate(templateName);
			htmlText = FreeMarkerTemplateUtils.processTemplateIntoString(tpl, map);
    	} catch (IOException e) {
			e.printStackTrace();
		} catch (TemplateException e) {
			e.printStackTrace();
		}
    	return htmlText;
    }

 这样就可以如下获取数据:

Map<String,Object> map = amendEmailUtils.initAmendPendingEmailMap(hotelbookheader...);
		String html = mailSender.getMailHtml(map, "amendmentPending.ftl");

 

如果发件人固定,我们还可以让TemplateEmailService 继承org.springframework.mail.SimpleMailMessage这个类,以使用其中的From或to属性

我的类:

public class SimpleMailSender extends SimpleMailMessage {
 
    private JavaMailSender sender;
    private MimeMessageHelper messageHellper;
    private FreeMarkerConfigurer freeMarkerConfigurer; 

 使用:

//类属性
public SimpleMailSender mailSender;

//方法中
Map<String,Object> map = amendEmailUtils.initAmendPendingEmailMap(hotelbookheader...);
		String html = mailSender.getMailHtml(map, "amendmentPending.ftl");		
				
		
		MimeMessage mimeMessage = mailSender.GetSender().createMimeMessage();
		MimeMessageHelper messageHellper = new MimeMessageHelper(mimeMessage, true, "utf-8");
		messageHellper.setSubject(amendSubjectToUser);

		messageHellper.setFrom(mailSender.getFrom());
//如果不继承,自定义类SimpleMailSender中就无from、to方法,就不可从配置文件中获取

 

xml配置:

<bean id="mailSender"
		class="com.techson.himsnanhwa.admin.mail.SimpleMailSender">
		<property name="javaMailSender"><ref bean="sender"/></property>
		<property name="freeMarkerConfigurer" ref="freeMarker"></property>  
		<property name="from">
			<value>wy@techson.com.hk</value>
		</property>
		<property name="to">
			<value>ming@techson.com.hk</value>
		</property>
	</bean>

<!--配置邮件模板-->     
	<bean id="freeMarker" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">      
	  <property name="templateLoaderPath" value="/mailTemplete"/>        
	  <property name="freemarkerSettings">                              
	      <props>      
	          <prop key="template_update_delay">15</prop>              
	          <prop key="default_encoding">UTF-8</prop>             
	          <prop key="locale">zh_CN</prop>                        
	      </props>      
	  </property>      
	</bean>

<bean id="sender"
		class="org.springframework.mail.javamail.JavaMailSenderImpl">
		<property name="host">
			<value>192.168.108.6</value>
		</property>
		<property name="javaMailProperties">
			<props>
				<prop key="mail.smtp.auth">true</prop>
				<prop key="mail.smtp.timeout">25000</prop>
			</props>
		</property>
		<property name="username">
			<value>wy</value>
		</property>
		<property name="password">
			<value>wy</value>
		</property>
	</bean>

 。。。

 

 

发送带附件的邮件:

MimeMessage message = mailSender.GetSender().createMimeMessage();
	MimeMessageHelper messageHellper = new MimeMessageHelper(message, true, "utf-8");
	messageHellper.setSubject(subject);
	messageHellper.setFrom(formMap.get("couemail") + "");
	messageHellper.setFrom(sender);
		
	Multipart mp = new MimeMultipart();  
	MimeBodyPart mbp = new MimeBodyPart();   
	File file = new File("E:\\hotel_" + filename + ".xls");
	FileDataSource fds=new FileDataSource(file); 
      	mbp.setDataHandler(new DataHandler(fds));  
      	mbp.setFileName(fds.getName()); 
      	mp.addBodyPart(mbp);  
      	
      	message.setContent(mp);
      	message.saveChanges();

 发送成功后可使用

fds.getFile().delete();

 删除文件!

 

参考:http://freeman983.iteye.com/blog/208586

或:

String path = ServletActionContext.getServletContext().getRealPath("/download/");
String destinct = path + "/" + fileName + ".zip";

Resource file = new ServletContextResource(ServletActionContext.getServletContext(),destinct);
helper.addAttachment("hotel_nh_"+countryCode + ".zip", file.getFile());

或:
 message.addAttachment("myDocument.pdf", new ClassPathResource("doc/myDocument.pdf"));

 。。。

详细参考:http://hi.baidu.com/sleep651/blog/item/90cbcd4635af6b046b63e5a4.html

分享到:
评论
2 楼 地毯毒蛇 2014-08-12  
地毯毒蛇 写道
请问本地代码修改ftl模板以后没有更新生效是什么问题呢?即便重启服务甚至把ftl文件rename都还是没生效,应该怎么办呢?


找到问题了
1 楼 地毯毒蛇 2014-08-12  
请问本地代码修改ftl模板以后没有更新生效是什么问题呢?即便重启服务甚至把ftl文件rename都还是没生效,应该怎么办呢?

相关推荐

    SpringBoot使用FreeMarker模板发送邮件

    通过springboot 整合freemarker模板引擎,自动发送html格式邮件

    Spring 使用Freemarker发送邮件的一个简单模板(代码不完整)

    标题“Spring使用Freemarker发送邮件的一个简单模板”指的是通过Spring的JavaMailSender接口和Freemarker模板来生成和发送邮件。首先,我们需要在项目中引入Spring和Freemarker的相关依赖,确保能够使用这两个库的...

    FreeMarker模板实现邮件发送

    1.这是一个在根目录下的mail.properties文件中配好发送邮件地址和接收邮箱地址的实例,利用freeMarker模板作为展示,在测试类中提供配固定接收邮箱地址和手动输入接收邮箱地址两种方法进行发送试验,结果都能实现...

    spring整合freemarker发送邮件例子

    在本示例中,我们将探讨如何使用Spring框架与FreeMarker模板引擎相结合,来实现一个功能丰富的电子邮件服务。这个服务能够发送HTML格式的邮件,其中包含内嵌的图片,并且能够处理附件,同时解决字符编码可能导致的...

    基于Java的邮件发送模板

    你可以创建一个HTML模板文件,然后使用字符串替换或者Java模板引擎(如FreeMarker或Velocity)来生成最终的邮件内容。 总的来说,JavaMail API和Apache Commons Email为Java开发者提供了强大的邮件发送功能。通过...

    Java发送带模版的邮件示例

    以上就是使用JavaMail API结合FreeMarker模板发送邮件的基本步骤。你可以根据实际需求调整模板设计,或者使用其他模板引擎,如Thymeleaf或Velocity,它们的原理类似,只是语法和API略有不同。 注意,在生产环境中,...

    基于Spring Boot和Apache Freemarker的电子邮件发送系统

    该项目是一个基于Spring Boot和Apache Freemarker的电子邮件发送系统。它允许用户通过自定义电子邮件模板、附件等功能,向指定的电子邮件地址发送邮件。用户可以编辑项目资源文件夹中的'email.ftl'文件来个性化电子...

    Spring+Freemarker 使用163发HTML格式的邮件

    标题 "Spring+Freemarker 使用163发HTML格式的邮件" 描述的是一个使用Spring框架结合Freemarker模板引擎发送HTML格式邮件的过程。在这个场景中,开发人员可能需要通过编程方式向用户发送包含丰富格式内容的邮件,...

    java发送HTML模版邮件

    在实际应用中,你可能还需要考虑错误处理、邮件附件、多语言支持等问题,以及更复杂的模板引擎如FreeMarker或Velocity来动态生成HTML内容。希望这个概述能帮助你理解并实现自己的Java邮件发送功能。

    基于Freemarker模板技术的邮件发送模块设计

    采用javamail实现的通用邮件发送模块,邮件内容采用Freemarker技术实现,多线程实现邮件发送,观察者模式来定制邮件的错误处理,设计思路参考作者博客 http://blog.csdn.net/crazycoder2010/article/details/6629076

    Spring Boot整合邮件发送并保存历史发送邮箱

    和上面对比,这次发送邮件使用 MimeMessageHelper 类。MimeMessageHelper 支持发送复杂邮件模板,支持文本、附件、HTML、图片等,接下来我们会继续使用。 (3)发送带附件的邮件 在 MailService 添加 ...

Global site tag (gtag.js) - Google Analytics