邮件是怎么发送的?
在现在生活和工作中,我们几乎离不开电子邮箱。那么电子邮件到底是怎么工作的呢?
电子邮件,又经常被称为E-mail/邮件, 其英文的全称是Electronic mail。当我们发送电子邮件时,这封邮件是由邮件发送服务器(任何一个都可以)发出,并根据收信人的地址判断对方的邮件接收服务器而将这封信发送到该服务器上,收信人要收取邮件也只能访问这个服务器才能完成。
什么是 SMTP?
SMTP 全称为 Simple Mail Transfer Protocol(简单邮件传输协议),它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP 认证要求必须提供账号和密码才能登陆服务器,其设计目的在于避免用户受到垃圾邮件的侵扰。
什么是 IMAP?
IMAP 全称为 Internet Message Access Protocol(互联网邮件访问协议),IMAP 允许从邮件服务器上获取邮件的信息、下载邮件等。IMAP 与 POP 类似,都是一种邮件获取协议。
什么是 POP3?
POP3 全称为 Post Office Protocol 3(邮局协议),POP3 支持客户端远程管理服务器端的邮件。POP3 常用于 “离线” 邮件处理,即允许客户端下载服务器邮件,然后服务器上的邮件将会被删除。目前很多 POP3 的邮件服务器只提供下载邮件功能,服务器本身并不删除邮件,这种属于改进版的 POP3 协议。
IMAP 和 POP3 协议有什么不同呢?
两者最大的区别在于,IMAP 允许双向通信,即在客户端的操作会反馈到服务器上,例如在客户端收取邮件、标记已读等操作,服务器会跟着同步这些操作。而对于 POP 协议虽然也允许客户端下载服务器邮件,但是在客户端的操作并不会同步到服务器上面的,例如在客户端收取或标记已读邮件,服务器不会同步这些操作。
SMTP通信模型
SMTP基于以下的通信模型:根据用户的邮件请求,发送方SMTP建立与接收方SMTP之间的双向通道。接收方SMTP可以是最终接收者,也可以是中间传送者。发送方SMTP产生并发送SMTP命令,接收方SMTP向发送方SMTP返回响应信息。
连接建立后,发送方SMTP发送MAIL命令指明发信人,如果接收方SMTP认可,则返回OK应答。发送方SMTP再发送RCPT命令指明收信人,如果接收方SMTP也认可,则再次返回OK应答;否则将给予拒绝应答(但不中止整个邮件的发送操作)。当有多个收信人时,双方将如此重复多次。这一过程结束后,发送方SMTP开始发送邮件内容,并以一个特别序列作为终止。如果接收方SMTP成功处理了邮件,则返回OK应答。
开启邮件服务
这里以163邮箱为例,点击设置,点击POP3/SMTP/IMAP
点击开启,依次开启,并保存授权码
![在这里插入图片描述](https://img-blog.csdnimg.cn/97c341b18a12425c929bdd08d3476042.png
SpringBoot整合mail
搭建springboot项目
导入mail项目,配置依赖
mail:
#smtp服务主机 qq邮箱则为smtp.qq.com
host: smtp.163.com
#服务协议
protocol: smtp
# 编码集
default-encoding: UTF-8
#发送邮件的账户
username: wgg8127@163.com
#授权码
password: WDSBXHDGXJCLLTYI
test-connection: true
properties:
mail:
smtp:
auth: true
starttls:
enable: true
required: true
@Service
public class MailServiceImpl implements MailService {
@Autowired
private JavaMailSenderImpl mailSender;
@Value("${spring.mail.username}")
private String sendMailer;
@Override
public void sendTextMailMessage(String to, String subject, String text) throws MessagingException {
//true 代表支持复杂的类型
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mailSender.createMimeMessage(),true);
//邮件发信人
mimeMessageHelper.setFrom(sendMailer);
//邮件收信人 1或多个
mimeMessageHelper.setTo(to.split(","));
//邮件主题
mimeMessageHelper.setSubject(subject);
//邮件内容
mimeMessageHelper.setText(text);
//邮件发送时间
mimeMessageHelper.setSentDate(new Date());
//发送邮件
mailSender.send(mimeMessageHelper.getMimeMessage());
System.out.println("发送邮件成功:"+sendMailer+"-->"+to);
}
@Override
public void sendHTMLMailMessage(String to, String subject, String text) throws MessagingException {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(message,true);
mimeMessageHelper.setFrom(sendMailer);
mimeMessageHelper.setTo(to.split(","));
mimeMessageHelper.setSubject(subject);
mimeMessageHelper.setText(text,true);
mimeMessageHelper.setSentDate(new Date());
mailSender.send(message);
System.out.println("发送邮件成功:"+sendMailer+"-->"+to);
}
@Override
public void sendAttachmentMailMessage(String to, String subject, String content, String filePath) {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper messageHelper;
try {
messageHelper = new MimeMessageHelper(message,true);
messageHelper.setFrom(sendMailer);
messageHelper.setTo(to);
messageHelper.setSubject(subject);
messageHelper.setText(content,true);
//携带附件
FileSystemResource file = new FileSystemResource(filePath);
String fileName = filePath.substring(filePath.lastIndexOf(File.separator));
messageHelper.addAttachment(fileName,file);
mailSender.send(message);
} catch (MessagingException e) {
}
}
@SpringBootTest
public class SendMailTest {
@Autowired
private MailService mailService;
@Test
public void testSendTextMailMessage() throws MessagingException {
mailService.sendTextMailMessage("wgg8127@163.com", "test测试邮件", "这是一封text邮件");
}
@Test
public void testSendHTMLMailMessage() throws MessagingException {
String text="<html>\n"+
"<body>\n"+
"<h2>Hello!这是一封SpringBoot发送的HTML邮件。</h2>\n"+
"</body>\n"+
"</html>";
mailService.sendHTMLMailMessage("wgg8127@163.com", "HTML测试邮件", text);
}
@Test
public void testSendAttachmentMailMessage() throws MessagingException {
String content = "请仔细查看附件内容";
String filePath = "D:\\Desktop\\授权码.txt";
mailService.sendAttachmentMailMessage("wgg8127@163.com", "测试发送附件邮件",content, filePath);
}
}