1. 引入所需要jar包:activation.jar,commons-logging.jar,mail.jar,spring相关jar
2. Spring底层采用java mail进行集成,封装成统一API方便调用,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:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:p="http://www.springframework.org/schema/p" xmlns:util="http://www.springframework.org/schema/util" xmlns:tool="http://www.springframework.org/schema/tool" xmlns:context="http://www.springframework.org/schema/context" xmlns:task="http://www.springframework.org/schema/task" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:websocket="http://www.springframework.org/schema/websocket" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd http://www.springframework.org/schema/tool http://www.springframework.org/schema/tool/spring-tool.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd http://www.springframework.org/schema/websocket http://www.springframework.org/schema/websocket/spring-websocket-4.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd"> <!-- 申明JavaMailSenderImpl对象 --> <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"> <property name="defaultEncoding" value="UTF-8" /> <property name="host" value="smtp.exmail.qq.com" /> <property name="username" value="8673711@qq.com" /> <property name="password" value="xxxxxxxxx" /> <property name="javaMailProperties"> <props> <!-- 设置认证开关 --> <prop key="mail.smtp.auth">true</prop> <!-- 启动调试开关 --> <prop key="mail.debug">true</prop> <!-- 设置发送延时 --> <prop key="mail.smtp.timeout">0</prop> </props> </property> </bean> </beans>
3. 封装邮件发送接口
MailCriteria
import java.util.Date;
public class MailCriteria {
private String mailType;//邮件类型(文本邮件,或者带附件邮件)
private String from;
private String replyTo;
private String[] to;
private String[] cc;
private String[] bcc;
private Date sentDate;
private String title;
private String content;
private String fileUrl;
public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}
public String getReplyTo() {
return replyTo;
}
public void setReplyTo(String replyTo) {
this.replyTo = replyTo;
}
public String[] getTo() {
return to;
}
public void setTo(String to){
this.to = new String[]{to};
}
public void setTo(String[] to) {
this.to = to;
}
public String[] getCc() {
return cc;
}
public void setCc(String[] cc) {
this.cc = cc;
}
public String[] getBcc() {
return bcc;
}
public void setBcc(String[] bcc) {
this.bcc = bcc;
}
public Date getSentDate() {
return sentDate;
}
public void setSentDate(Date sentDate) {
this.sentDate = sentDate;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getFileUrl() {
return fileUrl;
}
public void setFileUrl(String fileUrl) {
this.fileUrl = fileUrl;
}
public String getMailType() {
return mailType;
}
public void setMailType(String mailType) {
this.mailType = mailType;
}
}
IMailService
public interface IMailService {
/**
* 发送邮件
* 目前只支持:文本邮件, 以及带单个附件的文本(需要时候可以扩展成多个附件)
* @param criteria
* @throws Exception
*/
public void sendEmail(MailCriteria criteria) throws Exception;
}
MailServiceImpl
import java.net.URL;
import javax.mail.internet.MimeMessage;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.InputStreamSource;
import org.springframework.core.io.UrlResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;
@Component
public class MailServiceImpl implements IMailService{
private static Logger logger = Logger.getLogger(MailServiceImpl.class);
@Autowired
private JavaMailSenderImpl senderImpl;
@Override
public void sendEmail(MailCriteria criteria) throws Exception{
if (Constants.MAIL_TYPE_TEXT.equals(criteria.getMailType())) {
sendTextEmail(criteria);
}
else if (Constants.MAIL_TYPE_FILE.equals(criteria.getMailType())) {
sendFileEmail(criteria);
}
else {
throw new Exception("不支持该邮件类型发送>>>"+criteria.getMailType());
}
}
/**
* 发送简单的文本邮件
*/
public void sendTextEmail(MailCriteria criteria) {
try {
SimpleMailMessage mailMessage = new SimpleMailMessage();
if (StringUtil.isEmpty(criteria.getFrom())) {
mailMessage.setFrom(senderImpl.getUsername());
}
else {
mailMessage.setFrom(criteria.getFrom());
}
mailMessage.setTo(criteria.getTo());
mailMessage.setSubject(criteria.getTitle());
mailMessage.setText(criteria.getContent());
// 发送邮件
senderImpl.send(mailMessage);
logger.info("邮件发送成功.. ");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 发送简单的html邮件
*/
public void sendHtmlEmail(MailCriteria criteria) {
try {
// 建立邮件消息,发送简单邮件和html邮件的区别
MimeMessage mailMessage = senderImpl.createMimeMessage();
MimeMessageHelper messageHelper = new MimeMessageHelper(mailMessage);
// 设置收件人,寄件人
if (StringUtil.isEmpty(criteria.getFrom())) {
mailMessage.setFrom(senderImpl.getUsername());
}
else {
mailMessage.setFrom(criteria.getFrom());
}
messageHelper.setTo(criteria.getTo());
messageHelper.setSubject(criteria.getTitle());
// true 表示启动HTML格式的邮件
messageHelper.setText("<html><head></head><body><h1>"+criteria.getContent()+"</h1></body></html>",true);
// 发送邮件
senderImpl.send(mailMessage);
logger.info("邮件发送成功..");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 发送嵌套图片的邮件(图片地址是采用URL方式)
*/
public void sendImageEmail(MailCriteria criteria) {
try {
//建立邮件消息,发送简单邮件和html邮件的区别
MimeMessage mailMessage = senderImpl.createMimeMessage();
//注意这里的boolean,等于真的时候才能嵌套图片,在构建MimeMessageHelper时候,所给定的值是true表示启用,
//multipart模式
MimeMessageHelper messageHelper = new MimeMessageHelper(mailMessage,true);
//设置收件人,寄件人
if (StringUtil.isEmpty(criteria.getFrom())) {
mailMessage.setFrom(senderImpl.getUsername());
}
else {
mailMessage.setFrom(criteria.getFrom());
}
messageHelper.setTo(criteria.getTo());
messageHelper.setSubject(criteria.getTitle());
//true 表示启动HTML格式的邮件
messageHelper.setText("<html><head></head><body><h1>"+criteria.getContent()+"</h1><img src='cid:aaa'/></body></html>",true);
//FileSystemResource img = new FileSystemResource(new File("g:/123.jpg"));
InputStreamSource iss = new UrlResource(new URL(criteria.getFileUrl()));
messageHelper.addInline("aaa",iss,"text/img");
//发送邮件
senderImpl.send(mailMessage);
logger.info("邮件发送成功..");
} catch (Exception e) {
logger.info(e);
}
}
/**
* 发送包含附件的邮件(附件的地址是采用URL方式)
*/
public void sendFileEmail(MailCriteria criteria) {
InputStreamSource iss = null;
try {
//建立邮件消息,发送简单邮件和html邮件的区别
MimeMessage mailMessage = senderImpl.createMimeMessage();
//注意这里的boolean,等于真的时候才能嵌套图片,在构建MimeMessageHelper时候,所给定的值是true表示启用,
//multipart模式 为true时发送附件 可以设置html格式
MimeMessageHelper messageHelper = new MimeMessageHelper(mailMessage,true,"utf-8");
//设置收件人,寄件人
messageHelper.setTo(criteria.getTo());
if (StringUtil.isEmpty(criteria.getFrom())) {
messageHelper.setFrom(senderImpl.getUsername());
}
else {
messageHelper.setFrom(criteria.getFrom());
}
messageHelper.setSubject(criteria.getTitle());
//true 表示启动HTML格式的邮件
messageHelper.setText("<html><head></head><body><h1>"+criteria.getContent()+"</h1></body></html>",true);
iss = new UrlResource(new URL(criteria.getFileUrl()));
String prefix = criteria.getFileUrl().substring(criteria.getFileUrl().lastIndexOf(".")+1);
//这里的方法调用和插入图片是不同的。
messageHelper.addAttachment("test."+prefix,iss);
//发送邮件
senderImpl.send(mailMessage);
logger.info("邮件发送成功..");
} catch (Exception e) {
logger.info(e);
} finally {
try {
iss.getInputStream().close();
} catch (Exception e) {
logger.info(e);
}
}
}
}
4. 客户端调用
首先实例化对象:MailCriteria
其次实例化对象:MailServiceImpl
接着调用:sendEmail