前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring和Email整合详解

Spring和Email整合详解

作者头像
品茗IT
发布2019-09-12 09:49:28
8750
发布2019-09-12 09:49:28
举报
文章被收录于专栏:品茗IT品茗IT

Spring和Email整合详解

官方主页

Spring Email

概述

Spring Mail API都在org.springframework.mail及其子包org.springframework.mail.javamail中封装。

JavaMailSenderImpl: 邮件发送器,主要提供了邮件发送接口、透明创建Java Mail的MimeMessage、及邮件发送的配置(如:host/port/username/password...)。

MimeMailMessage、MimeMessageHelper:对MimeMessage进行了封装。Spring还提供了一个回调接口MimeMessagePreparator, 用于准备JavaMail的MIME信件.

**如果大家正在寻找一个java的学习环境,或者在开发中遇到困难,可以<a

href="https://jq.qq.com/?_wv=1027&k=52sgH1J"

target="_blank">

加入我们的java学习圈,点击即可加入

</a>

,共同学习,节约学习时间,减少很多在学习中遇到的难题。**

开始搭建

依赖Jar包
代码语言:javascript
复制
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context-support</artifactId>
	<version>${spring.version}</version>
</dependency>
<dependency>
	<groupId>javax.mail</groupId>
	<artifactId>mail</artifactId>
	<version>1.4.7</version>
</dependency>
spring-mail.xml
代码语言:javascript
复制
<?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:aop="http://www.springframework.org/schema/aop"
	   xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="
                     http://www.springframework.org/schema/beans
                     http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
                     http://www.springframework.org/schema/aop
                     http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
                     http://www.springframework.org/schema/context
                     http://www.springframework.org/schema/context/spring-context-4.0.xsd ">

	<bean id="annotationPropertyConfigurerMail"
		  class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="order" value="1" />
		<property name="ignoreUnresolvablePlaceholders" value="true" />
		<property name="locations">
			<list>
				<value>classpath:mail.properties</value>
			</list>
		</property>
	</bean>

	<bean id="javaMailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
		<property name="host" value="${mail.smtpHost}" />
		<property name="port" value="${mail.port}" />
		<property name="username" value="${mail.username}" />
		<property name="password" value="${mail.password}" />
		<property name="defaultEncoding" value="${mail.charset}"></property>
		<property name="javaMailProperties">
		<props>
			<prop key="mail.smtp.auth">${mail.smtp.auth}</prop>
		</props>
		</property>
	</bean>
	
</beans>

这里,声明了javaMailSender的bean,配置从mail.properties配置文件中取,spring-mail.xml配置完成后,只需要在spring的配置文件中

<import resource="classpath*:spring-mail.xml"/> 即可mail.properties配置文件

mail.smtpHost=smtp.aliyun.com

mail.charset=utf-8

mail.fromAddress=xxxx@aliyun.com

mail.maxAttachSize=10M

mail.port=25

mail.username=xxxx@aliyun.com

mail.password=xxxxx

mail.smtp.auth=true

代码语言:javascript
复制
#### 发送邮件业务逻辑

这里,我们对Mail组件进行了扩展,以方便发送多类型的邮件。

MailServiceImpl:

