邮件发送原理及实现
一、邮件发送原理图
张三通过smtp协议连接到Smtp服务器,然后发送一封邮件给网易的邮件服务器
网易分析发现需要去QQ的邮件服务器,通过Smtp协议将邮件转投给QQ的Smtp服务器
QQ将接收到的邮件存储在456789@qq.com这个邮件账号的空间中
李四通过Pop3协议连接到Pop3服务器收取邮件
从456789@qq.com这个邮件账号的空间中取出邮件
Pop3服务器将取出来的邮件送道李四手中
协议介绍
SMTP协议(发送邮件):
我们通常把处理用户smtp请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器)。
POP3协议(接收邮件):
我们通常把处理用户pop3请求(邮件接收请求)的服务器称之为POP3服务器(邮件接收服务器)。
2.下载jar包
activation.jar ==> https://mvnrepository.com/artifact/javax.activation/activation
mail.jar ==> https://mvnrepository.com/artifact/javax.mail/mail
3.授权码的获取
4.简易文本邮件发送的实现
步骤:
- 创建session对象
- 创建Transport对象
- 使用邮箱的用户名和授权码连上邮件服务器
- 创建一个Message对象(需要传递session) 注:message需要指明发件人、收件人以及文件内容
- 发送邮件
- 关闭连接
5.代码实现:创建普通的java项目
引入新建lib目录并导入jar包
新建测试代码
测试代码
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.security.GeneralSecurityException;
import java.util.Properties;
public class MailDemo01 {
public static void main(String[] args) throws Exception {
Properties prop=new Properties();
prop.setProperty("mail.host","smtp.qq.com");///设置QQ邮件服务器
prop.setProperty("mail.transport.protocol","smtp");///邮件发送协议
prop.setProperty("mail.smtp.auth","true");//需要验证用户密码
//QQ邮箱需要设置SSL加密,其他邮箱不需要
MailSSLSocketFactory sf=new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
prop.put("mail.smtp.ssl.enable","true");
prop.put("mail.smtp.ssl.socketFactory",sf);
//使用javaMail发送邮件的5个步骤
//1.创建定义整个应用程序所需要的环境信息的session对象
//QQ才有!其他邮箱就不用
Session session=Session.getDefaultInstance(prop, new Authenticator() {
public PasswordAuthentication getPasswordAuthentication() {
//发件人邮件用户名、授权码
return new PasswordAuthentication("XXXX@qq.com","授权码");
}
});
//开启session的debug模式,这样可以查看到程序发送Email的运行状态
session.setDebug(true);
//2.通过session得到transport对象
Transport ts=session.getTransport();
//3.使用邮箱的用户名和授权码连上邮件服务器
ts.connect("smtp.qq.com","XXXX@qq.com","授权码");
//4.创建邮件:写文件
//注意需要传递session
MimeMessage message=new MimeMessage(session);
//指明邮件的发件人
message.setFrom(new InternetAddress("XXXX@qq.com"));
//指明邮件的收件人
message.setRecipient(Message.RecipientType.TO,new InternetAddress("XXXX@qq.com"));
//邮件标题
message.setSubject("发送的标题");
//邮件的文本内容
message.setContent("内容","text/html;charset=UTF-8");
//5.发送邮件
ts.sendMessage(message,message.getAllRecipients());
//6.关闭连接
ts.close();
}
}
带图片和附件的邮件
MIME(多用途互联网邮件扩展类型)
- MimeBodyPart类
javax.mail.internet.MimeBodyPart类 表示的是一个MIME消息,它和MimeMessage类一样都是从Part接口继承过来。
- MimeMultipart类
javax.mail.internet.MimeMultipart是抽象类 Multipart的实现子类,它用来组合多个MIME消息。一个MimeMultipart对象可以包含多个代表MIME消息的MimeBodyPart对象。
<