`

通过spring,javamail,和freemarker集成发送HTML方式的电子邮件

阅读更多
一) 现在项目中用的javamail和org.springframework.mail.javamail.JavaMailSender来发送电子邮件的,而邮件正文的模板是在spring的配置文件中完成的。
修改起来比较麻烦,并缺乏一些逻辑控制。我决定改造一下,把这些模板性质的东西都用freemarker管理起来。于是就有了这篇文章。

二) 代码和配置
package mail;

import java.io.IOException;
import java.util.Collection;

import javax.mail.internet.MimeMessage;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.mail.javamail.MimeMessagePreparator;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
import org.springframework.util.Assert;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

public class FreeMarkerConfiguredMailSender implements InitializingBean {
	
	private Configuration freeMarkerConfiguration;
	private JavaMailSender javaMailSender;
	private String encoding = "UTF-8";
	
	// constructor
	// -----------------------------------------------------------------------

	public FreeMarkerConfiguredMailSender() {
		super();
	}
	
	
	public FreeMarkerConfiguredMailSender(
			Configuration freeMarkerConfiguration, JavaMailSender javaMailSender) {
		this();
		this.freeMarkerConfiguration = freeMarkerConfiguration;
		this.javaMailSender = javaMailSender;
	}



	// send html email, exception thrown maybe
	// -----------------------------------------------------------------------
	public void sendMail(final String[] to, final String from, final String[] cc, final String[] bcc, final String subject, String templateName, Object model)
			throws IOException, TemplateException
	{
		Template template = freeMarkerConfiguration.getTemplate(templateName);
		final String text = FreeMarkerTemplateUtils.processTemplateIntoString(template, model);
		
		javaMailSender.send(new MimeMessagePreparator() {
			public void prepare(MimeMessage mimeMessage) throws Exception {
				MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true, encoding);
				message.setTo(to);
				message.setFrom(from);
				message.setCc(cc != null ? cc : new String[0]);
				message.setBcc(bcc != null ? bcc : new String[0]);
				message.setSubject(subject != null ? subject : "");
				message.setText(text, true);
			}
		});
	}
	
	public void sendMail(final String to, final String from, final String[] cc, final String[] bcc, final String subject, String templateName, Object model) 
			throws IOException, TemplateException
	{
		sendMail(new String[]{to}, from, cc, bcc, subject, templateName, model);
	}
	
	public void sendMail(final Collection<String> to, final String from, final Collection<String> cc, final Collection<String> bcc, final String subject, String templateName, Object model)
			throws IOException, TemplateException
	{
		sendMail(_toArray(to), from, _toArray(cc), _toArray(bcc), subject, templateName, model);
	}
	
	public void sendMail(final String to, final String from, final Collection<String> cc, final Collection<String> bcc, final String subject, String templateName, Object model)
			throws IOException, TemplateException
	{
		sendMail(to, from, _toArray(cc), _toArray(bcc), subject, templateName, model);
	}
	

	// send html email quietly
	// -----------------------------------------------------------------------
	public boolean sendMailQuietly(final String[] to, final String from, final String[] cc, final String[] bcc, final String subject, String templateName, Object model) {
		try {
			sendMail(to, from, cc, bcc, subject, templateName, model);
		} catch (IOException e) {
			return false;
		} catch (TemplateException e) {
			return false;
		}
		return true;
	}
	
	public boolean sendMailQuietly(final String to, final String from, final String[] cc, final String[] bcc, final String subject, String templateName, Object model) 
	{
		try {
			sendMail(new String[]{to}, from, cc, bcc, subject, templateName, model);
		} catch (IOException e) {
			return false;
		} catch (TemplateException e) {
			return false;
		}
		return true;
	}
	
	public boolean sendMailQuietly(final Collection<String> to, final String from, final Collection<String> cc, final Collection<String> bcc, final String subject, String templateName, Object model)
	{
		try {
			sendMail(_toArray(to), from, _toArray(cc), _toArray(bcc), subject, templateName, model);
		} catch (IOException e) {
			return false;
		} catch (TemplateException e) {
			return false;
		}
		return true;
	}
	
	public boolean sendMailQuietly(final String to, final String from, final Collection<String> cc, final Collection<String> bcc, final String subject, String templateName, Object model)
	{
		try {
			sendMail(to, from, _toArray(cc), _toArray(bcc), subject, templateName, model);
		} catch (IOException e) {
			return false;
		} catch (TemplateException e) {
			return false;
		}
		return true;
	}
	
	
	// inner util method
	// ------------------------------------------------------------------------------------------------------
	private String[] _toArray(Collection<String> collection) {
		if (collection == null || collection.isEmpty()) return new String[0];
		return collection.toArray(new String[0]);
	}
	

	//
	// ------------------------------------------------------------------------------------------------------
	public void afterPropertiesSet() throws Exception {
		Assert.notNull(encoding);
		Assert.notNull(freeMarkerConfiguration);
		Assert.notNull(javaMailSender);
		
		freeMarkerConfiguration.setDefaultEncoding(encoding);
	}
	

	// setter and getter
	// ------------------------------------------------------------------------------------------------------
	
	public JavaMailSender getJavaMailSender() {
		return javaMailSender;
	}
	
	public void setJavaMailSender(JavaMailSender javaMailSender) {
		this.javaMailSender = javaMailSender;
	}

	public Configuration getFreeMarkerConfiguration() {
		return freeMarkerConfiguration;
	}

	public void setFreeMarkerConfiguration(Configuration freeMarkerConfiguration) {
		this.freeMarkerConfiguration = freeMarkerConfiguration;
	}

	public String getEncoding() {
		return encoding;
	}

	public void setEncoding(String encoding) {
		this.encoding = encoding;
	}
	
}


<bean class="mail.FreeMarkerConfiguredMailSender">
	<property name="freeMarkerConfiguration">
		<bean class="org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean">
			<property name="templateLoaderPath" value="classpath:email-templates" />
			<property name="freemarkerSettings">
				<props>
					<prop key="tag_syntax">auto_detect</prop>
					<prop key="template_update_delay">0</prop>
					<!--
					<prop key="default_encoding">UTF-8</prop>
					<prop key="output_encoding">UTF-8</prop>
					-->
					<prop key="locale">zh_CN</prop>
					<prop key="date_format">yyyy-MM-dd</prop>
					<prop key="time_format">HH:mm:ss</prop>
					<prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
				</props>
			</property>
		</bean>
	</property>
	<property name="javaMailSender">
		<bean class="org.springframework.mail.javamail.JavaMailSenderImpl">
			<property name="host" value="smtp.xxx.com" />
			<property name="port" value="25" />
			<property name="username" value="foo@xxx.com" />
			<property name="password" value="password" />
			<property name="javaMailProperties">
				<props>
					<prop key="mail.smtp.auth">true</prop>
				</props>
			</property>
		</bean>
	</property>
</bean>
分享到:
评论

相关推荐

    spring整合freemarker发送邮件例子

    3. **JavaMail API**:JavaMail API 是 Java 平台上发送和接收电子邮件的标准库。Spring 集成了 JavaMail,提供了一个高层次的抽象,使得我们可以方便地设置发件人、收件人、主题、正文以及附件等信息。 4. **发送...

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

    163邮箱是中国流行的免费电子邮件服务提供商之一,提供了SMTP和POP3协议供开发者使用,以便发送和接收邮件。在程序中,我们需要配置163邮箱服务器的相关设置,如SMTP服务器地址、端口、用户名和密码,以进行邮件的...

    spring mail

    1. JavaMail API:Spring Mail是建立在JavaMail API之上的,JavaMail API是Java中用于发送和接收电子邮件的标准API,提供了丰富的邮件处理功能。 2. Session:JavaMail API中的Session对象是发送邮件的核心,它包含...

    JavaMail demo

    JavaMail 是一个强大的开源库,专门用于在Java应用程序中处理电子邮件。它提供了API,使得开发者可以方便地创建、发送和接收邮件。在这个“JavaMail demo”项目中,我们看到的是如何利用Spring框架的特性,结合...

    mail邮件发送包mail邮件发送包

    JavaMail 是一个用于处理电子邮件的开源API,它为Java开发者提供了一种方便的方式来发送和接收邮件。在JavaMail API中,我们可以利用SMTP(Simple Mail Transfer Protocol)协议来发送邮件,而使用POP3或IMAP协议来...

    Spring Email

    Spring Email 是一个在Spring框架中发送电子邮件的强大工具。在现代应用程序中,发送电子邮件是一个常见的功能,无论是用于通知、验证用户账户、发送报告还是其他服务。Spring框架提供了多种方式来实现这个功能,...

    SpringMail

    1. **JavaMail API**: SpringMail 基于 JavaMail API,这是一个用于创建、发送和接收电子邮件的标准 Java API。它包含了处理 SMTP、POP3 和 IMAP 协议的类。 2. **Session**: JavaMail 中的核心对象是 `Session`,...

    mail.zipJava邮件资源

    总的来说,JavaMail API和Spring框架的邮件发送功能为开发者提供了强大的邮件处理能力,无论是在企业级应用还是小型项目中,都能有效地满足发送和接收电子邮件的需求。这两个库的结合使用,不仅可以方便地处理基本的...

    javamail最新版JAR包!

    JavaMail 是一个开源的 Java API,它为 Java 程序员提供了处理电子邮件的能力,包括发送、接收和管理邮件。这个最新的版本1.4.3是开发者社区对JavaMail的一次重要更新,对于进行邮件功能开发的J2EE应用程序来说,这...

    spring依赖包讲解.doc

    在处理文件上传和发送电子邮件时,Spring可以使用COS库(cos.jar),但这不是唯一的选择,只有当选择使用COS实现时才需要引入此库。对于DOM操作,dom4j.jar在与Hibernate集成时是必要的,如果你的应用使用了...

    spring+sendmail+模板+properties+vm

    而“spring+sendmail+模板+properties+vm”这一主题则涉及到Spring框架中关于电子邮件发送以及使用模板和配置文件的部分。以下是这些知识点的详细说明: 1. **Spring Sendmail**: Spring框架提供了`JavaMailSender`...

    java+springboot商务安全邮箱邮件收发.rar

    1. **JavaMail API**: JavaMail是Java平台上的一个库,它提供了发送和接收电子邮件的标准API。在Java应用中,我们通常使用`javax.mail`包来处理邮件任务。例如,`Session`类代表与邮件服务器的会话,`Message`类用于...

    E-mail_demo-1.zip

    这是一个基于Spring ...总的来说,这个项目展示了如何将Spring Boot、Spring MVC和Mybatis整合在一起,创建一个能够发送和下载电子邮件的应用。开发者可以通过研究这些源码,学习如何在自己的项目中实现类似的功能。

    使用Spring的JAVA Mail支持简化邮件发送功能

    Spring为开发者提供了便捷的方式来发送电子邮件,包括简单的文本邮件、带有附件的邮件以及使用模板引擎如Velocity或Freemarker来定制邮件内容。 首先,确保你的项目包含了Spring的相关库以及Java Mail API的JAR包。...

    java邮件

    Java邮件技术是Java编程中的一项重要技能,它允许开发者通过编程方式发送和接收电子邮件。JavaMail API是Java平台上的标准库,提供了丰富的接口和类来处理邮件操作。本篇文章将深入探讨Java邮件的相关知识点。 首先...

    spring-mail-sender

    JavaMail API是Java中处理邮件的基石,它允许开发者发送和接收电子邮件,包括附件、HTML内容等。 1. **配置Spring Mail**: - 首先,你需要在Spring的配置文件(如`application.properties`或`application.yml`)...

    javaweb实现邮箱认证.zip

    1. **SMTP协议**:SMTP(Simple Mail Transfer Protocol)是电子邮件系统的核心,用于在邮件服务器之间发送邮件。在JavaWeb应用中,我们通常使用JavaMail API来通过SMTP协议发送邮件。 2. **JavaMail API**:...

Global site tag (gtag.js) - Google Analytics