首页 > 编程技术 > php

POP3协议命令原始码及工作原理

发布时间:2016-11-25 17:02

http://www.linuxforum.net Jephe Wu (2001-04-21 18:17:49)
一 简介:
1. POP适用于C/S结构的脱机模型的电子邮件协议,目前已发展到第三版,称POP3。脱机模型即不能在线
   操作,不像IMAP4(netscape支持IMAP4)
2. 当客户机与服务器连接并查询新电子邮件时,被该客户机指定的所有将被下载的邮件都将被程序下载到
   客户机,下载后,电子邮件客户机就可以删除或修改任意邮件,而无需与电子邮件服务器进一步交互。
3. POP3客户向POP3服务器发送命令并等待响应,POP3命令采用命令行形式,用ASCII码表示。
   服务器响应是由一个单独的命令行组成,或多个命令行组成,响应第一行以ASCII文本+OK或-ERR指出相应
   的操作状态是成功还是失败
4. 在POP3协议中有三种状态,认可状态,处理状态,和更新状态。
   当客户机与服务器建立联系时,一旦客户机提供了自己身份并成功确认,即由认可状态转入处理状态,
   在完成相应的操作后客户机发出quit命令,则进入更新状态,更新之后最后重返认可状态。如下图
 等待连接        身份确认         quit命令
   ——  |认可|————— |处理|——————|更新|
           |__________________________________|
                  重返认可状态
5. 认可状态的命令语句
   一般情况下,大多数现有的POP3客户与服务器执行采用ASCII明文发送用户名和口令,在认可状态等
待客户连接的情况下,客户发出连接,并由命令user/pass对在网络上发送明文用户名和口令给服务器
进行身份确认。一旦确认成功,便转入处理状态。
    为了避免发送明文口令的问题,有一种新的认证方法,命令为APOP,使用APOP,口令在传输之前被加密。
当第一次与服务器连接时,POP3服务器向客户机发送一个ASCII码问候,这个问候由一串字符组成对每个客
户机是唯一的,与当时的时间有关,然后,客户机把它的纯文本口令附加到从服务器接收到的字符串之后,
然后计算出结果字符串的MD5单出函数消息摘要,客户机把用户名与MD5消息摘要作为APOP命令的参数一起发送
出去。
    目前,大多数windows上的邮件客户软件不支持APOP命令,qpopper支持。
6. POP3命令码如下:
 命令          参数       状态     描述
3.7. 域    
  域是最近被引入ARPA Internet邮件系统的。使用域可以使地址空间从一
个平面的普通字符串主机名变成全局地址的一个层次结构。主机由一个域名取
代,起始主机是由一系列元串组成,它们由逗号按最特殊到一般的顺序排列。
  例如,"USC-ISIF.ARPA","Fred.Cambridge.UK"和"PC7.LCS.MIT.ARPA"可
能是主机-域标识符。
  无论域名在SMTP中如何使用,只有正式的名称才可以被使用,不可以使用
假名或昵称。
3.8. 改变角色
  TURN命令可以用来改变在传输信道上通信的程序的角色。如果程序A现在是
发送SMTP,它发送TURN命令并接到OK应答(250)后,它就变为接收SMTP了。同
理,程序B也可以从接收SMTP变为发送SMTP。若要拒绝改变角色,接收方可以发
送502作为应答。
  注意:此命令是可选的。在使用TCP的传输信道时,一般不使用此命令。然
而,当建立传输信道的代价比较大时,此命令很有用。例如,此命令可以支持一
般公共交换电话系统作为传输信道。
4. SMTP说明    
4.1. SMTP命令    
4.1.1. 命令语法    
  SMTP命令定义了邮件传输或由用户定义的系统功能。它的命令是由<CRLF>
结束的字符串。而在带有参数的情况下,命令本身由<SP>和参数分开,如果
未带参数可以直接和<CRLF>连接。邮箱的语法格式必须和接收站点的格式一致。
下面讨论SMTP命令和应答。
  发送邮件操作涉及到不同的数据对象,它们由不同的参数相互连接。回
复路径就是MAIL命令的参数,而转发路径则是RCPT命令的参数,邮件日期是
DATA命令的参数。这些参数或者数据对象必须跟在命令后。这种模式也就要
求有不同的缓冲区来存储这些对象,也就是说,有一个回复路径缓冲区,一
个转发路径缓冲区,一个邮件内容缓冲区。特定的命令产生自己的缓冲区,
或使一个或多个缓冲的内容被清除。
  HELLO (HELO)
  此命令用于向接收SMTP确认发送SMTP。参数域包括发送SMTP的主机名。
