`

通过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>
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics