目录
邮件服务器
简单理解:
用户A给用户B发邮件,A把邮件发送到A所用的邮件服务器(简称a服务器),然后,a服务器确定收件人(B)的邮件服务器(b服务器),a服务器就可以将用户A的邮件发送到b服务器上,到此邮件一般发送完成了,最后用户B只要上线他的邮箱,就会查询b服务器上邮件,进而确定得到未读的邮件。
通过协议理解
- 用户A通过SMTP协议连接到SMTP服务器,然后发送一封邮件给网易的邮件服务器
- 网易分析发现,邮件的目的地是QQ的邮件服务器,就通过SMTP协议将邮件转投给QQ的SMTP服务器
- QQ将接收到的邮件存储在对应收件人的邮箱帐号空间
- 用户B通过POP3协议连接到POP3服务器收取邮件
- 在用户B的帐号空间中拉取该邮件
- POP3服务器将取出邮件给用户B
邮件发送的两个协议
SMTP协议
发送邮件:
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。
SMTP协议属于TCP/IP协议族,它帮助每台计算机在发送或中转信件时找到下一个目的地。
通过SMTP协议所指定的服务器,我们就可以把E-mail寄到收信人的服务器上了,整个过程只要几分钟。
SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转你发出的电子邮件。
POP3协议
接收邮件:
POP3(Post Office Protocol 3),规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。
POP3规定:允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件。
POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。
它是因特网电子邮件的第一个离线协议标准。
Java实现邮件发送
两个重要的包
<!-- https://mvnrepository.com/artifact/javax.mail/mail -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.activation/activation -->
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
发送细节
简单邮件:没有附件和图片,纯文本邮件
复杂邮件:有附件和图片
要发送邮件,需要获得协议和支持!开启服务POP3/SMTP服务
另外还可能需要获得授权码,例如qq邮箱
我们邮箱里面对应的协议开启
(QQ邮箱为例)
代码,发送简单文本
package com.vigil;
import com.sun.mail.util.MailSSLSocketFactory;
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 = Session.getDefaultInstance(prop, new Authenticator() {
public PasswordAuthentication getPasswordAuthentication() {
//发送邮件的用户名、授权码
return new PasswordAuthentication("qq邮箱", "授权码");
}
});
//开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
session.setDebug(true);
//2、通过session得到transport对象
Transport ts = session.getTransport();
//3、使用邮箱的用户名和授权码连上邮件服务器(host)
ts.connect("smtp.qq.com","qq邮箱","授权码");
//4、创建邮件
//注意需要传递session,确定要邮件发送对象等等重要信息
MimeMessage message = new MimeMessage(session);
//指明邮件的发件人
message.setFrom(new InternetAddress("qq地址"));
//指明邮件的收件人,如果发件人和收件人是一样的,那就是自己给自己发
message.setRecipient(Message.RecipientType.TO,new InternetAddress("qq地址"));
//邮件的标题
message.setSubject("只包含文本的简单邮件")