spring 增加邮件发送用例
This commit is contained in:
parent
a80afab862
commit
5f14d18da7
91
spring/spring-email-annotation/pom.xml
Normal file
91
spring/spring-email-annotation/pom.xml
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<groupId>com.heibaiying</groupId>
|
||||||
|
<artifactId>spring-email</artifactId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<source>8</source>
|
||||||
|
<target>8</target>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<spring-base-version>5.1.3.RELEASE</spring-base-version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework</groupId>
|
||||||
|
<artifactId>spring-context</artifactId>
|
||||||
|
<version>${spring-base-version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework</groupId>
|
||||||
|
<artifactId>spring-beans</artifactId>
|
||||||
|
<version>${spring-base-version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework</groupId>
|
||||||
|
<artifactId>spring-core</artifactId>
|
||||||
|
<version>${spring-base-version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework</groupId>
|
||||||
|
<artifactId>spring-web</artifactId>
|
||||||
|
<version>${spring-base-version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework</groupId>
|
||||||
|
<artifactId>spring-webmvc</artifactId>
|
||||||
|
<version>${spring-base-version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>javax.servlet</groupId>
|
||||||
|
<artifactId>javax.servlet-api</artifactId>
|
||||||
|
<version>4.0.1</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<!--邮件发送依赖包-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework</groupId>
|
||||||
|
<artifactId>spring-context-support</artifactId>
|
||||||
|
<version>${spring-base-version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>javax.mail</groupId>
|
||||||
|
<artifactId>mail</artifactId>
|
||||||
|
<version>1.4.7</version>
|
||||||
|
</dependency>
|
||||||
|
<!--测试相关依赖-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework</groupId>
|
||||||
|
<artifactId>spring-test</artifactId>
|
||||||
|
<version>5.1.3.RELEASE</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>junit</groupId>
|
||||||
|
<artifactId>junit</artifactId>
|
||||||
|
<version>4.12</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<!--模板引擎-->
|
||||||
|
<!--这里采用的是beetl,beetl性能很卓越并且功能也很全面 官方文档地址 <a href="http://ibeetl.com/guide/#beetl">-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.ibeetl</groupId>
|
||||||
|
<artifactId>beetl</artifactId>
|
||||||
|
<version>2.9.7</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</project>
|
@ -0,0 +1,43 @@
|
|||||||
|
package com.heibaiying.config;
|
||||||
|
|
||||||
|
import org.beetl.core.GroupTemplate;
|
||||||
|
import org.beetl.core.resource.ClasspathResourceLoader;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.ComponentScan;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.mail.javamail.JavaMailSenderImpl;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author : heibaiying
|
||||||
|
* @description :
|
||||||
|
*/
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
@ComponentScan(value = "com.heibaiying.email")
|
||||||
|
public class EmailConfig {
|
||||||
|
|
||||||
|
/***
|
||||||
|
* 在这里可以声明不同的邮件服务器主机,通常是SMTP主机,而具体的用户名和时授权码则建议在业务中从数据库查询
|
||||||
|
*/
|
||||||
|
@Bean(name = "qqMailSender")
|
||||||
|
JavaMailSenderImpl javaMailSender() {
|
||||||
|
JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
|
||||||
|
javaMailSender.setHost("smtp.qq.com");
|
||||||
|
javaMailSender.setPassword("587");
|
||||||
|
return javaMailSender;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***
|
||||||
|
* 配置模板引擎
|
||||||
|
*/
|
||||||
|
@Bean
|
||||||
|
GroupTemplate groupTemplate() throws IOException {
|
||||||
|
//指定加载模板资源的位置 指定在classpath:beetl下-
|
||||||
|
ClasspathResourceLoader loader = new ClasspathResourceLoader("beetl");
|
||||||
|
//beetl配置 这里采用默认的配置-
|
||||||
|
org.beetl.core.Configuration configuration = org.beetl.core.Configuration.defaultConfiguration();
|
||||||
|
return new GroupTemplate(loader, configuration);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,147 @@
|
|||||||
|
package com.heibaiying.email;
|
||||||
|
|
||||||
|
import org.beetl.core.GroupTemplate;
|
||||||
|
import org.beetl.core.Template;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.core.io.FileSystemResource;
|
||||||
|
import org.springframework.mail.MailException;
|
||||||
|
import org.springframework.mail.SimpleMailMessage;
|
||||||
|
import org.springframework.mail.javamail.JavaMailSenderImpl;
|
||||||
|
import org.springframework.mail.javamail.MimeMessageHelper;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import javax.mail.MessagingException;
|
||||||
|
import javax.mail.internet.MimeMessage;
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author : heibaiying
|
||||||
|
* @description :
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
public class SpringMail {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private JavaMailSenderImpl qqMailSender;
|
||||||
|
@Autowired
|
||||||
|
private GroupTemplate groupTemplate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发送简单邮件
|
||||||
|
* 在qq邮件发送的测试中,测试结果表明不管是简单邮件还是复杂邮件都必须指定发送用户,
|
||||||
|
* 且发送用户已经授权不然都会抛出异常: SMTPSendFailedException 501 mail from address must be same as authorization user
|
||||||
|
* qq 的授权码 可以在 设置/账户/POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 中开启服务后获取
|
||||||
|
*/
|
||||||
|
public void sendTextMessage(String from, String authWord, String to, String subject, String content) {
|
||||||
|
// 设置发送人邮箱和授权码
|
||||||
|
qqMailSender.setUsername(from);
|
||||||
|
qqMailSender.setPassword(authWord);
|
||||||
|
// 实例化消息对象
|
||||||
|
SimpleMailMessage msg = new SimpleMailMessage();
|
||||||
|
msg.setFrom(from);
|
||||||
|
msg.setTo(to);
|
||||||
|
msg.setSubject(subject);
|
||||||
|
msg.setText(content);
|
||||||
|
try {
|
||||||
|
// 发送消息
|
||||||
|
this.qqMailSender.send(msg);
|
||||||
|
System.out.println("发送邮件成功");
|
||||||
|
} catch (MailException ex) {
|
||||||
|
// 消息发送失败可以做对应的处理
|
||||||
|
System.err.println("发送邮件失败" + ex.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发送带附件的邮件
|
||||||
|
*/
|
||||||
|
public void sendEmailWithAttachments(String from, String authWord, String to,
|
||||||
|
String subject, String content, Map<String, File> files) {
|
||||||
|
try {
|
||||||
|
// 设置发送人邮箱和授权码
|
||||||
|
qqMailSender.setUsername(from);
|
||||||
|
qqMailSender.setPassword(authWord);
|
||||||
|
// 实例化消息对象
|
||||||
|
MimeMessage message = qqMailSender.createMimeMessage();
|
||||||
|
// 需要指定第二个参数为true 代表创建支持可选文本,内联元素和附件的多部分消息
|
||||||
|
MimeMessageHelper helper = new MimeMessageHelper(message, true, "utf-8");
|
||||||
|
helper.setFrom(from);
|
||||||
|
helper.setTo(to);
|
||||||
|
helper.setSubject(subject);
|
||||||
|
helper.setText(content);
|
||||||
|
// 传入附件
|
||||||
|
for (Map.Entry<String, File> entry : files.entrySet()) {
|
||||||
|
helper.addAttachment(entry.getKey(), entry.getValue());
|
||||||
|
}
|
||||||
|
// 发送消息
|
||||||
|
this.qqMailSender.send(message);
|
||||||
|
System.out.println("发送邮件成功");
|
||||||
|
} catch (MessagingException ex) {
|
||||||
|
// 消息发送失败可以做对应的处理
|
||||||
|
System.err.println("发送邮件失败" + ex.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发送带内嵌资源的邮件
|
||||||
|
*/
|
||||||
|
public void sendEmailWithInline(String from, String authWord, String to,
|
||||||
|
String subject, String content, File file) {
|
||||||
|
try {
|
||||||
|
// 设置发送人邮箱和授权码
|
||||||
|
qqMailSender.setUsername(from);
|
||||||
|
qqMailSender.setPassword(authWord);
|
||||||
|
// 实例化消息对象
|
||||||
|
MimeMessage message = qqMailSender.createMimeMessage();
|
||||||
|
// 需要指定第二个参数为true 代表创建支持可选文本,内联元素和附件的多部分消息
|
||||||
|
MimeMessageHelper helper = new MimeMessageHelper(message, true, "utf-8");
|
||||||
|
helper.setFrom(from);
|
||||||
|
helper.setTo(to);
|
||||||
|
helper.setSubject(subject);
|
||||||
|
// 使用true标志来指示包含的文本是HTML 固定格式资源前缀 cid:
|
||||||
|
helper.setText("<html><body><img src='cid:image'></body></html>", true);
|
||||||
|
// 需要先指定文本 再指定资源文件
|
||||||
|
FileSystemResource res = new FileSystemResource(file);
|
||||||
|
helper.addInline("image", res);
|
||||||
|
// 发送消息
|
||||||
|
this.qqMailSender.send(message);
|
||||||
|
System.out.println("发送邮件成功");
|
||||||
|
} catch (MessagingException ex) {
|
||||||
|
// 消息发送失败可以做对应的处理
|
||||||
|
System.err.println("发送邮件失败" + ex.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 使用模板邮件
|
||||||
|
*/
|
||||||
|
public void sendEmailByTemplate(String from, String authWord, String to,
|
||||||
|
String subject, String content) {
|
||||||
|
try {
|
||||||
|
Template t = groupTemplate.getTemplate("template.html");
|
||||||
|
t.binding("subject", subject);
|
||||||
|
t.binding("content", content);
|
||||||
|
String text = t.render();
|
||||||
|
// 设置发送人邮箱和授权码
|
||||||
|
qqMailSender.setUsername(from);
|
||||||
|
qqMailSender.setPassword(authWord);
|
||||||
|
// 实例化消息对象
|
||||||
|
MimeMessage message = qqMailSender.createMimeMessage();
|
||||||
|
// 指定 utf-8 防止乱码
|
||||||
|
MimeMessageHelper helper = new MimeMessageHelper(message, true, "utf-8");
|
||||||
|
helper.setFrom(from);
|
||||||
|
helper.setTo(to);
|
||||||
|
helper.setSubject(subject);
|
||||||
|
// 为true 时候 表示文本内容以 html 渲染
|
||||||
|
helper.setText(text, true);
|
||||||
|
this.qqMailSender.send(message);
|
||||||
|
System.out.println("发送邮件成功");
|
||||||
|
} catch (MessagingException ex) {
|
||||||
|
// 消息发送失败可以做对应的处理
|
||||||
|
System.err.println("发送邮件失败" + ex.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>邮件主题:<span style="color: chartreuse"> ${subject}</span></h1>
|
||||||
|
<h4 style="color: blueviolet">${content}</h4>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -0,0 +1,60 @@
|
|||||||
|
package com.heibaiying;
|
||||||
|
|
||||||
|
import com.heibaiying.config.EmailConfig;
|
||||||
|
import com.heibaiying.email.SpringMail;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.test.context.ContextConfiguration;
|
||||||
|
import org.springframework.test.context.junit4.SpringRunner;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author : heibaiying
|
||||||
|
* @description : 发送邮件测试类
|
||||||
|
*/
|
||||||
|
@RunWith(SpringRunner.class)
|
||||||
|
@ContextConfiguration(classes = EmailConfig.class)
|
||||||
|
public class SendEmail {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private SpringMail springMail;
|
||||||
|
|
||||||
|
// 发送方邮箱地址
|
||||||
|
private static final String from = "发送方邮箱地址@qq.com";
|
||||||
|
// 发送方邮箱地址对应的授权码
|
||||||
|
private static final String authWord = "授权码";
|
||||||
|
// 接收方邮箱地址
|
||||||
|
private static final String to = "接收方邮箱地址@qq.com";
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void sendMessage() {
|
||||||
|
|
||||||
|
springMail.sendTextMessage(from, authWord, to, "spring简单邮件", "Hello Spring Email!");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void sendComplexMessage() {
|
||||||
|
Map<String, File> fileMap = new HashMap<>();
|
||||||
|
fileMap.put("image1.jpg", new File("D:\\LearningNotes\\picture\\msm相关依赖.png"));
|
||||||
|
fileMap.put("image2.jpg", new File("D:\\LearningNotes\\picture\\RabbitMQ模型架构.png"));
|
||||||
|
springMail.sendEmailWithAttachments(from, authWord, to, "spring多附件邮件"
|
||||||
|
, "Hello Spring Email!", fileMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void sendEmailWithInline() {
|
||||||
|
springMail.sendEmailWithInline(from, authWord, to, "spring内嵌资源邮件"
|
||||||
|
, "Hello Spring Email!", new File("D:\\LearningNotes\\picture\\RabbitMQ模型架构.png"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void sendEmailByTemplate() {
|
||||||
|
springMail.sendEmailByTemplate(from, authWord, to,
|
||||||
|
"spring模板邮件", "Hello Spring Email!");
|
||||||
|
}
|
||||||
|
}
|
91
spring/spring-email/pom.xml
Normal file
91
spring/spring-email/pom.xml
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<groupId>com.heibaiying</groupId>
|
||||||
|
<artifactId>spring-email</artifactId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<source>8</source>
|
||||||
|
<target>8</target>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<spring-base-version>5.1.3.RELEASE</spring-base-version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework</groupId>
|
||||||
|
<artifactId>spring-context</artifactId>
|
||||||
|
<version>${spring-base-version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework</groupId>
|
||||||
|
<artifactId>spring-beans</artifactId>
|
||||||
|
<version>${spring-base-version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework</groupId>
|
||||||
|
<artifactId>spring-core</artifactId>
|
||||||
|
<version>${spring-base-version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework</groupId>
|
||||||
|
<artifactId>spring-web</artifactId>
|
||||||
|
<version>${spring-base-version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework</groupId>
|
||||||
|
<artifactId>spring-webmvc</artifactId>
|
||||||
|
<version>${spring-base-version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>javax.servlet</groupId>
|
||||||
|
<artifactId>javax.servlet-api</artifactId>
|
||||||
|
<version>4.0.1</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<!--邮件发送依赖包-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework</groupId>
|
||||||
|
<artifactId>spring-context-support</artifactId>
|
||||||
|
<version>${spring-base-version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>javax.mail</groupId>
|
||||||
|
<artifactId>mail</artifactId>
|
||||||
|
<version>1.4.7</version>
|
||||||
|
</dependency>
|
||||||
|
<!--测试相关依赖-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework</groupId>
|
||||||
|
<artifactId>spring-test</artifactId>
|
||||||
|
<version>5.1.3.RELEASE</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>junit</groupId>
|
||||||
|
<artifactId>junit</artifactId>
|
||||||
|
<version>4.12</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<!--模板引擎-->
|
||||||
|
<!--这里采用的是beetl,beetl性能很卓越并且功能也很全面 官方文档地址 <a href="http://ibeetl.com/guide/#beetl">-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.ibeetl</groupId>
|
||||||
|
<artifactId>beetl</artifactId>
|
||||||
|
<version>2.9.7</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</project>
|
@ -0,0 +1,147 @@
|
|||||||
|
package com.heibaiying.email;
|
||||||
|
|
||||||
|
import org.beetl.core.GroupTemplate;
|
||||||
|
import org.beetl.core.Template;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.core.io.FileSystemResource;
|
||||||
|
import org.springframework.mail.MailException;
|
||||||
|
import org.springframework.mail.SimpleMailMessage;
|
||||||
|
import org.springframework.mail.javamail.JavaMailSenderImpl;
|
||||||
|
import org.springframework.mail.javamail.MimeMessageHelper;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import javax.mail.MessagingException;
|
||||||
|
import javax.mail.internet.MimeMessage;
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author : heibaiying
|
||||||
|
* @description :
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
public class SpringMail {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private JavaMailSenderImpl qqMailSender;
|
||||||
|
@Autowired
|
||||||
|
private GroupTemplate groupTemplate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发送简单邮件
|
||||||
|
* 在qq邮件发送的测试中,测试结果表明不管是简单邮件还是复杂邮件都必须指定发送用户,
|
||||||
|
* 且发送用户已经授权不然都会抛出异常: SMTPSendFailedException 501 mail from address must be same as authorization user
|
||||||
|
* qq 的授权码 可以在 设置/账户/POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 中开启服务后获取
|
||||||
|
*/
|
||||||
|
public void sendTextMessage(String from, String authWord, String to, String subject, String content) {
|
||||||
|
// 设置发送人邮箱和授权码
|
||||||
|
qqMailSender.setUsername(from);
|
||||||
|
qqMailSender.setPassword(authWord);
|
||||||
|
// 实例化消息对象
|
||||||
|
SimpleMailMessage msg = new SimpleMailMessage();
|
||||||
|
msg.setFrom(from);
|
||||||
|
msg.setTo(to);
|
||||||
|
msg.setSubject(subject);
|
||||||
|
msg.setText(content);
|
||||||
|
try {
|
||||||
|
// 发送消息
|
||||||
|
this.qqMailSender.send(msg);
|
||||||
|
System.out.println("发送邮件成功");
|
||||||
|
} catch (MailException ex) {
|
||||||
|
// 消息发送失败可以做对应的处理
|
||||||
|
System.err.println("发送邮件失败" + ex.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发送带附件的邮件
|
||||||
|
*/
|
||||||
|
public void sendEmailWithAttachments(String from, String authWord, String to,
|
||||||
|
String subject, String content, Map<String, File> files) {
|
||||||
|
try {
|
||||||
|
// 设置发送人邮箱和授权码
|
||||||
|
qqMailSender.setUsername(from);
|
||||||
|
qqMailSender.setPassword(authWord);
|
||||||
|
// 实例化消息对象
|
||||||
|
MimeMessage message = qqMailSender.createMimeMessage();
|
||||||
|
// 需要指定第二个参数为true 代表创建支持可选文本,内联元素和附件的多部分消息
|
||||||
|
MimeMessageHelper helper = new MimeMessageHelper(message, true, "utf-8");
|
||||||
|
helper.setFrom(from);
|
||||||
|
helper.setTo(to);
|
||||||
|
helper.setSubject(subject);
|
||||||
|
helper.setText(content);
|
||||||
|
// 传入附件
|
||||||
|
for (Map.Entry<String, File> entry : files.entrySet()) {
|
||||||
|
helper.addAttachment(entry.getKey(), entry.getValue());
|
||||||
|
}
|
||||||
|
// 发送消息
|
||||||
|
this.qqMailSender.send(message);
|
||||||
|
System.out.println("发送邮件成功");
|
||||||
|
} catch (MessagingException ex) {
|
||||||
|
// 消息发送失败可以做对应的处理
|
||||||
|
System.err.println("发送邮件失败" + ex.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发送带内嵌资源的邮件
|
||||||
|
*/
|
||||||
|
public void sendEmailWithInline(String from, String authWord, String to,
|
||||||
|
String subject, String content, File file) {
|
||||||
|
try {
|
||||||
|
// 设置发送人邮箱和授权码
|
||||||
|
qqMailSender.setUsername(from);
|
||||||
|
qqMailSender.setPassword(authWord);
|
||||||
|
// 实例化消息对象
|
||||||
|
MimeMessage message = qqMailSender.createMimeMessage();
|
||||||
|
// 需要指定第二个参数为true 代表创建支持可选文本,内联元素和附件的多部分消息
|
||||||
|
MimeMessageHelper helper = new MimeMessageHelper(message, true, "utf-8");
|
||||||
|
helper.setFrom(from);
|
||||||
|
helper.setTo(to);
|
||||||
|
helper.setSubject(subject);
|
||||||
|
// 使用true标志来指示包含的文本是HTML 固定格式资源前缀 cid:
|
||||||
|
helper.setText("<html><body><img src='cid:image'></body></html>", true);
|
||||||
|
// 需要先指定文本 再指定资源文件
|
||||||
|
FileSystemResource res = new FileSystemResource(file);
|
||||||
|
helper.addInline("image", res);
|
||||||
|
// 发送消息
|
||||||
|
this.qqMailSender.send(message);
|
||||||
|
System.out.println("发送邮件成功");
|
||||||
|
} catch (MessagingException ex) {
|
||||||
|
// 消息发送失败可以做对应的处理
|
||||||
|
System.err.println("发送邮件失败" + ex.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 使用模板邮件
|
||||||
|
*/
|
||||||
|
public void sendEmailByTemplate(String from, String authWord, String to,
|
||||||
|
String subject, String content) {
|
||||||
|
try {
|
||||||
|
Template t = groupTemplate.getTemplate("template.html");
|
||||||
|
t.binding("subject", subject);
|
||||||
|
t.binding("content", content);
|
||||||
|
String text = t.render();
|
||||||
|
// 设置发送人邮箱和授权码
|
||||||
|
qqMailSender.setUsername(from);
|
||||||
|
qqMailSender.setPassword(authWord);
|
||||||
|
// 实例化消息对象
|
||||||
|
MimeMessage message = qqMailSender.createMimeMessage();
|
||||||
|
// 指定 utf-8 防止乱码
|
||||||
|
MimeMessageHelper helper = new MimeMessageHelper(message, true, "utf-8");
|
||||||
|
helper.setFrom(from);
|
||||||
|
helper.setTo(to);
|
||||||
|
helper.setSubject(subject);
|
||||||
|
// 为true 时候 表示文本内容以 html 渲染
|
||||||
|
helper.setText(text, true);
|
||||||
|
this.qqMailSender.send(message);
|
||||||
|
System.out.println("发送邮件成功");
|
||||||
|
} catch (MessagingException ex) {
|
||||||
|
// 消息发送失败可以做对应的处理
|
||||||
|
System.err.println("发送邮件失败" + ex.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
10
spring/spring-email/src/main/resources/beetl/template.html
Normal file
10
spring/spring-email/src/main/resources/beetl/template.html
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>邮件主题:<span style="color: chartreuse"> ${subject}</span></h1>
|
||||||
|
<h4 style="color: blueviolet">${content}</h4>
|
||||||
|
</body>
|
||||||
|
</html>
|
32
spring/spring-email/src/main/resources/springApplication.xml
Normal file
32
spring/spring-email/src/main/resources/springApplication.xml
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
<?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.xsd
|
||||||
|
http://www.springframework.org/schema/context
|
||||||
|
http://www.springframework.org/schema/context/spring-context-4.1.xsd">
|
||||||
|
|
||||||
|
<!-- 开启注解包扫描-->
|
||||||
|
<context:component-scan base-package="com.heibaiying.email"/>
|
||||||
|
|
||||||
|
<!--在这里可以声明不同的邮件服务器主机,通常是SMTP主机,而具体的用户名和时授权码则建议在业务中从数据库查询-->
|
||||||
|
<bean id="qqMailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
|
||||||
|
<!--qq 邮箱配置 <a href="https://service.mail.qq.com/cgi-bin/help?subtype=1&no=167&id=28"> -->
|
||||||
|
<property name="host" value="smtp.qq.com"/>
|
||||||
|
<property name="port" value="587"/>
|
||||||
|
</bean>
|
||||||
|
|
||||||
|
<!--配置模板引擎-->
|
||||||
|
<bean id="resourceLoader" class="org.beetl.core.resource.ClasspathResourceLoader">
|
||||||
|
<!--指定加载模板资源的位置 指定在classpath:beetl下-->
|
||||||
|
<constructor-arg name="root" value="beetl"/>
|
||||||
|
</bean>
|
||||||
|
<!--beetl 配置 这里采用默认的配置-->
|
||||||
|
<bean id="configuration" class="org.beetl.core.Configuration" init-method="defaultConfiguration"/>
|
||||||
|
<bean id="groupTemplate" class="org.beetl.core.GroupTemplate">
|
||||||
|
<constructor-arg name="loader" ref="resourceLoader"/>
|
||||||
|
<constructor-arg name="conf" ref="configuration"/>
|
||||||
|
</bean>
|
||||||
|
|
||||||
|
</beans>
|
@ -0,0 +1,59 @@
|
|||||||
|
package com.heibaiying;
|
||||||
|
|
||||||
|
import com.heibaiying.email.SpringMail;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.test.context.ContextConfiguration;
|
||||||
|
import org.springframework.test.context.junit4.SpringRunner;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author : heibaiying
|
||||||
|
* @description : 发送邮件测试类
|
||||||
|
*/
|
||||||
|
@RunWith(SpringRunner.class)
|
||||||
|
@ContextConfiguration({"classpath:springApplication.xml"})
|
||||||
|
public class SendEmail {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private SpringMail springMail;
|
||||||
|
|
||||||
|
// 发送方邮箱地址
|
||||||
|
private static final String from = "发送方邮箱地址@qq.com";
|
||||||
|
// 发送方邮箱地址对应的授权码
|
||||||
|
private static final String authWord = "授权码";
|
||||||
|
// 接收方邮箱地址
|
||||||
|
private static final String to = "接收方邮箱地址@qq.com";
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void sendMessage() {
|
||||||
|
|
||||||
|
springMail.sendTextMessage(from, authWord, to, "spring简单邮件", "Hello Spring Email!");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void sendComplexMessage() {
|
||||||
|
Map<String, File> fileMap = new HashMap<>();
|
||||||
|
fileMap.put("image1.jpg", new File("D:\\LearningNotes\\picture\\msm相关依赖.png"));
|
||||||
|
fileMap.put("image2.jpg", new File("D:\\LearningNotes\\picture\\RabbitMQ模型架构.png"));
|
||||||
|
springMail.sendEmailWithAttachments(from, authWord, to, "spring多附件邮件"
|
||||||
|
, "Hello Spring Email!", fileMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void sendEmailWithInline() {
|
||||||
|
springMail.sendEmailWithInline(from, authWord, to, "spring内嵌资源邮件"
|
||||||
|
, "Hello Spring Email!", new File("D:\\LearningNotes\\picture\\RabbitMQ模型架构.png"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void sendEmailByTemplate() {
|
||||||
|
springMail.sendEmailByTemplate(from, authWord, to,
|
||||||
|
"spring模板邮件", "Hello Spring Email!");
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user