Spring框架发送电子邮件
前言:
Spring框架提供了一个有用的实用程序库,用于发送电子邮件,使您不受底层邮件系统的限制,并负责代表客户端进行低级资源处理。(就是对
JavaMail库
进行了封装)为了使用Spring Framework的电子邮件库,以下JAR必须位于应用程序的类路径中:
直接使用Java Mail发送邮件
获取
![GP2jpj.png](https://s1.ax1x.com/2020/03/27/GP2jpj.png)
1. 引入依赖
<!--javax.mail依赖-->
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
<!-- Spring依赖-start-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<!-- spring依赖-end -->
1.1 编写配置文件mail.properties
#邮箱服务器
mail.host=smtp.qq.com
#端口
mail.port=465
#邮箱账号
mail.username=1040728129@qq.com
# 邮箱密码(qq邮箱使用的是授权码)
mail.password=自己
#发送协议 默认就是smtp
mail.protocol=smtp
#日记输出
mail.debug=true
mail.default-encoding=UTF-8
#认证
mail.smtp.auth=true
#启用STARTTLS,是一种明文通信协议的扩展,能够让明文的通信连线直接成为加密连线(使用SSL或TLS加密)
mail.smtp.starttls.enable=true
mail.smtp.starttls.required=true
#启用ssl
mail.smtp.ssl.enable=true
#引发成功报告异常
#mail.smtp.reportsuccess=true
#收邮件协议 hdnueendhjnxbegg
mail.store.protocol=pop3
#某些默认超时值是无限的,您可能需要更改该值,以避免线程被无响应的邮件服务器阻塞
mail.smtp.connectiontimeout=5000
mail.smtp.timeout=3000
mail.smtp.writetimeout=5000
1.2 注册MailSender
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.mail.MailSender;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import zhihao.sendmail.SendMail;
import zhihao.sendmail.impl.SendMailImpl;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
* @Author: zhihao
* @Date: 2020/3/26 17:43
* @Description: 使用配置类方式代替xml
* @Versions 1.0
**/
@Configuration
public class MailConfig {
/** 属性集 */
public static Properties properties;
/** 加载配置文件到属性集 */
static {
ResourceLoader loader = new DefaultResourceLoader();
Resource resource = loader.getResource(ResourceLoader.CLASSPATH_URL_PREFIX + "mail.properties");
properties = new Properties();
InputStream inputStream = null;
try {
inputStream = resource.getInputStream();
properties.load(inputStream);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 注册发件人
*
* @return org.springframework.mail.MailSender
* @author: zhihao
* @date: 2020/3/27
*/
@Bean
public MailSender javaMailSender() {
JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
javaMailSender.setHost(properties.getProperty("mail.host"));
javaMailSender.setPort(Integer.valueOf(properties.getProperty("mail.port")));
javaMailSender.setUsername(properties.getProperty("mail.username"));
javaMailSender.setPassword(properties.getProperty("mail.password"));
javaMailSender.setProtocol(properties.getProperty("mail.protocol"));
javaMailSender.setDefaultEncoding(properties.getProperty("mail.default-encoding"));
javaMailSender.setJavaMailProperties(properties);
return javaMailSender;
}
}
1.3 发送普通文本邮件
@Autowired
private JavaMailSender javaMailSender;
/**
* 发送普通文本邮件
*
* @param from 发送者邮箱
* @param to 接收者邮箱
* @param subject 邮件主题
* @param content 邮件内容
* @return boolean
* @author: zhihao
* @date: 2020/3/27
*/
@Override
public boolean sendTextMail(String from, String to, String subject, String content) {
SimpleMailMessage mailMessage = new SimpleMailMessage();
mailMessage.setFrom(from);
mailMessage.setTo(to);
mailMessage.setSubject(subject);
mailMessage.setText(content);
//发送
try {
javaMailSender.send(mailMessage);
return true;
} catch (MailException e) {
e.printStackTrace();
}
return false;
}
@Test
public void sendText(){
String from = MailConfig.properties.getProperty("mail.username");
sendMail.sendTextMail(from, from, "这是个普通邮件", "测试发送");
}
1.4 发送带HTML
格式的邮件
@Autowired
private JavaMailSender javaMailSender;
/**
* 发送带Html文本邮件
*
* @param from 发送者邮箱
* @param to 接收者邮箱
* @param subject 邮件主题
* @param content 带Html文本邮件内容
* @return boolean
* @author: zhihao
* @date: 2020/3/27
*/
@Override
public boolean sendHtmlMail(String from, String to, String subject, String content) {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
try {
//传递对象进行构建发送html文本格式
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content,true);
javaMailSender.send(mimeMessage);
return true;
} catch (MessagingException e) {
e.printStackTrace();
}
return false;
}
@Test
public void sendHtml(){
String from = MailConfig.properties.getProperty("mail.username");
String html = "<html><body><img src='https://s1.ax1x.com/2020/03/16/8JHaM4.jpg'/>这个是个图片</body></html>";
sendMail.sendHtmlMail(from, from, "Html格式", html);
}
1.5 发送带附件的邮件
@Autowired
private JavaMailSender javaMailSender;
/**
* 发送带附件文本邮件
*
* @param from 发送者邮箱
* @param to 接收者邮箱
* @param subject 邮件主题
* @param content 邮件文本内容,例如xx.jpg || xx.xlsx || xx.后缀名
* @param AnnexName 附件名
* @param inputStream 文件流
* @return boolean
* @author: zhihao
* @date: 2020/3/27
*/
@Override
public boolean sendAnnexMail(String from, String to, String subject, String content, String AnnexName, InputStream inputStream) {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
try {
//传递对象进行构建发送附件文本格式
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content);
ByteArrayDataSource dataSource = new ByteArrayDataSource(inputStream,"application/octet-stream");
helper.addAttachment(AnnexName, dataSource);
javaMailSender.send(mimeMessage);
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
@Test
public void sendAnnex() throws Exception {
String from = MailConfig.properties.getProperty("mail.username");
FileInputStream inputStream = new FileInputStream(new File("C:\\Users\\Administrator\\Desktop\\hhhh.xlsx"));
// sendMail.sendAnnexMail(from, from, "这是个普通邮件", "图片邮件","我的.jpg",inputStream);
sendMail.sendAnnexMail(from, from, "这是个附件邮件", "图片邮件","我的.xlsx",inputStream);
}
1.6 使用HTML模板发送邮件
本质上还是使用发送HTML格式的邮件, 只是将页面模板填充数据,并解析成页面字符串发送。
/**
* 发送模板,本质上还是发送HTML邮件,只不过多了绑定变量的过程。
*
* @param from 发送者邮箱
* @param to 接收者邮箱
* @param subject 邮件主题
* @param content 模板Html文本内容
* @return boolean
* @author: zhihao
* @date: 2020/3/27
*/
@Override
public boolean sendHtmlTemplateMail(String from, String to, String subject, String content) {
//调用之前发送HTML格式
return this.sendHtmlMail(from, to, subject, content);
}
1.6.1 引入依赖
<!-- 页面模板 -->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf</artifactId>
<version>3.0.11.RELEASE</version>
</dependency>
1.6.2 创建HTML页面模板
emailTemplate.html
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>模板</title>
</head>
<body>
使用thymeleaf模板语法
你的偶像:<h1 style="color: red" th:text="${name}"></h1>
</body>
1.6.3 创建模板引擎
步骤:
- 创建模板引擎:
TemplateEngine
- 设置模板解析器
setTemplateResolver(template)
- 创建模板解析器并设置文件的前缀,后缀,模式
- 使用
TemplateEngine
调用process()
处理得到模板字符串
@Test
public void sendHtmlTemplateMail() throws Exception {
String from = MailConfig.properties.getProperty("mail.username");
Context context = new Context();
context.setVariable("name", "张韶涵");
//创建模板
TemplateEngine templateEngine = new TemplateEngine();
//设置模板解析器
FileTemplateResolver templateResolver = new FileTemplateResolver();
templateResolver.setTemplateMode("HTML");
//文件夹前缀
templateResolver.setPrefix("src/main/resources/");
//后缀
templateResolver.setSuffix(".html");
templateEngine.setTemplateResolver(templateResolver);
String process = templateEngine.process("emailTemplate", context);
sendMail.sendHtmlTemplateMail(from, from, "html模板邮件",process );
}
扩展资料:
项目代码:
mail属性配置说明
发送带图片的邮件:
发送带静态资源的邮件
发送带静态资源的邮件其实就是在发送HTML邮件的基础上嵌入静态资源(比如图片),嵌入静态资源的过程和传入附件类似,
helper.addInline("img", file);
中的img和图片标签里cid后的名称相对应。
![GPwcGV.png](https://s1.ax1x.com/2020/03/27/GPwcGV.png)
收邮件操作:
@Autowired
private JavaMailSenderImpl javaMailSender;
@Test
public void incomingMail() throws Exception {
//1.获取会话
Session session = javaMailSender.getSession();
//2.通过会话获取Store
Store store = session.getStore();
//3.连上邮件服务器 账号----密码(QQ邮箱使用授权码)
store.connect(javaMailSender.getUsername(),MailConfig.properties.getProperty("mail.password"));
//4.获取收件箱的邮件夹
Folder folder = store.getFolder("inbox");
//5.打开只读邮件夹,还有很多操作
folder.open(Folder.READ_ONLY);
//6.获取邮件
Message[] messages = folder.getMessages();
for (Message message : messages) {
String subject = message.getSubject();
Object content = message.getContent();
System.out.println("主题"+subject);
System.out.println("内容"+content);
}
folder.close();
store.close();
}
参考了:https://www.jianshu.com/p/0d1fc72d3414
1