spring mail 和 free marker

本文介绍如何使用Spring框架集成JavaMail实现邮件发送功能,包括配置、编写数据类、实现类及模版管理等内容。

最近新项目要用mail,以前一直是java mail写的,要写的东西比较多,比较复杂。这次查了查spring mail,发现spring把java mail封装的很好,用起来很方便

1.下载spring和java mail的jar包,我是用的maven,大家可以去maven central去找,这里用的java mail是1.4.6,spring是3.1.1。因为还用到了邮件模板,所以引入了freemarker 2.3.19;

2.配置appContext.xml

<bean id="javaMailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
		<!-- 服务器 -->
		<property name="host" value="smtp.xxxx.com" />
		<!-- 端口号 -->
		<property name="port" value="25" />
		<!-- 用户名 -->
		<property name="username" value="xxx@xxx.com" />
		<!-- 密码 -->
		<property name="password" value="******" />
		<!-- SMTP服务器验证 -->
		<property name="javaMailProperties">
			<props>
				<!-- 验证身份 -->
				<prop key="mail.smtp.auth">true</prop>
			</props>
		</property>
	</bean>

	<bean id="simpleMailMessage" class="org.springframework.mail.SimpleMailMessage">
		<!-- 发件人email -->
		<property name="from" value="xxx@xxx.com" />
	</bean>

	<bean id="emailManager" class="com.michael.mail.EmailManager">
		<property name="javaMailSender" ref="javaMailSender" />
		<property name="simpleMailMessage" ref="simpleMailMessage" />
	</bean>
        <!-- 配置freeMarkerConfigurer进行属性值的注入 -->  
        <bean id="freeMarkerConfigurer" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
        <property name="templateLoaderPaths" value="classpath:/free_marker_template" />
        <property name="freemarkerSettings">
            <props>
                <prop key="template_update_delay">60000</prop><!-- 模版延时更新,也就是有模版缓存 -->
                <prop key="default_encoding">UTF-8</prop>
                <prop key="locale">zh_CN</prop>
            </props>
        </property>
       </bean>
       <bean id="freeMarkerManager" class="com.michael.freemarker.FreeMarkerManager">
         <property name="freeMarkerConfigurer" ref="freeMarkerConfigurer" />
       </bean>
3.编写Email数据类

public class Email {

	private String subject;
	private String content;
	private String receiver;
	private String[] receivers;
	private String[] attachments;
	private boolean isHtml = false;

	public Email(String subject, String content, String receiver) {
		this.subject = subject;
		this.content = content;
		this.receiver = receiver;
	}

	public Email(String subject, String content, String receiver,
			String[] attachments) {
		this.subject = subject;
		this.content = content;
		this.receiver = receiver;
		this.attachments = attachments;
	}

	public Email(String subject, String content, String[] receivers) {
		this.subject = subject;
		this.content = content;
		filterEmailAddr(receivers);
	}

	public Email(String subject, String content, String[] receivers,
			String[] attachments) {
		this.subject = subject;
		this.content = content;
		this.attachments = attachments;
		filterEmailAddr(receivers);
	}

	/**
	 * 主题
	 * 
	 * @return
	 */
	public String getSubject() {
		return subject;
	}

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

	/**
	 * 内容
	 * 
	 * @return
	 */
	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}

	/**
	 * 收件人
	 * 
	 * @return
	 */
	public String getReceiver() {
		return receiver;
	}

	public void setReceiver(String receiver) {
		this.receiver = receiver;
	}

	/**
	 * 收件人列表
	 * 
	 * @return
	 */
	public String[] getReceivers() {
		return receivers;
	}

	public void setReceivers(String[] receivers) {
		this.receivers = receivers;
	}

	/**
	 * 附件
	 * 
	 * @return
	 */
	public String[] getAttachments() {
		return attachments;
	}

	public void setAttachments(String[] attachments) {
		this.attachments = attachments;
	}

	/**
	 * 是否是html文本,默认不是
	 * 
	 * @return
	 */
	public boolean isHtml() {
		return isHtml;
	}

	public void setHtml(boolean isHtml) {
		this.isHtml = isHtml;
	}

	private void filterEmailAddr(String[] emails) {
		if (emails == null || emails.length < 1)
			return;
		List<String> results = new ArrayList<String>();
		for (String em : emails) {
			if (MatcherUtil.isEmail(em))
				results.add(em);
		}
		setReceivers(results.toArray(new String[results.size()]));
	}

}

4.编写mail实现类

public class EmailManager {

	private JavaMailSender javaMailSender;

	private SimpleMailMessage simpleMailMessage;

