E-mail邮件协议的概述

认识E-mail协议:

SMTP邮箱发信(QQ邮箱为例):http://blog.csdn.net/aaron133/article/details/78363844
POP3邮箱收信(163邮箱为例):http://blog.csdn.net/aaron133/article/details/78413701

一、E-mail的发送接收涉及两个协议:

1、简单邮件传递协议(SMTP):负责传递邮件,是TCP/IP系列的协议.
2、邮政协议(POP3):接收互联网上的邮件.

3、这里主要讲解SMTP协议,POP3协议在上面的链接中.


、工作原理:

1客户端发送程序-->SMTP1服务器(源SMTP)-->通过DNS服务寻找目标SMTP服务器-->SMTP2服务器与建立连接并传送邮件-->POP3服务器-->放入接收者电子信箱中并通知接收者。

2、通常情况下,个人用户不是直接接收电子邮件,是由ISP(如:smtp.qq.com)的(SMTP服务器)主机负责接收电子邮件,再通知个人用户。
路径:个人用户主机-->SMTP的主机-->SMTP目标服务器-->收件人的SMTP主机-->POP3服务器-->通知收件人.

3、一般大公司专门有一台SMTP服务器机器用来处理邮件.


三、关于ISP(互联网服务提供商):

1、ISP的主机充当着邮局的作用,管理众多用户的电子信箱,每个用户的电子邮箱实际上就是它的账号名。
2、由于每个电子邮箱都要占据ISP的硬盘空间,所以邮件数量是有限的。


四、关于互联网邮件系统:

1、每一台互联网PC在运行邮件程序(QQ邮箱)时,可自动确保邮件以标准格式选址和传送,这个程序称为“传送受理程序”.
2、“传送受理程序”遵守SMTP协议向外界发送邮件.

3、大多数“传送受理程序”都在后台运行,UNIX称它为sendmail的智能程序.


电子邮件:

一、分为三个部分:

                          1)信头(主题、收件人、发件人)        
                          2)信体(内容)
                          3)签名区

二、国际上常见的电子邮件格式:    

            From:发信人地址     
              to:收信人地址
         Subject:主题
         content:内容
                 结束标志
                 签名区

