SMTP协议是一个基于TCP/IP的应用层协议,SMTP服务器的默认的网络监听端口号为25
SMTP协议中一共定义了18条命令:其中比较发送一封邮件的过程通常需要的有以下6条命令
ehlo命令:SMTP邮件发送程序与SMTP接收程序建立连接后必须发送的第一条SMTP命令,后面通常加本主机名
auth命令:认证命令,如auth login,然后输入用户名和密码(必须是BASE64编码后的)
userName = "abc" BASE64Encoder encoder = new BASE64Encoder(); encoder.encode(userName.getBytes());
mail from命令:发送者邮箱地址,如mail from:<123@qq.com>
rcpt to命令:接受者邮箱地址,如rcpt to:<456@163.com>
data命令:此命令表示SMTP邮件发送程序准备开始传送邮件内容了,在该命令后发送的都被当成邮件内容,直到遇到结束符号内容结束,可以用"."
quit命令:表示要结束邮件发送过程
开始测试方法:dos命令下:
telnet命令+SMTP服务器名+端口号,如
telnet smtp.sina.com.cn 25
发送命令过程中,响应状态码的最高位数字代表了不同的分类,2代表命令执行成功,5代表命令执行失败,3代表命令还没完成
说明:一些邮件系统支持自动回复邮件的功能,但是如果两个邮箱的mail from命令后的地址是对方,这样会造成死循环回复,为了避免这样的情况,一些SMTP服务器在进行邮件自动回复时,通常不填写mail from命令后面的邮件地址,借此来避免循环回复
SMTP虽然是使用了TCP/IP的应用层协议,但是如果SMTP服务器用于向其他SMTP服务器转发邮件,它在接收到邮件发送程序的rcpt to 命令后,由于并不会马上向其他SMTP服务器转发当前邮件,而是先将当前邮件保存到邮件发送队列里面,所以,它无法检测到收件人是否存在,总是会返回250的响应状态码,。所以人们在通过SMTP服务器向外转发邮件时,即使收件人的地址不存在,或者邮件最终没有从邮件队列中转发出去,邮件客户端程序当时也会看到邮件发送成功的信息。故电子邮件并不是一种完全可靠的通信方式。