SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议族,它帮助每台计算机在发送或中转信件时找到下一个目的地。通过SMTP协议所指定的服务器,就可以把E-mail寄到收信人的服务器上了,整个过程只要几分钟。SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转发出的电子邮件。
基本介绍
SMTP 是一种TCP协议支持的提供可靠且有效电子邮件传输的应用层协议。SMTP 是建立在 FTP 文件传输服务上的一种邮件服务,主要用于传输系统之间的邮件信息并提供来信有关的通知。
SMTP 独立于特定的传输子系统,且只需要可靠有序的数据流信道支持。SMTP 重要特性之一是其能跨越网络传输邮件,即“ SMTP 邮件中继”。通常,一个网络可以由公用互联网上 TCP 可相互访问的主机、防火墙分隔的 TCP/IP 网络上 TCP 可相互访问的主机,及其它 LAN/WAN 中的主机利用非 TCP 传输层协议组成。使用 SMTP ,可实现相同网络上处理机之间的邮件传输,也可通过中继器或网关实现某处理机与其它网络之间的邮件传输。
在这种方式下,邮件的发送可能经过从发送端到接收端路径上的大量中间中继器或网关主机。域名服务系统(DNS)的邮件交换服务器可以用来识别出传输邮件的下一条 IP 地址。
在传输文件过程中使用端口:25。
协议原理
SMTP-简单邮件传输协议(SimpleMailTransferProtocol),是定义邮件传输的协议,它是基于TCP服务的应用层协议,由RFC821所定义。SMTP协议规定的命令是以明文方式进行的。为了说明SMTP的工作原理,我们以向163发送邮件为实例进行说明。 在linux环境下,使用"telnet smtp.163. com 25"连接smtp.163. com的25号端口(SMTP的标准服务端口);在windows下使用telnet程序,远程主机指定为smtp.163. com,而端口号指定为25,然后连接smtp.163. com:交互过程如下: SMTP
[lix@nslix]$telnet smtp.163. com 25
220 163 .com Anti-spam GT for Coremail System (163com[071018])
HELO smtp.163 .com
250 OK
auth login
334 dXNlcm5hbWU6
USER base64加密后的用户名
334 UGFzc3dvcmQ6
PASS base64加密后的密码
235 Authentication successful
MAILFROM:XXX@163 .COM
250 Mail OK
RCPTTO:XXX@163 .COM
250 Mail OK
DATA
354 End data with .
QUIT
250 Mail OK queued as smtp5,D9GowLArizfIFTpIxFX8AA==.41385S2 1211766217
HELO是客户向对方邮件服务器发出的标识自己的身份的命令,这里假设发送者为ideal;MAILFROM命令用来表示发送者的邮件地址;RCPTTO:标识接收者的邮件地址,这里表示希望发送邮件给XXX@163. COM,如果邮件接收者不是本地用户,例如RCPTTO:ideal,则说明希望对方邮件服务器为自己转发(Relay)邮件,若该机器允许转发这样的邮件,则表示该邮件服务器是OPENRELAY的,否则说明该服务器不允许RELAY;DATA表示下面是邮件的数据部分,输入完毕以后,以一个"."开始的行作为数据部分的结束标识;QUIT表示退出这次会话,结束邮件发送。
这就是一个简单的发送邮件的会话过程,其实当使用outlookexpress等客户软件发送时,后台进行的交互也是这样的,当然,SMTP协议为了处理复杂的邮件发送情况如附件等等,定义了很多的命令及规定,具体可以通过阅读RFC821来获得。
当你的一个朋友向你发送邮件时,他的邮件服务器和你的邮件服务器通过S SMTP
MTP协议通信,将邮件传递给你邮件地址所指示的邮件服务器上(这里假设你的本地邮件服务器是Linux系统),若你通过telnet协议直接登录到邮件服务器上,则可以使用mail等客户软件直接阅读邮件,但是若你希望使用本地的MUA(MailUserAgent,如outlookexpress等客户软件)来阅读邮件,则本地客户端通过POP3或IMAP协议与邮件服务器交互,将邮件信息传递到客户端(如:win98系统)。而如果你向你的朋友回复一封信件时,你所使用的MUA也是通过SMTP协议与邮件服务(一般为发送邮件地址对应的email地址)器通信,指示其希望邮件服务器帮助转发一封邮件到你朋友的邮件地址指定的邮件服务器中。若本地邮件服务器允许你通过它转发邮件,则服务器通过SMTP协议发送邮件到对方的邮件服务器。这就是接受和发送邮件的全部过程。
协商步骤
//连接SOCKET
SOCKET sock = SockConnectTcp("smtp.163.com",25);
邮件协议步骤:
SendMsg(sock,"EHLO 163.com\r\n"); //SMTP协议的握手信号
SendMsg(sock,"AUTH LOGIN\r\n"); //开始认证登录
SendMsg(sock,username_base64); //提交用户名
SendMsg(sock,password_base64); //提交密码
SendMsg(sock,"MAIL FROM:<689zhangfan@163.com>\r\n"); //提交发送者
SendMsg(sock,"RCPT TO:<689zhangfan@163.com>\r\n"); //提交接收者
SendMsg(sock,"DATA\r\n"); //通知服务器下面是邮件
//发送邮件头部信息
SendMsg(sock,"TO: 689zhangfan@163.com\r\nFROM:689zhangfan@163.com\r\nSUBJECT: SMTP协议测试\r\nDate:2009-12-5\r\nX-Mailer:fice's mailer\r\n"); //邮件
SendMsg(sock,"MIMI-Version:1.0\r\n");
SendMsg(sock,"Content-Type:multipart/mixed;boundary=\"#BOUNDARY#\"\r\n\r\n"); //设置边界标识
SendMsg(sock,"Content-Transfer-Encoding:7bit\r\n\r\n");
SendMsg(sock,"This is a multi-part message in MIME format\r\n\r\n");
//发送邮件内容头部信息
SendMsg(sock,"--#BOUNDARY#\r\n");
SendMsg(sock,"Content-Type: text/plain;charset=gb2312\r\n");
SendMsg(sock,"Content-Transfer-Encoding:printable\r\n\r\n");
//发送邮件的内容部分
SendMsg(sock,"SMTP协议测试:发送附件\n----by fice 2009.12.5\r\n");
//发送附件头部信息
SendMsg(sock,"--#BOUNDARY#\r\n");
SendMsg(sock,"Content-Type:text/plain;name=student.txt\r\n");
SendMsg(sock,"Content-Transfer-Encoding:base64\r\n");
SendMsg(sock,"Content-Disposition:attachment;filename=\"student.txt\"\r\n\r\n");
//发送邮件的附件部分
SendMsg(sock,filebase64);
SendMsg(sock,"\r\n\r\n"); //邮件内容结束
SendMsg(sock,"QUIT\r\n"); //通知服务器退出
//关闭SOCKET
closesocket(sock);
其他协议
POP3
POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。它是因特网电子邮件的第一个离线协议标准,POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。
IMAP
IMAP全称是Internet Mail Access Protocol,即交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之一。不同的是,开启了IMAP后,您在电子邮件客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。所以无论从浏览器登录邮箱或者客户端软件登录邮箱,看到的邮件以及状态都是一致的。