三、电子邮件地址通用格式:用户标识字符串@域名([email protected]

四、邮件结构:

      (1)From:[email protected]                         //发信人 
      (2)  To:[email protected]                         //收件人
      (3)Subject:Hello,World                            //主题
      (4)Date:Thu,1 Apr 2017. 14:00:00 GMT//时间日期
      (5)Hi,Jack                                        //内容部分
      (6)空行                              
      (7)How Are You?
      (8)...
      (9)Thanks
      (10)Aaron


信头:

在传输过程中,邮件被打包成一个数据结构,邮件的传输是根据信头上的信息进行传输的。

举例说明信封在传递过程中信头的变化:

步骤一:客户端程序发送邮件时:
               From:[email protected]                              
               To:[email protected]             
               Date:Thu,1 Apr 2017. 14:00:00 GMT
               X-mailer:Sendmail 8.9.0
               Subject:Hello,World

步骤二:smtp.qq.com指向的SMTP服务器接收此邮件后,在信头上增加一条以下内容:
           
  Received:from 发信人主机名.126.com (发信人主机名.126.com [发件人IP地址]) by smtp.126.com (8.8.5)  id  004A21;Tue,Mar 18 1998 15:3 7:24 GMT
              From:[email protected]                                        
              To:[email protected]             
              Date:Thu,1 Apr 2017. 14:00:00 GMT
              X-mailer:Sendmail 8.9.0
              Subject:Hello,World

步骤三:QQ的SMTP服务器将邮件存储下来,等待收件人阅读,再次增加两条以下的内容:

             Received:from smtp.126.com (smtp.126.com [1.1.1.0]) bysmtp.qq.com (8.8.5/8.7.2) with ESMTP id LAA20869;Tue,Mar 18 1998 15:3 7:44 GMT

             Received:from 发信人主机名.126.com (发信人主机名.126.com [发件人IP地址]) by smtp.126.com (8.8.5)  id  004A21;Tue,Mar 18 1998 15:3 7:24 GMT

              From:[email protected]             
              To:[email protected]             
              Date:Thu,1 Apr 2017. 14:00:00 GMT
              Message-Id:<[email protected]>  
              X-mailer:Sendmail 8.9.0
              Subject:Hello,World

拿步骤三来解释以上的含义说明:

1、Received:from smtp.126.com (smtp.126.com [1.1.1.0]):

说明了是在smtp.126.com的SMTP服务器上接收来的邮件,SMTP服务器IP地址为1.1.1.0,真实名字为smtp.126.com

2、by smtp.qq.com (8.8.5/8.7.2) with ESMTP id LAA20869:

接收方为smtp.qq.com,使用的sendmail(传送受理程序)的版本:8.8.5/8.7.2,邮件编号为ESMTP id LAA20869

3、Tue,Mar 18 1998 15:3 7:44 GMT:接收时间

4、Message-Id域:发送方SMTP服务器赋给这封邮件的编号,这个编号会始终跟随该电子邮件


SMTP协议原理:


一、简易概述:

1、提供高效、可靠的邮件传输,可通过不同网络的主机接力式传送.
2、TCP/IP系列的协议.
3、使用的监听端口号:25


二、主要功能:
1、将邮件从客户端传送至SMTP服务器.
2、将邮件从SMTP服务器传送至另外一个SMTP服务器上.

3、分为两个工作模式:发送SMTP、接收SMTP.


三、工作过程:

接到客户端的邮件请求后,判断是否为发送给本地SMTP服务器用户的邮件,如果是,直接投送到用户邮件中.否则向域名服务DNS查询远端SMTP服务器MX记录, 查询到后,与远端SMTP服务器建立连接,相互交互发送SMTP命令,本地SMTP服务器发送MAIL命令指明邮件发送者,远端SMTP服务器则返回OK应答,本地SMTP服务器再发送RCPT命令确认邮件是否已接收到,远端SMTP服务器接收成功则返回OK应答,反之则会返回拒绝接收应答(但不终止连接), 双方重复多次,当远端SMTP服务器收到全部邮件后会接收到特别的序列,如果远端SMTP服务器成功处理了邮件,则返回OK应答.


关于MX记录邮件交换记录,它指向一个邮件服务器,用于电子邮件系统发邮件时根据,收信人的地址后缀来定位邮件服务器.
关于CNAME记录(规范名字):将多个名字(域名)映射到同一台计算机.

关于A记录IP地址


四、SMTP命令三位数字响应码描述:

1、SMTP命令三位数字响应码基于ASCII字符集,并以CR和LF符(CR为\r、FL为\n)结束.
2、三位数字响应码为三位数字代码,每一个数字代码表示一个返回状态.


五、发信步骤:以登录QQ邮箱进行发信为例

    1、连接QQ的SMTP服务器,通常端口为25      //2开始,每一个命令都要接收一个服务器响应码
    2、编辑邮件内容和标题格式:
    "From:<账号@域名.com>\r\n"              //仅用于显示在邮件上的说明发件人(一般与实际发件人的邮箱号一致才行)
    "To:<账号@域名.com>\r\n"(以;分割)       //仅用于显示在邮件上的说明一个或多个收件人(随意)
    "Subject:主题\r\n\r\n"                  //邮件标题
    "内容"                                  //邮件内容
    3、发送EHLO命令标明身份
    4、发送STARTTLS命令标明使用安全传输层协议(TLS)
    5、发送AUTH LOGIN命令使用邮箱登录
    6、上传QQ账号和邮箱密钥(Base64编码)
    7、发送MAIL FROM命令指定发件人,就是当前QQ邮箱.
    8、发送RCPT TO命令指定一个或多个收件人
    9、发送DATA命令准备开始发送邮件内容
    10、发送内容,内容以\r\n.\r\n结束
    11、发送QUIT命令退出

(具体编写2017年QQ邮件发信请看:http://blog.csdn.net/aaron133/article/details/78363844)

六、列举一些SMTP命令:

(注意:每条命令以\r\n结尾,每发送一条SMTP命令,要接收一个服务器数字回应码)

1、EHLO命令

发送格式:EHLO 主机名或发送者SMTP服务器名\r\n        

作用:向服务器标明用户身份

2、STARTTLS命令:

发送格式:STARTTLS a\r\n

作用:这是使用QQ邮箱时,需要的,这是我根据服务器反馈的错误回应码,知道的命令,我理解的不太透彻,应该为开启安全传输层协议(TLS),a字符是随便加的,因为他需要后面跟一些字符串才能成功.

3、AUTH LOGIN命令:

发送格式:AUTH LOGIN\r\n       

作用:邮箱认证,发送该命令后应依次先发送邮箱账号,后发送密码(账号密码均使用Base64编码)发送前,需要将账号密码字符串转换为Base64编码,而且账号和密码结尾必须添加上:\r\n

关于Base64编码:http://blog.csdn.net/aaron133/article/details/78352525

简单转换Base64编码的函数:http://blog.csdn.net/aaron133/article/details/78363844

4、MAIL FROM命令:

发送格式:MAIL FROM: <邮箱账号@××.com>\r\n

作用:指定发件人

5、RCPT TO命令:

发送格式:RCPT TO:<邮箱账号@××.com>\r\n

作用:指定一个或多个收件人,指定多人时,要多次发送RCPT TO命令.

6、DATA命令:

发送格式:DATA\r\n

作用:表示准备开始发送邮件内容,发送此命令后,接着应发送邮件内容,内容必须以\r\n.\r\n作为结束标记.

7、QUIT命令:

发送格式:QUIT\r\n

作用:退出命令

七、列举一些三位数字响应码:

(第一位数字为2,表示命令成功)

第一位数字为5,表示命令失败

第一位数字为3,表示命令未完成

1、211   系统状态或系统帮助响应
2、214   帮助信息
3、220  服务就绪
4、221  服务关闭
5、250  要求的邮件操作完成
6、251  用户非本地,将转发向
7、354  开始邮件输入,以“.”结束
8、421  服务未就绪,关闭传输信道
9、450  要求的邮件未完成,邮箱不可用
10、451  放弃要求的操作;处理过程中出错
11、452  系统存储不足,要求的操作未执行
12、501   参数格式错误
13、502   命令不可实现
14、503   错误的命令序列
15、504   命令参数不可实现
16、553  邮箱名不可用,要求的操作未执行
17、550  要求的邮件未完成,邮箱不可用
18、552  过量的存储分配,要求的操作未执行
29、551  用户非本地,请尝试
20、552  过量的存储分配,要求的操作未执行
21、554  操作失败

更多三位数字响应码查看:http://cn.evo-mailserver.com.tw/support/smtp_error_code.php


八、补充说明:

1、360会报告有第三方软件在使用邮箱发件.
2、SMTP命令中的HELO命令和EHLO命令是不同的,HELO命令是普通SMTP,不需要身份认证就可以使用MAIL FROM命令,然后发送伪造发送者的邮件,而现在大多数为ESMTP(SMTP扩展),是带有身份验证的.

3、使用SMTP协议QQ邮箱发信例子:http://blog.csdn.net/aaron133/article/details/78363844


你可能感兴趣的:(Windows网络编程,C/C++)