今天抽空分享一下基于spring发送邮件的方法,欢迎转载(请注明出处)
http://blog.csdn.net/cage_hunt/article/details/79272298。要想使用java发送邮件,首先就需要设置你的邮箱允许你这样做,也就是需要开启SMTP服务。比如我的是新浪邮箱:
上面只是示例,不管什么邮箱,只要设置开启SMTP服务就行。下面先来几个你可能会参考的API地址:1、spring文档email部分,有官方例子 ; 2、springAPI ; javaEE7API
好不废话了,首先需要引入jar包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.5.2</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.16</version>
</dependency>
spring关于email的模块都在spring-context-support里
spring提供了两种邮件内容,直接写text或者用html模板包含内容,在这里有各种方法的最简单使用示例,但是基于Velocity设置模板的方法好像已经被废弃了,spring更支持基于freemarker设置模板的方法。以下是代码
MailModel(email模型)
package com.hanjc.test.mail;
import java.io.Serializable;
import java.util.Map;
public class MailModel implements Serializable {
private static final long serialVersionUID = 1L;
private String host; //发件人邮箱服务器
private String from; //发件人邮箱
private String emailUserName; //发件人用户名
private String emailPassword; //发件人密码
private String to; //收件人邮箱,多个邮箱以“;”分隔
private String subject; //邮件主题
private String content; //邮件内容
private Map<String, String> attachments; //附件
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}
public String getEmailUserName() {
return emailUserName;
}
public void setEmailUserName(String emailUserName) {
this.emailUserName = emailUserName;
}
public String getEmailPassword() {
return emailPassword;
}
public void setEmailPassword(String emailPassword) {
this.emailPassword = emailPassword;
}
public String getTo() {
return to;
}
public void setTo(String to) {
this.to = to;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Map<String, String> getAttachments() {
return attachments;
}
public void setAttachments(Map<String, String> attachments) {
this.attachments = attachments;
}
}
发送email的类LogMail,我这个例子是测试向邮箱发送日志的,所以叫LogMail
package com.hexinyy.jzkfgl.common.mail_and_sms;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import javax.mail.internet.MimeMessage;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.mail.javamail.MimeMessagePreparator;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
import freemarker.template.Configuration;
import freemarker.template.Template;
public class LogMail {
private static final String TEMPLATE_NAME = "log_mail";
private static final String TEMPLATE_PATH = "D:/java/apache-tomcat-8.5.11/webapps/test/template/mail/logmail.html";
/*
* 设置email
*/
public void init(MailModel mailModel,Object body) throws FileNotFoundException,IOException{
//加载模板,可能抛出FileNotFoundException,IOException
Template template = new Template(TEMPLATE_NAME,new FileReader(TEMPLATE_PATH),new Configuration());
//使用MimeMessagePreparator预先设置email
MimeMessagePreparator preparator = new MimeMessagePreparator() {
public void prepare(MimeMessage mimeMessage) throws Exception {
//若添加附件必须设置加true
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true);
//邮件主题
helper.setSubject(mailModel.getSubject());
//收件人邮箱
helper.setTo(mailModel.getTo());
//发件人邮箱
helper.setFrom(mailModel.getFrom());
//数据模型,从模型里面获取邮件内容
Map<String, Object> model = new HashMap<String, Object>();
model.put("mailModel", body);
/*
* 用模板发邮件需要用到FreeMarkerTemplateUtils类,
* 基于Velocity设置模板的方式已经被废弃了
*/
String content = FreeMarkerTemplateUtils.processTemplateIntoString(template, model);
helper.setText(content, true);
/*
* 附件,可能有多个。 body是传进来的邮件实体类,所以此处的MailModel需要注意修改
*/
// Map<String, String> attachments = ((SysLogDTO) body).getAttachments();
// if (attachments != null && attachments.size() > 0) {
// Set<String> keySet = attachments.keySet();
// Iterator<String> iterator = keySet.iterator();
// while (iterator.hasNext()) {
// String key = iterator.next();
// String value = attachments.get(key);
// FileSystemResource file = new FileSystemResource(new File(value));
// helper.addAttachment(key, file);
// }
// }
}
};
//发送邮件
sendEmail(mailModel, preparator);
}
/*
* 发送邮件
*/
private void sendEmail(MailModel mailModel, MimeMessagePreparator preparator) {
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
mailSender.setDefaultEncoding("utf-8");//设置默认编码,否则中文可能出现乱码
mailSender.setHost(mailModel.getHost());
mailSender.setUsername(mailModel.getEmailUserName());
mailSender.setPassword(mailModel.getEmailPassword());
mailSender.send(preparator);
}
}
模板logmail.html
<html>
<body>
<h3>系统异常提醒!以下为异常日志······</h3>
<div>
<h4>异常发生时间:</h4>${mailModel.time }
</div>
<div>
<h4>异常发生位置:</h4>${mailModel.location}
</div>
<div>
<h4>实际参数:</h4>${mailModel.params}
</div>
<div>
<h4>异常内容:</h4>${mailModel.exception}
</div>
</body>
</html>
日志信息SysLogDTO
package com.hanjc.test.mail;
import java.util.Map;
public class SysLogDTO {
private String time; //发生时间
private String location; //发件位置
private String params; //实际参数
private Exception exception; //异常内容
private Map<String, String> attachments; //附件
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public String getParams() {
return params;
}
public void setParams(String params) {
this.params = params;
}
public Exception getException() {
return exception;
}
public void setException(Exception exception) {
this.exception = exception;
}
public Map<String, String> getAttachments() {
return attachments;
}
public void setAttachments(Map<String, String> attachments) {
this.attachments = attachments;
}
}
接下来就是利用AOP,在执行方法之前发送邮件ServiceAspect
package com.hanjc.test.aop;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import com.hanjc.test.exception.BusinessException;
import com.hanjc.test.mail.LogMail;
import com.hanjc.test.mail.MailModel;
import com.hanjc.test.mail.SysLogDTO;
/**
* Aspect切面
*/
@Component
@Aspect//声明这是一个切面Bean
public class ServiceAspect {
private static Logger logger = LogManager.getLogger(LoggerAspect.class.getName());
private static final String TO = "接收email的邮箱";
private static final String FROM = "发送email的邮箱";
private static final String HOST = "发送email的邮箱的服务器地址,例如新浪smtp.sina.com.cn";
private static final String USERNAME = "发送email的邮箱账户";
private static final String PASSWORD = "密码";
private static final String SUBJECT = "邮件主题";
/*
* 配置切入点,该方法无方法体,主要为方便同类中其他方法使用此处配置的切入点
*/
@Pointcut("execution(* com.hanjc.test.service.impl..*(..))")
public void aspect(){}
/*
* 配置前置通知,使用在方法aspect()上注册的切入点
* 同时接受JoinPoint切入点对象,可以没有该参数
*/
@Before("aspect()")
public void before(JoinPoint joinPoint) throws FileNotFoundException,IOException{
logger.log("开始测试eamil");
SysLogDTO sysLog = new SysLogDTO();//日志内容
//时间,必须String类型,否则模板不能解析
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = simpleDateFormat.format(new Date());
sysLog.setTime(time);
//执行方法名
sysLog.setLocation(joinPoint.toString());
//获取方法实际参数,经过迭代组成一个字符串
Object[] params = joinPoint.getArgs();
StringBuilder sb = new StringBuilder();
if (params != null && params.length > 0) {
for (Object param : params) {
sb.append(param+" , ");
}
sysLog.setParams(sb.toString());
}
//异常,这里设置自定义异常只是为了有异常数据,无实际意义
BusinessException e = new BusinessException("此处是异常内容");
sysLog.setException(e);
logger.error("抛出异常{[方法:"+method+"],[参数:"+sb.toString()+"]}");
MailModel mailModel = new MailModel();
mailModel.setTo(TO);
mailModel.setFrom(FROM);
mailModel.setHost(HOST);
mailModel.setSubject(SUBJECT);
mailModel.setEmailUserName(USERNAME);
mailModel.setEmailPassword(PASSWORD);
LogMail logMail = new LogMail();
logMail.init(mailModel, sysLog);
}
}
其他的代码,比如service之类的就不贴了,没什么用。这个例子可以完成发邮件的功能,但是结构上仍需要进行很多的改进,比如将email的subject,host等属性提取到properties文件里面等等,这里就不多说了