- 浏览: 2737 次
- 性别:
- 来自: 上海
最新评论
Spring 提供了对发送邮件的基础服务的支持,所以我尝试使用Spring来重构发送邮件的代码。
MailSenderInfo
对于这个类,职责很简单,用于保存邮件的所有相关信息。这个实体Bean是可以根据实际的业务需求进行动态扩展的,比如涉及带附件的邮件,那么可以指定附件的路劲。
根据 Effective Java 作者的推荐,一个通用的普通类应该覆写三个方法,实现一个接口:@override: hashCode, @override equals, @override toString, implement Comparable.但是由于这个实体类的功能过于简单,甚至用Map 的键值对都可替换,所以我就不做过多的实现,如果将来有实际的业务需要,可以再实现。
MailSender
有了邮件的相关配置信息之后,下一步就是如何发送的问题。考虑到发送邮件存在一定的差异性,比如说带附件的邮件,HTML格式的邮件;但同时邮件发送的原理又存在共性,所以我考虑使用一个抽象类来抽象共性,并用一个抽象方法来提供差异性。
因为代码的重构是依托Spring来进行的,本身不重新发明轮子的思路,我尽量使用spring已经实现的基础服务设施类。
JavaMailSenderImpl和SimpleMailMessage 都是基础设计服务类,一个用于发送邮件,一个用于组装邮件信息。
FreeMarkerConfigurer 是用于组装Freemarker 模板邮件而服务的类。
SimpleMailSender
首先看一种最简单的实现,文本邮件。通过实现父类的抽象方法 sendMail, 从而把子类的逻辑放进去。同时也使用了从父类继承而来的基础服务设施类,使得子类的代码显得目的明确而且很简洁。
HTMLMailSender
这是发送HTML格式的邮件,思路一致。
TemplateMailSender
这是发送模板邮件。
ApplicationContext-mail.xml
对于邮件来说,有很多属性需要配置,所以采用xml文件的方式应该会更合适,同时Spring提供的扫描注入方式也使得对原生代码的侵入性更低,所以我没有采用注解来实现注入依赖。
Mail.ftl
对于使用模板发送邮件的例子,这里给出一个模板案例。
Junit
最后,给出junit单元测试的例子。
说明
本例子是采用Spring 3.1.12Release版本实现的,对于xml文件中的星号,是需要读者自己定义的邮箱信息,项目的构建使用maven,推荐!
附件
附件中提供了word文档。
MailSenderInfo
对于这个类,职责很简单,用于保存邮件的所有相关信息。这个实体Bean是可以根据实际的业务需求进行动态扩展的,比如涉及带附件的邮件,那么可以指定附件的路劲。
根据 Effective Java 作者的推荐,一个通用的普通类应该覆写三个方法,实现一个接口:@override: hashCode, @override equals, @override toString, implement Comparable.但是由于这个实体类的功能过于简单,甚至用Map 的键值对都可替换,所以我就不做过多的实现,如果将来有实际的业务需要,可以再实现。
package com.spring.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; } }
MailSender
有了邮件的相关配置信息之后,下一步就是如何发送的问题。考虑到发送邮件存在一定的差异性,比如说带附件的邮件,HTML格式的邮件;但同时邮件发送的原理又存在共性,所以我考虑使用一个抽象类来抽象共性,并用一个抽象方法来提供差异性。
因为代码的重构是依托Spring来进行的,本身不重新发明轮子的思路,我尽量使用spring已经实现的基础服务设施类。
JavaMailSenderImpl和SimpleMailMessage 都是基础设计服务类,一个用于发送邮件,一个用于组装邮件信息。
FreeMarkerConfigurer 是用于组装Freemarker 模板邮件而服务的类。
package com.spring.mail; import org.apache.log4j.Logger; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSenderImpl; import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer; public abstract class MailSender { protected static Logger logger = Logger.getLogger(MailSender.class); protected JavaMailSenderImpl javaMailSender; public void setJavaMailSender(JavaMailSenderImpl javaMailSender) { this.javaMailSender = javaMailSender; } protected MailSenderInfo mailSenderInfo; public void setMailSenderInfo(MailSenderInfo mailSenderInfo) { this.mailSenderInfo = mailSenderInfo; } protected SimpleMailMessage simpleMailMessage; public void setSimpleMailMessage(SimpleMailMessage simpleMailMessage) { this.simpleMailMessage = simpleMailMessage; } protected FreeMarkerConfigurer freemarkerConfiguration; public void setFreemarkerConfiguration(FreeMarkerConfigurer freemarkerConfiguration) { this.freemarkerConfiguration = freemarkerConfiguration; } public abstract void sendMail() throws Exception; }
SimpleMailSender
首先看一种最简单的实现,文本邮件。通过实现父类的抽象方法 sendMail, 从而把子类的逻辑放进去。同时也使用了从父类继承而来的基础服务设施类,使得子类的代码显得目的明确而且很简洁。
package com.spring.mail.impl; import java.util.Properties; import com.spring.mail.MailSender; public class SimpleMailSender extends MailSender{ @Override public void sendMail() { 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); } }
HTMLMailSender
这是发送HTML格式的邮件,思路一致。
package com.spring.mail.impl; import java.io.File; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeUtility; import org.springframework.core.io.FileSystemResource; import org.springframework.mail.javamail.MimeMessageHelper; import com.spring.mail.MailSender; public class HTMLMailSender extends MailSender{ @Override public void sendMail() 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); } }
TemplateMailSender
这是发送模板邮件。
package com.spring.mail.impl; 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 javax.mail.internet.MimeMessage; import javax.mail.internet.MimeUtility; import org.springframework.core.io.FileSystemResource; import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.ui.freemarker.FreeMarkerTemplateUtils; import com.spring.mail.MailSender; import freemarker.template.Template; import freemarker.template.TemplateException; public class TemplateMailSender extends MailSender{ @Override public void sendMail() 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 ""; } }
ApplicationContext-mail.xml
对于邮件来说,有很多属性需要配置,所以采用xml文件的方式应该会更合适,同时Spring提供的扫描注入方式也使得对原生代码的侵入性更低,所以我没有采用注解来实现注入依赖。
<?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" default-autowire="byType"> <context:component-scan base-package="com.spring.mail"> <context:include-filter type="regex" expression="com\.spring\.mail\.impl\..*Sender.*" /> </context:component-scan> <bean id="mailSenderInfo" class="com.spring.mail.MailSenderInfo" > <property name="serverHost" value="smtp.**.com"/> <property name="serverPort" value="25"/> <property name="validate" value="true"/> <property name="userName" value="*************"/> <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" class="org.springframework.mail.javamail.JavaMailSenderImpl" /> <bean id="simpleMailMessage" class="org.springframework.mail.SimpleMailMessage" /> <bean id="freemarkerConfiguration" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> <property name="templateLoaderPaths"> <list> <value>/mail/</value> </list> </property> <property name="freemarkerSettings"> <props> <prop key="default_encoding">UTF-8</prop> <prop key="output_encoding">UTF-8</prop> <prop key="locale">en_US</prop> <prop key="number_format">#</prop> <prop key="whitespace_stripping">true</prop> <prop key="classic_compatible">true</prop> </props> </property> </bean> </beans>
Mail.ftl
对于使用模板发送邮件的例子,这里给出一个模板案例。
<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
最后,给出junit单元测试的例子。
package com.spring.mail; import org.junit.Before; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MailTester { ApplicationContext context; MailSender sender; @Before public void setUp(){ context = new ClassPathXmlApplicationContext("/mail/applicationContext-*.xml"); } @Test public void sendSimpleMail() throws Exception{ sender = (MailSender) context.getBean("simpleMailSender"); sender.sendMail(); } @Test public void sendHTMLMail() throws Exception{ sender = (MailSender) context.getBean("HTMLMailSender"); sender.sendMail(); } @Test public void setTemplateMail() throws Exception{ sender = (MailSender) context.getBean("templateMailSender"); sender.sendMail(); } }
说明
本例子是采用Spring 3.1.12Release版本实现的,对于xml文件中的星号,是需要读者自己定义的邮箱信息,项目的构建使用maven,推荐!
附件
附件中提供了word文档。
- Spring_邮件.zip (22.7 KB)
- 下载次数: 34
相关推荐
通过以上步骤,你就可以在Java应用中使用Spring发送邮件了。当然,实际的邮件发送可能更复杂,涉及HTML内容、附件、多部分消息等,可以使用`MimeMessage`和`MimeMessageHelper`类来构建复杂的邮件结构。例如,添加...
下面将详细介绍如何使用Spring发送邮件。 首先,我们需要在项目中引入Spring的邮件支持。这通常通过添加`spring-context-support`依赖来完成,该依赖包含了处理邮件发送所需的类。在Maven项目中,可以在pom.xml文件...
和上面对比,这次发送邮件使用 MimeMessageHelper 类。MimeMessageHelper 支持发送复杂邮件模板,支持文本、附件、HTML、图片等,接下来我们会继续使用。 (3)发送带附件的邮件 在 MailService 添加 ...
Spring框架提供了一种优雅的方式来处理这个任务,它整合了JavaMailSender接口和JavaMail API,使得在Java应用程序中发送邮件变得更加简单。让我们深入探讨这个主题。 首先,JavaMail API是Java用来处理邮件收发的...
本教程将详细讲解如何使用Spring发送邮件,以及在遇到问题时如何排查。 首先,我们需要在Spring项目中引入邮件服务相关的依赖。在Maven项目中,可以在pom.xml文件中添加如下依赖: ```xml <groupId>org.spring...
标题 "Spring 使用163发邮件带附件" 涉及到的是在Java开发中,使用Spring框架发送电子邮件,特别是包含附件的邮件。这通常在系统需要自动化通知、报告发送或者用户验证过程中非常常见。Spring提供了JavaMailSender...
在IT行业中,Spring框架是Java开发中的一个关键组件,它提供了丰富的...对于那些需要发送大量或定期邮件的应用,还可以考虑使用邮件队列服务,如Amazon SES或SendGrid,配合Spring进行集成,实现高效、可靠的邮件发送。
在IT行业中,Spring框架是Java开发中的一个核心组件,它为构建高质量的、可维护的、面向服务的软件提供了强大的支持。...通过阅读和理解这个例子,你可以掌握在实际项目中使用Spring发送邮件的关键步骤。
使用Spring发送邮件的基本步骤如下: 1. 添加Spring核心库和相关的邮件发送库(如JavaMail API)到项目依赖中。 2. 在Spring配置文件(如`email-163.xml`)中配置邮件服务器的相关信息,如用户名、密码、SMTP服务器...
要使用Spring发送邮件,我们需要进行以下步骤: 1. **配置JavaMailSender**:在Spring的配置文件中,我们需要配置`JavaMailSender`的实现,例如`JavaMailSenderImpl`。配置项包括SMTP服务器地址、端口、用户名、...
从提供的文件列表中,我们可以推测`spring发送邮件.md`可能是一个Markdown格式的文档,详细讲解了如何配置和使用Spring发送邮件,而`1.png`、`2.png`和`3.png`可能是相关的截图,帮助读者更好地理解和学习这一过程。...
同时,如果你需要发送的邮件具有模板,可以考虑使用Spring的`Thymeleaf`或者其他模板引擎来动态生成邮件内容。 总的来说,Spring集成邮件服务使得在Java应用中发送邮件变得简单且灵活。通过合理的配置和编程,你...
在本文中,我们将深入探讨如何使用Spring框架实现邮件发送功能,特别关注SSM(Spring、...通过这个教程,新手可以快速掌握在Java应用中使用Spring发送邮件的基本技能,无论是普通的文本邮件还是富文本的HTML邮件。
接下来,我们将介绍如何使用Spring发送不同类型的邮件: 1. **发送纯文本邮件**: 要发送纯文本邮件,你可以创建一个`SimpleMailMessage`对象,设置发件人、收件人、主题和正文,然后调用`JavaMailSender`的`send...
本项目聚焦于使用Spring Boot来开发一个支持多附件邮件发送的微服务平台。这个平台可以方便地集成到各种业务场景中,例如发送报告、通知或者用户验证邮件。 首先,我们需要了解Spring Boot的邮件服务模块——`...
本文将详细介绍如何使用Spring发送邮件,包括配置JavaMailSenderImpl以及编写发送邮件的代码。 首先,Spring的核心邮件发送抽象是MailSender接口。这个接口定义了发送邮件的基本操作,而它的具体实现是...
总结来说,Spring发送邮件需要`spring-context`、`spring-context-support`、`java-mail`、`javax.activation`这些核心库,以及可能需要的测试库`junit`。理解和掌握这些库的作用及如何配置它们,对于实现Spring中的...