	/**
	 * 同步发送邮件
	 * 
	 * @param email
	 */
	public void synSendMail(Email email) {
		try {
			MimeMessage mimeMessage = javaMailSender.createMimeMessage();
			MimeMessageHelper messageHelper = new MimeMessageHelper(
					mimeMessage, true, "UTF-8");
			messageHelper.setFrom(simpleMailMessage.getFrom());
			messageHelper.setSubject(email.getSubject());
			messageHelper.setText(email.getContent(), email.isHtml());
			if (email.getReceiver() == null)
				messageHelper.setTo(email.getReceivers());
			else
				messageHelper.setTo(email.getReceiver());
			List<FileSystemResource> fileResourceList = getAttachmentFile(email
					.getAttachments());
			for (FileSystemResource fr : fileResourceList) {
				messageHelper.addAttachment(
						MimeUtility.encodeWord(fr.getFilename()), fr);
			}
			javaMailSender.send(mimeMessage);
		} catch (Exception e) {
			LoggerUtil.error(EmailManager.class, "邮件发送失败:", e);
		}
	}

	/**
	 * 异步发送邮件
	 * 
	 * @param email
	 */
	public void asynSendMail(final Email email) {
		Runnable thread = new Runnable() {
			@Override
			public void run() {
				synSendMail(email);
			}
		};
		new Thread(thread).start();
	}

	/**
	 * spring注入
	 * 
	 * @param simpleMailMessage
	 */
	public void setSimpleMailMessage(SimpleMailMessage simpleMailMessage) {
		this.simpleMailMessage = simpleMailMessage;
	}

	/**
	 * spring注入
	 * 
	 * @param javaMailSender
	 */
	public void setJavaMailSender(JavaMailSender javaMailSender) {
		this.javaMailSender = javaMailSender;
	}

	/**
	 * 获取附件信息
	 * 
	 * @param filePath
	 * @return
	 */
	private List<FileSystemResource> getAttachmentFile(String[] filePath) {
		List<FileSystemResource> fileResourceList = new ArrayList<FileSystemResource>();
		if (filePath == null || filePath.length < 1)
			return fileResourceList;
		for (String file : filePath) {
			File attachmentFile = new File(file);
			if (attachmentFile.exists())
				fileResourceList.add(new FileSystemResource(attachmentFile));
		}
		return fileResourceList;
	}

}

5.编写freemarker管理类

/**
 * FreeMarker管理类
 * 
 * 说明:
 * 
 * getHtmlText方法: 需要2个参数:contentMap和templateFilePath contentMap:
 * 指的是模版需要的定制内容的key-value,比如, 模版中有${content},map就要put一个key是content的string
 * 
 * templateFilePath: 是模版的路径,需要把你需要的模版放到所在项目
 * 的classpath下的free_marker_template下,templateFilePath
 * 指的是free_marker_template下的子目录,比如:getHtmlText(contentMap,"/sample.ftl")
 * 
 * @author liuyang
 * 
 */
public class FreeMarkerManager {

	private FreeMarkerConfigurer freeMarkerConfigurer;

	/**
	 * 获取模版内容
	 * 
	 * @param templateParamMap
	 * @param templateFilePath
	 * @return
	 */
	public String getHtmlText(Map<String, String> templateParamMap,
			String templateFilePath) {
		String htmlText = "";
		Template tpl = null;
		try {
			tpl = freeMarkerConfigurer.getConfiguration().getTemplate(
					templateFilePath);
			htmlText = FreeMarkerTemplateUtils.processTemplateIntoString(tpl,
					templateParamMap);
		} catch (Exception e) {
			LoggerUtil.error(FreeMarkerManager.class, "FreeMarker加载"
					+ templateFilePath + "错误:", e);
		}
		return htmlText;
	}

	/**
	 * spring注入
	 * 
	 * @param freeMarkerConfigurer
	 */
	public void setFreeMarkerConfigurer(
			FreeMarkerConfigurer freeMarkerConfigurer) {
		this.freeMarkerConfigurer = freeMarkerConfigurer;
	}
}
6.freemarker模版

我这里把模版统一放到了classpath下面

<html>
<body>
  ${to}
  ${url}
</body>
</html>

测试

/**
	 * 发送注册验证邮件
	 * 
	 * @param email
	 * @param securityCode
	 */
	private void sendRegisterEmail(String userEmail, String url) {
		Map<String, String> contentMap = new HashMap<String, String>();
		contentMap.put("to", userEmail);
		contentMap.put("url", url);
		String content = freeMarkerManager.getHtmlText(contentMap,
				"/register_mail.ftl");
		Email email = new Email("xxxxxxx", content, userEmail);
		email.setHtml(true);
		emailManager.asynSendMail(email);
	}


项目中发邮件还是采用异步发送比较好,有时候smtp服务器会有延迟

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值