```java

package com.cff.springwork.mail.service;

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import javax.mail.MessagingException;

import javax.mail.internet.MimeMessage;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.core.io.FileSystemResource;

import org.springframework.mail.SimpleMailMessage;

import org.springframework.mail.javamail.JavaMailSender;

import org.springframework.mail.javamail.MimeMessageHelper;

import org.springframework.stereotype.Component;

import com.alibaba.fastjson.JSON;

import com.alibaba.fastjson.JSONArray;

import com.alibaba.fastjson.JSONObject;

import com.alibaba.fastjson.parser.Feature;

import com.cff.springwork.mail.entity.AttachFile;

import com.cff.springwork.mail.entity.InlineFile;

import com.cff.springwork.mail.entity.JsonTable;

import com.cff.springwork.mail.entity.MailMessage;

import com.cff.springwork.mail.entity.MailType;

import com.cff.springwork.mail.entity.TextString;

@Component

public class MailServiceImpl implements MailService {

代码语言:javascript
复制
private final Logger logger = LoggerFactory.getLogger(this.getClass());
代码语言:javascript
复制
static final String DELIM_STR = "{}";
代码语言:javascript
复制
@Autowired
代码语言:javascript
复制
private JavaMailSender mailSender;
代码语言:javascript
复制
@Value("${mail.fromAddress}")
代码语言:javascript
复制
private String from;
代码语言:javascript
复制
MailMessage mailMessage;
代码语言:javascript
复制
@Override
代码语言:javascript
复制
public void sendSimpleMail(String to, String subject, String content) {
代码语言:javascript
复制
	SimpleMailMessage message = new SimpleMailMessage();
代码语言:javascript
复制
	message.setFrom(from);
代码语言:javascript
复制
	message.setTo(to);
代码语言:javascript
复制
	message.setSubject(subject);
代码语言:javascript
复制
	message.setText(content);
代码语言:javascript
复制
	try {
代码语言:javascript
复制
		mailSender.send(message);
代码语言:javascript
复制
		logger.info("简单邮件已经发送。");
代码语言:javascript
复制
	} catch (Exception e) {
代码语言:javascript
复制
		logger.error("发送简单邮件时发生异常!", e);
代码语言:javascript
复制
	}
代码语言:javascript
复制
}
代码语言:javascript
复制
@Override
代码语言:javascript
复制
public void sendHtmlMail(String to, String subject, String content) {
代码语言:javascript
复制
	MimeMessage message = mailSender.createMimeMessage();
代码语言:javascript
复制
	try {
代码语言:javascript
复制
		// true表示需要创建一个multipart message
代码语言:javascript
复制
		MimeMessageHelper helper = new MimeMessageHelper(message, true);
代码语言:javascript
复制
		helper.setFrom(from);
代码语言:javascript
复制
		helper.setTo(to);
代码语言:javascript
复制
		helper.setSubject(subject);
代码语言:javascript
复制
		helper.setText(content, true);
代码语言:javascript
复制
		mailSender.send(message);
代码语言:javascript
复制
		logger.info("html邮件发送成功");
代码语言:javascript
复制
	} catch (MessagingException e) {
代码语言:javascript
复制
		logger.error("发送html邮件时发生异常!", e);
代码语言:javascript
复制
	}
代码语言:javascript
复制
}
代码语言:javascript
复制
@Override
代码语言:javascript
复制
public void sendInlineResourceMail(String to, String subject, String content, String rscPath, String rscId) {
代码语言:javascript
复制
	MimeMessage message = mailSender.createMimeMessage();
代码语言:javascript
复制
	try {
代码语言:javascript
复制
		MimeMessageHelper helper = new MimeMessageHelper(message, true);
代码语言:javascript
复制
		helper.setFrom(from);
代码语言:javascript
复制
		helper.setTo(to);
代码语言:javascript
复制
		helper.setSubject(subject);
代码语言:javascript
复制
		helper.setText(content, true);
代码语言:javascript
复制
		FileSystemResource res = new FileSystemResource(new File(rscPath));
代码语言:javascript
复制
		helper.addInline(rscId, res);
代码语言:javascript
复制
		mailSender.send(message);
代码语言:javascript
复制
		logger.info("嵌入静态资源的邮件已经发送。");
代码语言:javascript
复制
	} catch (MessagingException e) {
代码语言:javascript
复制
		logger.error("发送嵌入静态资源的邮件时发生异常!", e);
代码语言:javascript
复制
	}
代码语言:javascript
复制
}
代码语言:javascript
复制
public void sendAttachmentsMail(String to, String subject, String content, String filePath) {
代码语言:javascript
复制
	MimeMessage message = mailSender.createMimeMessage();
代码语言:javascript
复制
	try {
代码语言:javascript
复制
		MimeMessageHelper helper = new MimeMessageHelper(message, true);
代码语言:javascript
复制
		helper.setFrom(from);
代码语言:javascript
复制
		helper.setTo(to);
代码语言:javascript
复制
		helper.setSubject(subject);
代码语言:javascript
复制
		helper.setText(content, true);
代码语言:javascript
复制
		FileSystemResource file = new FileSystemResource(new File(filePath));
代码语言:javascript
复制
		String fileName = filePath.substring(filePath.lastIndexOf(File.separator));
代码语言:javascript
复制
		helper.addAttachment(fileName, file);
代码语言:javascript
复制
		mailSender.send(message);
代码语言:javascript
复制
		logger.info("带附件的邮件已经发送。");
代码语言:javascript
复制
	} catch (MessagingException e) {
代码语言:javascript
复制
		logger.error("发送带附件的邮件时发生异常!", e);
代码语言:javascript
复制
	}
代码语言:javascript
复制
}
代码语言:javascript
复制
public MailMessage getMailMessage() {
代码语言:javascript
复制
	return mailMessage;
代码语言:javascript
复制
}
代码语言:javascript
复制
public void setMailMessage(MailMessage mailMessage) {
代码语言:javascript
复制
	this.mailMessage = mailMessage;
代码语言:javascript
复制
}
代码语言:javascript
复制
public void sendHtml(String content, MailType... mailTypes) throws IOException {
代码语言:javascript
复制
	MimeMessage message = mailSender.createMimeMessage();
代码语言:javascript
复制
	try {
代码语言:javascript
复制
		MimeMessageHelper helper = new MimeMessageHelper(message, true);
代码语言:javascript
复制
		helper.setFrom(mailMessage.getFrom());
代码语言:javascript
复制
		helper.setTo(mailMessage.getTo());
代码语言:javascript
复制
		helper.setSubject(mailMessage.getSubject());
代码语言:javascript
复制
		String msg = getContent(content, mailTypes);
代码语言:javascript
复制
		System.out.println(msg);
代码语言:javascript
复制
		helper.setText(msg, true);
代码语言:javascript
复制
		for (MailType item : mailTypes) {
代码语言:javascript
复制
			switch (item.getType()) {
代码语言:javascript
复制
			case MailType.TYPE_FILE:
代码语言:javascript
复制
				InlineFile inlineFile = (InlineFile) item;
代码语言:javascript
复制
				helper.addInline(inlineFile.getCid(), new File(inlineFile.getFilePath()));
代码语言:javascript
复制
				break;
代码语言:javascript
复制
			case MailType.TYPE_ATTACH:
代码语言:javascript
复制
				AttachFile attachFile = (AttachFile) item;
代码语言:javascript
复制
				helper.addAttachment(attachFile.getFileName(), new File(attachFile.getFilePath()));
代码语言:javascript
复制
				break;
代码语言:javascript
复制
			}
代码语言:javascript
复制
		}

// mailSender.send(message);

代码语言:javascript
复制
		logger.info("带附件的邮件已经发送。");
代码语言:javascript
复制
	} catch (MessagingException e) {
代码语言:javascript
复制
		logger.error("发送带附件的邮件时发生异常!", e);
代码语言:javascript
复制
	}
代码语言:javascript
复制
}
代码语言:javascript
复制
public String getContent(String content, MailType... mailTypes)
代码语言:javascript
复制
		throws MessagingException, IOException {
代码语言:javascript
复制
	String bodyPrefix = "<html><body>";
代码语言:javascript
复制
	String bodySuffix = "</body></html>";
代码语言:javascript
复制
	StringBuffer sb = new StringBuffer();
代码语言:javascript
复制
	sb.append(bodyPrefix);
代码语言:javascript
复制
	for (MailType item : mailTypes) {
代码语言:javascript
复制
		if(content.length() < 1)break;
代码语言:javascript
复制
		int index = content.indexOf(DELIM_STR);
代码语言:javascript
复制
		if(index == -1)break;
代码语言:javascript
复制
		sb.append(content.substring(0, index));
代码语言:javascript
复制
		switch (item.getType()) {
代码语言:javascript
复制
		case MailType.TYPE_FILE:
代码语言:javascript
复制
			InlineFile inlineFile = (InlineFile) item;
代码语言:javascript
复制
			sb.append("<img src=\'cid:" + inlineFile.getCid() + "\' />");
代码语言:javascript
复制
			break;
代码语言:javascript
复制
		case MailType.TYPE_TEXT:
代码语言:javascript
复制
			TextString textString = (TextString) item;
代码语言:javascript
复制
			sb.append(textString.getText());
代码语言:javascript
复制
			break;
代码语言:javascript
复制
		case MailType.TYPE_JSON:
代码语言:javascript
复制
			JsonTable json = (JsonTable) item;
代码语言:javascript
复制
			sb.append(genReportData(json));
代码语言:javascript
复制
			break;
代码语言:javascript
复制
		}
代码语言:javascript
复制
		content = content.substring(index + 2);
代码语言:javascript
复制
	}
代码语言:javascript
复制
	sb.append(content);
代码语言:javascript
复制
	sb.append(bodySuffix);
代码语言:javascript
复制
	return sb.toString();
代码语言:javascript
复制
}
代码语言:javascript
复制
private String read(String filePath) throws IOException {
代码语言:javascript
复制
	String encoding = "UTF-8";
代码语言:javascript
复制
	File tmpFile = new File(filePath);
代码语言:javascript
复制
	Long filelength = tmpFile.length();
代码语言:javascript
复制
	byte[] filecontent = new byte[filelength.intValue()];
代码语言:javascript
复制
	FileInputStream in = new FileInputStream(tmpFile);
代码语言:javascript
复制
	in.read(filecontent);
代码语言:javascript
复制
	in.close();
代码语言:javascript
复制
	String fileJson = new String(filecontent, encoding);
代码语言:javascript
复制
	return fileJson;
代码语言:javascript
复制
}
代码语言:javascript
复制
private String genReportData(JsonTable jsonTable) throws IOException {
代码语言:javascript
复制
	JSONArray ja = (JSONArray) JSON.parse(read(jsonTable.getData()),Feature.OrderedField);
代码语言:javascript
复制
	StringBuilder sb = new StringBuilder();
代码语言:javascript
复制
	try {
代码语言:javascript
复制
		sb.append("<br />\n");
代码语言:javascript
复制
		sb.append("<table border=\"1\" style=\"border-collapse:collapse;font-size:14px\">\n");
代码语言:javascript
复制
		sb.append("<caption align = \"left\">");
代码语言:javascript
复制
		sb.append(jsonTable.getTitle());
代码语言:javascript
复制
		sb.append("</caption>\n");
代码语言:javascript
复制
		JSONObject jsonFirst = (JSONObject) ja.get(0);
代码语言:javascript
复制
		sb.append("<tr>\n");
代码语言:javascript
复制
		for(String key : jsonFirst.keySet()){
代码语言:javascript
复制
			sb.append("<td>");
代码语言:javascript
复制
			sb.append(jsonFirst.get(key));
代码语言:javascript
复制
			sb.append("</td>\n");
代码语言:javascript
复制
		}
代码语言:javascript
复制
		sb.append("</tr>\n");
代码语言:javascript
复制
		ja.remove(0);
代码语言:javascript
复制
		for (Object column : ja) {
代码语言:javascript
复制
			sb.append("<tr>\n");
代码语言:javascript
复制
			JSONObject json = (JSONObject) column;
代码语言:javascript
复制
			for(String key : jsonFirst.keySet()){
代码语言:javascript
复制
				sb.append("<td>");
代码语言:javascript
复制
				sb.append(json.get(key));
代码语言:javascript
复制
				sb.append("</td>\n");
代码语言:javascript
复制
			}
代码语言:javascript
复制
			sb.append("</tr>\n");
代码语言:javascript
复制
		}
代码语言:javascript
复制
		sb.append("</table>\n");
代码语言:javascript
复制
	} catch (Exception e) {
代码语言:javascript
复制
		e.printStackTrace();
代码语言:javascript
复制
	}
代码语言:javascript
复制
	return sb.toString();
代码语言:javascript
复制
}

}

代码语言:javascript
复制
MailService:

```java