接收SMTP通过连接确认命令来向发送SMTP确认接收SMTP。引命令和OK响应确
认发送和接收SMTP进入了初始状态,也就是说,没有操作正在执行,所有状态
表和缓冲区已经被子清除。
Advanced Example
Here we will show the full capabilities of the PHP mail function.
PHP Code:
<?php
echo "<html><body>";
$recipient = "Kris Arndt <karn@nucleus.com>,npl@nucleus.com";
$subject = "Testing the mail function";
$message = "Hello! This is the body of the message. ";
$extra = "From: kris@phpworld.com Reply-To: karn@nucleus.com ";
mail ($recipient, $subject, $message, $extra);
echo "Sending mail...";
echo "</body></html>";
?>

We send an email to two people this time, by putting two email addresses in the recipient field and separating them with commas.
The fourth parameter holds extra headers for the email.    We specify who the email was from and who the recipient should reply to.    When entering multiple headers, separate them with the line feed and new line combination (' ').

<?
class mime_decode {
    var $content     = Array();
    function mime_encode_headers($string) {
        if($string == "") return;
        if(!eregi("^([[:print:]]*)$",$string))
       $string = "=?ISO-8859-1?Q?".str_replace("+","_",str_replace("%","=",urlencode($string)))."?=";
        return $string;
    }
    function decode_mime_string($string) {
        if(($pos = strpos($string,"=?")) === false) return $string;
        while(!($pos === false)) {
       $newresult .= substr($string,0,$pos);
       $string = substr($string,$pos+2,strlen($string));
       $intpos = strpos($string,"?");
       $charset = substr($string,0,$intpos);
       $enctype = strtolower(substr($string,$intpos+1,1));
       $string = substr($string,$intpos+3,strlen($string));
       $endpos = strpos($string,"?=");
       $mystring = substr($string,0,$endpos);
       $string = substr($string,$endpos+2,strlen($string));
       if($enctype == "q") {
           $mystring = str_replace("_"," ",$mystring);
           $mystring = $this->decode_qp($mystring);
用Socket发送电子邮件--续篇    
作者:limodou    
  在前面我曾经写过一篇文章,介绍了如何利用socket编程来发送邮件,以解决web服务器不支持mail()函数的问题。经过我的测试也是可以使用的。但目前众多的免费邮件提供商(从263开始,163,新浪网也快开始了)均在smtp功能上增加了认证功能,使得原邮件发送类无法使用。在经过对相应smtp后续rfc的学习之后,经过了多次的试验,我终于试验成功了。于是怀着急迫的心情向大家介绍。
 
SMTP 认证功能介绍    
  此处不想向你详细介绍SMTP认证功能,因为我也说不清楚,详细的请参考[RFC 2554]规范。SMTP的认证功能主要是增加了AUTH命令。AUTH命令有多种用法,而且有多种认证机制。AUTH支持的认证机制主要有LOGIN,CRAM-MD5[注1]等。LOGIN应该是大多数免费邮件服务器都支持的,263与新浪都支持。而新浪还支持CRAM-MD5机制。认证机制一般只在真正发送邮件之前进行,而且只需要执行一次。当认证成功后,即可按原来正常的处理发送邮件。原理是口令-应答(Challenge-Response),即由服务器发送命令要求客户端回答,客户端根据服务器发送信息进行回答,如果应答通过了,则认证成功,即可继续处理。下面对这两种制作一个简单介绍。S:表示服务器返回,C:表示客户端发送。
 
LOGIN    
它应该比较简单。口令-应答过程如下:    
1     C: AUTH LOGIN    
2     S: 334 dXNlcm5hbWU6    
3     C: dXNlcm5hbWU6    
4     S: 334 cGFzc3dvcmQ6    
5     C: cGFzc3dvcmQ6    
6     S: 235 Authentication successful.    
1 为客户端向服务器发送认证指令。
 
2 服务端返回base64编码串,成功码为334。编码字符串解码后为“username:”,说明要求客户端发送用户名。
 
3 客户端发送用base64编码的用户名,此处为“username:”。
 
4 服务端返回base64编码串,成功码为334。编码字符串解码后为“password:”,说明要求客户端发送用户口令。
标签:[!--infotagslink--]

您可能感兴趣的文章: