邮件软件称为MUA:Mail User Agent,意思是给用户服务的邮件代理;
邮件服务器则称为MTA:Mail Transfer Agent,意思是邮件中转的代理;
最终到达的邮件服务器称为MDA:Mail Delivery Agent,意思是邮件到达的代理。
电子邮件一旦到达MDA,就不再动了。实际上,电子邮件通常就存储在MDA服务器的硬盘上,然后等收件人通过软件或者登陆浏览器查看邮件。
**MTA和MDA这样的服务器软件通常是现成的,我们不关心这些服务器内部是如何运行的。**要发送邮件,我们关心的是如何编写一个MUA的软件,把邮件发送到MTA上。
**MUA到MTA发送邮件的协议就是SMTP协议,**它是Simple Mail Transport Protocol的缩写,使用标准端口25,也可以使用加密端口465或587。
SMTP协议是一个建立在TCP之上的协议,任何程序发送邮件都必须遵守SMTP协议。使用Java程序发送邮件时,我们无需关心SMTP协议的底层原理,只需要使用JavaMail这个标准API就可以直接发送邮件。
准备SMTP登录信息
假设我们准备使用自己的邮件地址me@example.com给小明发送邮件,已知小明的邮件地址是xiaoming@somewhere.com,发送邮件前,我们首先要确定作为MTA的邮件服务器地址和端口号。邮件服务器MTA地址通常是smtp.example.com,端口号由邮件服务商确定使用25、465还是587。以下是一些常用邮件服务商的SMTP信息:
- QQ邮箱:SMTP服务器是smtp.qq.com,端口是465/587;
- 163邮箱:SMTP服务器是smtp.163.com,端口是465;
- Gmail邮箱:SMTP服务器是smtp.gmail.com,端口是465/587。
有了SMTP服务器的域名和端口号,我们还需要SMTP服务器的登录信息,通常是使用自己的邮件地址作为用户名,登录口令是用户口令或者一个独立设置的SMTP口令。
接收Email
接收Email则相反,因为邮件最终到达收件人的MDA服务器,所以,接收邮件是收件人用自己的客户端把邮件从MDA服务器上抓取到本地的过程。
接收邮件使用最广泛的协议是POP3:Post Office Protocol version 3,它也是一个建立在TCP连接之上的协议。POP3服务器的标准端口是110,如果整个会话需要加密,那么使用加密端口995。
**另一种接收邮件的协议是IMAP:**Internet Mail Access Protocol,它使用标准端口143和加密端口993。
IMAP和POP3的主要区别是,IMAP协议在本地的所有操作都会自动同步到服务器上,并且,IMAP可以允许用户在邮件服务器的收件箱中创建文件夹。
JavaMail也提供了IMAP协议的支持。因为POP3和IMAP的使用方式非常类似,因此我们只介绍POP3的用法。
使用POP3收取Email时,我们无需关心POP3协议底层,因为JavaMail提供了高层接口。首先需要连接到Store对象:
小结
使用JavaMail API发送邮件本质上是一个MUA软件通过SMTP协议发送邮件至MTA服务器;
打开调试模式可以看到详细的SMTP交互信息;
某些邮件服务商需要开启SMTP,并需要独立的SMTP登录密码。
使用Java接收Email时,可以用POP3协议或IMAP协议。
使用POP3协议时,需要用Maven引入JavaMail依赖,并确定POP3服务器的域名/端口/是否使用SSL等,然后,调用相关API接收Email。
设置debug模式可以查看通信详细内容,便于排查错误。