首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 互联网 >

应用Spring发送邮件

2012-10-14 
使用Spring发送邮件最近看spring3 对邮件的支持,于是想重构一下以前的邮件发送代码。spring3 内置了一个叫

使用Spring发送邮件
最近看spring3 对邮件的支持,于是想重构一下以前的邮件发送代码。spring3 内置了一个叫做JavaMailSenderImpl的类来实现邮件发送的具体操作,所以我们要做的就是把信息装配好,让这个代理者去发送。
OK,废话不多说,看代码,首先我们需要一个保存发送邮件所需信息的类,这个类里面的字段是可以扩展的,根据你的实际业务需要来定制。

package com.workbench.framework.mail;public class MailSenderInfo {private String serverHost;private int serverPort;private boolean validate;private String userName;private String password;private String fromAddress;private String sendName;private int timeout;private String toAddress;private String subject;private String text;private String filepath;public String getServerHost() {return serverHost;}public void setServerHost(String serverHost) {this.serverHost = serverHost;}public int getServerPort() {return serverPort;}public void setServerPort(int serverPort) {this.serverPort = serverPort;}public boolean isValidate() {return validate;}public void setValidate(boolean validate) {this.validate = validate;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getFromAddress() {return fromAddress;}public void setFromAddress(String fromAddress) {this.fromAddress = fromAddress;}public String getSendName() {return sendName;}public void setSendName(String sendName) {this.sendName = sendName;}public void setTimeout(int timeout) {this.timeout = timeout;}public int getTimeout() {return timeout;}public void setToAddress(String toAddress) {this.toAddress = toAddress;}public String getToAddress() {return toAddress;}public void setSubject(String subject) {this.subject = subject;}public String getSubject() {return subject;}public void setText(String text) {this.text = text;}public String getText() {return text;}public void setFilepath(String filepath) {this.filepath = filepath;}public String getFilepath() {return filepath;}}

接下来再看邮件发送的具体操作,这个类有三个方法,分别是发送简单文本邮件、发送HTML格式的邮件、发送freemarker模板的邮件。
package com.workbench.framework.mail;import java.io.File;import java.io.FileNotFoundException;import java.io.IOException;import java.util.Date;import java.util.HashMap;import java.util.Map;import java.util.Properties;import javax.mail.internet.MimeMessage;import javax.mail.internet.MimeUtility;import org.apache.log4j.Logger;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.core.io.FileSystemResource;import org.springframework.mail.SimpleMailMessage;import org.springframework.mail.javamail.JavaMailSenderImpl;import org.springframework.mail.javamail.MimeMessageHelper;import org.springframework.stereotype.Component;import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;import freemarker.template.Template;import freemarker.template.TemplateException;@Component("mailsender")public class MailSender {private static Logger logger = Logger.getLogger(MailSender.class);@Autowiredprivate JavaMailSenderImpl javaMailSender;public void setJavaMailSender(JavaMailSenderImpl javaMailSender) {this.javaMailSender = javaMailSender;}@Autowiredprivate MailSenderInfo mailSenderInfo;public void setMailSenderInfo(MailSenderInfo mailSenderInfo) {this.mailSenderInfo = mailSenderInfo;}@Autowiredprivate SimpleMailMessage simpleMailMessage;public void setSimpleMailMessage(SimpleMailMessage simpleMailMessage) {this.simpleMailMessage = simpleMailMessage;}@Autowiredprivate FreeMarkerConfigurer freemarkerConfiguration;public void setFreemarkerConfiguration(FreeMarkerConfigurer freemarkerConfiguration) {this.freemarkerConfiguration = freemarkerConfiguration;}public void sendSimpleMail() {javaMailSender.setHost(mailSenderInfo.getServerHost());javaMailSender.setPort(mailSenderInfo.getServerPort());javaMailSender.setUsername(mailSenderInfo.getUserName());javaMailSender.setPassword(mailSenderInfo.getPassword());simpleMailMessage.setTo(mailSenderInfo.getToAddress());simpleMailMessage.setFrom(mailSenderInfo.getFromAddress());simpleMailMessage.setSubject(mailSenderInfo.getSubject());simpleMailMessage.setText(mailSenderInfo.getText());Properties prop = new Properties();prop.put("mail.smtp.auth", mailSenderInfo.isValidate());prop.put("mail.smtp.timeout", mailSenderInfo.getTimeout());javaMailSender.setJavaMailProperties(prop);javaMailSender.send(simpleMailMessage);}public void sendHTMLMail() throws Exception {javaMailSender.setHost(mailSenderInfo.getServerHost());javaMailSender.setPort(mailSenderInfo.getServerPort());javaMailSender.setUsername(mailSenderInfo.getUserName());javaMailSender.setPassword(mailSenderInfo.getPassword());/** * Create Mime mail(contains attach, html format) */MimeMessage mailMessage = javaMailSender.createMimeMessage();MimeMessageHelper messageHelper = new MimeMessageHelper(mailMessage, true, "utf-8");messageHelper.setFrom(mailSenderInfo.getFromAddress());messageHelper.setTo(mailSenderInfo.getToAddress());messageHelper.setSubject(mailSenderInfo.getSubject());/** * true means html format */messageHelper.setText("<html><head></head><body><h1>hello!</h1></body></html>", true);File file = new File(mailSenderInfo.getFilepath());if (file.exists()) {FileSystemResource fileAdd = new FileSystemResource(file);messageHelper.addAttachment(MimeUtility.encodeWord(fileAdd.getFilename()), fileAdd);}javaMailSender.send(mailMessage);}public void sendTemplateMail() throws Exception{javaMailSender.setHost(mailSenderInfo.getServerHost());javaMailSender.setPort(mailSenderInfo.getServerPort());javaMailSender.setUsername(mailSenderInfo.getUserName());javaMailSender.setPassword(mailSenderInfo.getPassword());/** * Create Mime mail(contains attach, html format) */MimeMessage mailMessage = javaMailSender.createMimeMessage();MimeMessageHelper messageHelper = new MimeMessageHelper(mailMessage, true, "utf-8");messageHelper.setFrom(mailSenderInfo.getFromAddress());messageHelper.setTo(mailSenderInfo.getToAddress());messageHelper.setSubject(mailSenderInfo.getSubject());/** * true means html format */messageHelper.setText(getEmailContent(), true);File file = new File(mailSenderInfo.getFilepath());if (file.exists()) {FileSystemResource fileAdd = new FileSystemResource(file);messageHelper.addAttachment(MimeUtility.encodeWord(fileAdd.getFilename()), fileAdd);}javaMailSender.send(mailMessage);}private String getEmailContent() {try {Template template = freemarkerConfiguration.getConfiguration().getTemplate("mail.ftl");Map<String, String> map = new HashMap<String, String>();map.put("user", "Andy");map.put("currentDate", new Date().toString());String content = FreeMarkerTemplateUtils.processTemplateIntoString(template, map);return content;} catch (TemplateException e) {logger.error("Error while processing FreeMarker template ", e);} catch (FileNotFoundException e) {logger.error("Error while open template file ", e);} catch (IOException e) {logger.error("Error while generate Email Content ", e);}return "";}}


对于Bean的注入,原则上能使用注解的就使用注解+扫描,对于原生的spring则只能使用xml配置。用*号代替的是需要你自己配置的。
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:context="http://www.springframework.org/schema/context"   xsi:schemaLocation="http://www.springframework.org/schema/beans   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd    http://www.springframework.org/schema/context   http://www.springframework.org/schema/context/spring-context-3.0.xsd"><context:annotation-config /><context:component-scan base-package="com.workbench" /><bean id="mailSenderInfo" ><property name="serverHost" value="smtp.hp.com"/><property name="serverPort" value="25"/><property name="validate" value="true"/><property name="userName" value="*****@hp.com"/><property name="password" value="***********"/><property name="fromAddress" value="************"/><property name="toAddress" value="************"/><property name="timeout" value="25000"/><property name="subject" value="this is a test mail"/><property name="text" value="this is a test mail"/><property name="filepath" value="E:\\Document\\LIR\\LIR_Tech_refresh.docx"/></bean><bean id="javaMailSender" /><bean id="simpleMailMessage" />        <bean id="freemarkerConfiguration" name="code"><html>      <head>         <meta http-equiv="content-type" content="text/html;charset=utf8">      </head>      <body>      ${user} Welcome to Java world!!!<br/>       <br/><br/>       ---------------------------------       <br/>       ${currentDate}<br/>        connector: Andy<br/>       phone: 18688886666<br/>       mail: fei.xu3@hp.com<br/>   </body>   </html>  

以及junit的单元测试
package com.workbench.mail;import org.junit.Before;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.workbench.framework.mail.MailSender;public class MailTest {ApplicationContext context;MailSender sender;@Beforepublic void setUp(){context = new ClassPathXmlApplicationContext("/spring/applicationContext-*.xml");sender = (MailSender) context.getBean("mailsender");}@Testpublic void sendSimpleMail() throws Exception{sender.sendSimpleMail();}@Testpublic void sendHTMLMail() throws Exception{sender.sendHTMLMail();}@Testpublic void setTemplateMail() throws Exception{sender.sendTemplateMail();}}

热点排行