package com.cff.springwork.mail.service;

import java.io.IOException;

import com.cff.springwork.mail.entity.MailMessage;

import com.cff.springwork.mail.entity.MailType;

public interface MailService {

代码语言:javascript
复制
void sendSimpleMail(String to, String subject, String content);
代码语言:javascript
复制
void sendHtmlMail(String to, String subject, String content);
代码语言:javascript
复制
void sendInlineResourceMail(String to, String subject, String content, String rscPath, String rscId);
代码语言:javascript
复制
public void setMailMessage(MailMessage mailMessage);
代码语言:javascript
复制
public void sendHtml(String content, MailType... mailTypes) throws IOException;

}

代码语言:javascript
复制
#### 多种邮件类型

我们可以定义MailType抽象类,以适应不同的邮件类型。

MailType:

```java

package com.cff.springwork.mail.entity;

public abstract class MailType {

代码语言:javascript
复制
public final static char TYPE_FILE ='F';
代码语言:javascript
复制
public final static char TYPE_ATTACH ='A';
代码语言:javascript
复制
public final static char TYPE_TEXT ='T';
代码语言:javascript
复制
public final static char TYPE_JSON ='J';
代码语言:javascript
复制
public abstract char getType();

}

代码语言:javascript
复制
InlineFile 是内嵌文件类型。

InlineFile :

```java

package com.cff.springwork.mail.entity;

public class InlineFile extends MailType{

代码语言:javascript
复制
private String filePath;
代码语言:javascript
复制
private String cid;
代码语言:javascript
复制
@Override
代码语言:javascript
复制
public char getType() {
代码语言:javascript
复制
	return MailType.TYPE_FILE;
代码语言:javascript
复制
}
代码语言:javascript
复制
public String getFilePath() {
代码语言:javascript
复制
	return filePath;
代码语言:javascript
复制
}
代码语言:javascript
复制
public void setFilePath(String filePath) {
代码语言:javascript
复制
	this.filePath = filePath;
代码语言:javascript
复制
}
代码语言:javascript
复制
public String getCid() {
代码语言:javascript
复制
	return cid;
代码语言:javascript
复制
}
代码语言:javascript
复制
public void setCid(String cid) {
代码语言:javascript
复制
	this.cid = cid;
代码语言:javascript
复制
}

}

代码语言:javascript
复制

详细完整代码,可以在Spring组件化构建中选择查看,并下载。

快速构建项目

Spring组件化构建

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-05-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Spring和Email整合详解
    • 官方主页
      • 概述
        • 开始搭建
          • 依赖Jar包
          • spring-mail.xml
        • 快速构建项目
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档