介绍
邮件分类
- 文本邮件 不解析内容中的html标签
- html邮件 会解析内容中的html标签,就是说可以包含图片、视频等内容
- 附件邮件 文本邮件、html邮件都可携带附件
获取授权码
以qq邮箱为例:
设置 -> 账户 -> POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 -> IMAP/SMTP服务 -> 开启
发送邮件
依赖
创建时勾选 I/O -> Java Mail Sender,也可以手动添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
application.properties
###邮箱配置###
#邮件服务器。qq是smtp.qq.com,163是smtp.163.com,阿里云是smtp.aliyun.com
spring.mail.host=smtp.qq.com
#授权邮箱
spring.mail.username=xxxxxxx@qq.com
#授权码
spring.mail.password=xxxxxxxxxxxx
#自定义的配置项,发件人邮箱。发件人邮箱必须和授权邮箱相同
spring.mail.from=xxxxxxxxx@qq.com
对应部分换为自己的
接口
/**
* @Description: 发送邮件的接口
*/
public interface EmailService {
/**
* 发送文本邮件
* @param to 收件人
* @param subject 主题
* @param content 内容
*/
void sendSimpleMail(String to, String subject, String content);
/**
* 发送HTML邮件
* @param to 收件人
* @param subject 主题
* @param content 内容
*/
public void sendHtmlMail(String to, String subject, String content);
/**
* 发送带附件的邮件
* @param to 收件人
* @param subject 主题
* @param content 内容
* @param filePath 附件
*/
public void sendAttachmentsHtmlMail(String to, String subject, String content, String filePath);
}
实现类
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.Service;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;
@Service
public class EmailServiceImpl implements EmailService {
@Autowired
private JavaMailSender mailSender;
@Value("${spring.mail.from}") //注入配置文件中的发件人
private String from;
/**
* 发送文本邮件
* @param to 收件人
* @param subject 主题
* @param content 内容
*/
@Override
public void sendSimpleMail(String to, String subject, String content) {
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(from);
message.setTo(to);
message.setSubject(subject);
message.setText(content);
mailSender.send(message);
}
/**
* 发送html邮件
* @param to 收件人
* @param subject 主题
* @param content 内容
*/
@Override
public void sendHtmlMail(String to, String subject, String content) {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper messageHelper;
try {
messageHelper = new MimeMessageHelper(message, true);
messageHelper.setFrom(from);
messageHelper.setTo(to);
message.setSubject(subject);
messageHelper.setText(content, true); //第二个指定是否是html邮件,设置为false则不解析里面的html标签
mailSender.send(message);
} catch (MessagingException e) {
e.printStackTrace();
}
}
/**
* 发送带附件的html邮件
* @param to 收件人
* @param subject 主题
* @param content 内容
* @param filePath 附件路径
*/
@Override
public void sendAttachmentsHtmlMail(String to, String subject, String content, String filePath) {
MimeMessage message = mailSender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true); //第二个参数指定是否是html邮件,设置为false则不解析里面的html标签
FileSystemResource file = new FileSystemResource(new File(filePath));
String fileName = filePath.substring(filePath.lastIndexOf(File.separator)+1); //注意要+1,不+1会报错:StringIndexOutOfBoundsException: String index out of range: -1
helper.addAttachment(fileName, file);
mailSender.send(message);
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
单元测试
@RunWith(SpringRunner.class)
@SpringBootTest
public class EmailServiceTest {
@Autowired
private EmailService emailService;
// 收件人邮箱
private String toEmail = "xxxxxxx@qq.com";
// html邮件的内容
private String htmlContent = "<!DOCTYPE html>\n" +
"<html lang=\"en\" xmlns:th=\"http://www.w3.org/1999/xhtml\">\n" +
"<head>\n" +
" <meta charset=\"UTF-8\">\n" +
" <title>Title</title>\n" +
"</head>\n" +
"<body>\n" +
"\n" +
"<h1>这是一封html邮件</h1>\n" +
"<img src=\"http://t8.baidu.com/it/u=2247852322,986532796&fm=79&app=86&size=h300&n=0&g=4n&f=jpeg\" />\n" +
"\n" +
"</body>\n" +
"</html>";
/**
* 发送文本邮件
*/
@Test
public void sendSimpleMailTest() {
emailService.sendSimpleMail(toEmail,"文本邮件测试","这是一封文本邮件");
}
/**
* 发送html邮件
*/
@Test
public void sendHtmlEmailTest(){
emailService.sendHtmlMail(toEmail,"html邮件测试",htmlContent);
}
/**
* 发送带附件的html邮件
*/
@Test
public void sendAttachmentsHtmlMailTest(){
emailService.sendAttachmentsHtmlMail(toEmail,"带附件的html邮件测试",htmlContent,"D:/hello.txt");
}
}
注意修改收件人邮箱、附件路径
注意点
- html邮件,内容中的路径,比如<img />的src,要使用远程路径
- 附件路径,使用本地路径,是把本地文件(附件)上传到邮件服务器,收件人从邮件服务器上下载附件