
2.6 发送邮件的SMTP客户程序
SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)是应用层的协议,建立在TCP/IP基础之上。SMTP规定了把邮件从发送方传输到接收方的规则。该协议的细节在RFC821文档中进行了描述。
SMTP客户程序请求发送邮件,SMTP服务器负责把邮件传输到目的地。在默认情况下,SMTP服务器监听25端口。在SMTP客户与SMTP服务器的一次会话过程中,SMTP客户会发送一系列SMTP命令,SMTP服务器则做出响应,返回相应的应答码,以及对应答码的描述。表2-2和表2-3分别列出了SMTP主要包含的SMTP命令和应答码。
表2-2 主要的SMTP命令

表2-3 主要的SMTP应答码

以下是在SMTP客户程序与SMTP服务器的一次会话过程中,SMTP服务器的响应数据(以“Server>”开头的行)以及SMTP客户发送的数据(以“Client>”开头的行)。SMTP客户程序所在的主机的名字为“ANGEL”,SMTP服务器程序所在的主机的名字为“smtp.abc.com”。

例程2-13的MailSender就是一个SMTP客户程序,它用sendMail()方法请求SMTP服务器发送一封邮件。sendMail()方法首先创建与SMTP服务器连接的Socket对象。当连接成功时,SMTP服务器就会返回一个应答码为220的响应,表示服务就绪。接着sendMail()方法开始发送“HELO”“MAIL FROM”“RCPT TO”等命令,每条命令都按行发送,即以“\r\n”结束。每发送完一条命令后,都会等接收到了SMTP服务器的响应数据,再发送下一条命令。
例程2-13 MailSender.java



有些SMTP服务器还会要求客户提供授权码验证信息。在这种情况下,客户应该先发送“EHLO”命令,接着发送“AUTH LOGIN”命令,再发送采用Base64编码的用户名和授权验证码,这样就能通过服务器端的身份认证。例程2-14的MailSenderWithAuth类先向服务器进行身份认证,然后才发送邮件。
提示
Base64编码是网络上常见的编码方式,它能把任意的原始字节序列转换为不易被人直接识别的形式,具有加密数据的作用。RFC2045~RFC2049对Base64编码做了介绍。
例程2-14 MailSenderWithAuth.java



以上MailClientWithAuth类利用126网易的SMTP服务器来发送邮件。关于授权验证码的设置和概念,请参见14.6节(授权码验证)。为了进行授权码验证,本程序创建了基于SSL(Secure Sockets Layer,安全套接层)的安全套接字:
