文章目录
1. 邮件发送和接收的全过程
2. 邮件客户端
常见的邮件客户端:FoxMail、Outlook、Exchange
Exchange是是微软开发的收费邮件客户端
3. 邮件协议
SMTP是管发送邮件的,POP3和IMAP是管接收邮件的
- SMTP:Simple Mail Transfer Protocol,即简单邮件传输协议
作用:发送邮件的协议,邮件发送方的邮件服务器发送邮件到接收方邮件服务器【推送邮件到目标服务器】 - POP3:Post Office Protocol 3
作用:接受邮件的协议,POP3允许用户将服务器上的邮件下载到本地计算机上,邮件服务器和客户端是单向通信的,客户端的操作不会反馈到邮件服务器上,比如删除邮件 - IMAP:Internet Mail Access Protocol,即交互式邮件存取协议
作用:接受邮件的协议 , IMAP收取的邮件依旧保存在邮箱服务器上,同时客户端邮箱的操作会反馈到邮箱服务器上,邮件服务器和客户端是双向通信的
4.常见术语
(1)TO 接收邮件的对象,表示期望得到该收件人的响应。
(2)CC(Carbon Copy)副本抄送。表示没有期待对邮dao件做出回复。
(3)BCC(Blind Carbon Copy)密件抄送。在群发邮件时,收信人彼此不认识,为了保护收信人的隐私,可以在地址栏To中填上自己,然后将所有收信人都填在BCC。
基于某种原因或出于某种考虑,你不希望收信人知道你把这封邮件还发送给了另外的人,则可将这位“Secret Person” 填写在「BCC」这一栏。比如说A给下属发通知的时候,就可以给与自己同级的B、C抄送一份,为了让其他部门了解自己部门的安排,这是经常有的事情。值得一提的是,如果 BCC 的的人回了邮件,就会让其他人看到了。所以如无特别需要,其实会更加建议大家使用『Forward(转发)』。
5.邮件端口问题
阿里云服务器、腾讯云服务器默认都禁用了 25 端口,所以通过25端口连接不上邮件服务器。官方建议使用 465 端口,而 456 端口是 SSL 协议的,所以不仅要换端口,还需要进行 SSL 协议替换。
6.SpringBoot整合JavaMail
官方api:https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/mail/javamail
6.1 导入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.3.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
<version>2.3.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>2.3.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
</dependencies>
6.2 配置文件
server:
port: 9000
spring:
mail:
host: smtp.exmail.qq.com #发送邮件服务器
port: 465 #发送邮件ssl端口
username: hello@qq.com #发送邮箱
password: 123456 #注意这里不是邮箱密码,而是SMTP授权密码,只是可能是密码
default-encoding: utf-8
protocol: smtp
properties:
mail:
smtp:
ssl:
enable: true #启用ssl
6.3 java实现
常见功能:
(1)发送文本邮件 SimpleMailMessage
(2)发送邮件支持单独发、群发
(3)发送邮件支持网页,并包括多个静态资源
(4)发送邮件支持多个附件
@Service
public class MailServiceImpl implements MailService {
@Autowired
private JavaMailSender mailSender;
@Value("${spring.mail.username}")
private String from;
/**
* @param to 收件人
* @param subject 主题
* @param content 内容
* @description 发送文本邮件
*/
@Override
public void sendSimpleMail(String subject, String content, String... to) {
SimpleMailMessage message = new SimpleMailMessage();
//发件人
message.setFrom(from);
//收件人
message.setTo(to);
//主题
message.setSubject(subject);
//内容
message.setText(content);
mailSender.send(message);
}
/**
* @param to 收件人
* @param subject 主题
* @param content 内容
* @description 发送HTML邮件,含网页内嵌入静态资源,并在邮件中添加附件
*/
@Override
public void sendHtmlMail(String subject, String content, String... to) throws Exception {
MimeMessage message = mailSender.createMimeMessage();
try {
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(message, true);
//设置邮件发送人
mimeMessageHelper.setFrom(from);
//设置收件人 支持单发和群发
mimeMessageHelper.setTo(to);
//设置密送人员
mimeMessageHelper.setBcc("710835500@qq.com");
//指定邮件定时发送时间
mimeMessageHelper.setSentDate(new Date());
mimeMessageHelper.setSubject(subject);
/*
* 第1个参数:html内容
* 第2个参数:标识内容是否是html
*/
mimeMessageHelper.setText(content, true);
/*
* 邮件内容中添加图片等静态资源,支持单个或多个静态资源
* 第1个参数:静态资源的唯一标识,不要用中文,否则邮件无法识别
* 第2个参数:静态自由路径
*/
mimeMessageHelper.addInline("picture1", new ClassPathResource("pic86759766457.PNG"));
mimeMessageHelper.addInline("picture2", new ClassPathResource("pic86759766457.PNG"));
//添加附件,单附件和多附件都支持 参数1:附件名称 参数2:附件文件路径
mimeMessageHelper.addAttachment("附件1.png", new ClassPathResource("pic86759766457.PNG"));
mimeMessageHelper.addAttachment("附件2.png", new ClassPathResource("pic86759766457.PNG"));
mailSender.send(message);
} catch (MessagingException e) {
throw new Exception("邮件发送失败");
}
}
@Override
public void sendStreamAttachmentsMail(String subject, String content, byte[] byteArray, String... to) throws MessagingException {
MimeMessage mimeMessage = mailSender.createMimeMessage();
mimeMessage.setFrom(from);
mimeMessage.setRecipients(Message.RecipientType.TO, Arrays.toString(to));
mimeMessage.setSubject(subject);
//创建多组件消息,即消息内容
MimeMultipart mimeMultipart = new MimeMultipart("mixed");
//(1)创建消息的文本内容
MimeBodyPart textBody = new MimeBodyPart();
textBody.setText("我是文本");
//(2)创建消息的流附件部分
MimeBodyPart attachment = new MimeBodyPart();
//如果是excel文件,则类型用:application/excel
DataSource dataSource = new ByteArrayDataSource(byteArray, "application/octet-stream");
DataHandler dataHandler = new DataHandler(dataSource);
attachment.setDataHandler(dataHandler);
attachment.setFileName("excel附件.xlsx");
//(3)添加多组件消息的文本部分、附件部分
mimeMultipart.addBodyPart(textBody);
mimeMultipart.addBodyPart(attachment);
//(4)添加消息内容
mimeMessage.setContent(mimeMultipart);
mailSender.send(mimeMessage);
}
}
测试代码
@SpringBootTest(classes = {MailApplication.class})
@RunWith(SpringRunner.class)
public class Demo {
@Autowired
private MailService mailService;
@Test
public void test1() {
mailService.sendSimpleMail("测试", "测试邮件哦", "helo@foxmail.com");
}
@Test
public void test2() throws Exception {
/*
* 发送邮件中cid表示图片的唯一标识
*/
mailService.sendHtmlMail("测试网页附件", "<html><body><h1>图片邮件</h1>" +
"<img src='cid:picture'/>" +
"</body></html>", "newway2020@foxmail.com");
}
}
6.4网页内嵌静态资源
6.5 Excel表格以流的形式通过发送
//excel表单转化为byte数组
Workbook workbook = ExcelExportUtil.exportExcel(template, map);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
workbook.write(byteArrayOutputStream);
byte[] bytes = byteArrayOutputStream.toByteArray();
//将byte数组中存储的excel表格添加到邮件的附件中
MimeBodyPart attachment = new MimeBodyPart();
//如果是二进制文件,则类型用:application/octet-stream
DataSource dataSource = new ByteArrayDataSource(byteArray, "application/excel");
DataHandler dataHandler = new DataHandler(dataSource);
attachment.setDataHandler(dataHandler);
attachment.setFileName("excel附件.xlsx");
7.常见异常
原因:配置文件中邮件端口使用了465 SSL 端口,但没有启用ssl设置
465端口(SMTPS):465端口是为SMTPS(SMTP-over-SSL)协议服务开放的,这是SMTP协议基于SSL安全协议之上的一种变种协议,它继承了SSL安全协议的非对称加密的高度安全可靠性,可防止邮件泄露。SMTPS和SMTP协议一样,也是用来发送邮件的,只是更安全些,防止邮件被黑客截取泄露,还可实现邮件发送者抗抵赖功能。防止发送者发送之后删除已发邮件,拒不承认发送过这样一份邮件。
原因:配置文件中用于授权的邮箱与代码中发送邮件的邮箱地址不一致就会报错