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

 更新时间:2016年11月25日 17:02  点击:2456
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--]

相关文章

  • 使用percona-toolkit操作MySQL的实用命令小结

    1.pt-archiver 功能介绍: 将mysql数据库中表的记录归档到另外一个表或者文件 用法介绍: pt-archiver [OPTION...] --source DSN --where WHERE 这个工具只是归档旧的数据,不会对线上数据的OLTP查询造成太大影响,你可以将...2015-11-24
  • Linux中grep命令详解

    grep命令是Linux系统中最重要的命令之一,功能是从文本文件或管道数据流中筛选匹配的行和数据,如果再配合正则表达式,功能十分强大,是Linux运维人员必备的命令,这篇文章主要介绍了Linux中grep详解,需要的朋友可以参考下...2023-02-15
  • C#隐式运行CMD命令(隐藏命令窗口)

    这篇文章主要介绍了C#隐式运行CMD命令(隐藏命令窗口),本文实现在winform窗口中运行CMD命令,需要的朋友可以参考下...2020-06-25
  • PHP实现连接设备、通讯和发送命令的方法

    本文实例讲述了PHP实现连接设备、通讯和发送命令的方法。分享给大家供大家参考。具体如下:开发的BS架构的软件(PHP),需要跟设备进行通讯,在此记录一下,欢迎各位指正:1. 采用php socket技术使用TCP/IP连接设备参数$service_po...2015-10-21
  • 对MySQL日志操作的一些基本命令总结

    MySQL日志主要包含:错误日志、查询日志、慢查询日志、事务日志、二进制日志;日志是mysql数据库的重要组成部分。日志文件中记录着mysql数据库运行期间发生的变化;也就是说用来记录mysql数据库的客户端连接状况、SQL语句...2015-11-24
  • Mysql命令大全(详细篇)

    一、连接Mysql格式: mysql -h主机地址 -u用户名 -p用户密码1、连接到本机上的MYSQL。首先打开DOS窗口,然后进入目录mysql/bin,再键入命令mysql -u root -p,回车后提示你输密码.注意用户名前可以有空格也可以没有空格,但是密...2015-11-08
  • 查看Redis内存信息的命令

    Redis 是一个开源、高性能的Key-Value数据库,被广泛应用在服务器各种场景中。本文介绍几个查看Redis内存信息的命令,包括常用的info memory、info keyspace、bigkeys等。...2021-01-15
  • 解决jmap命令打印JVM堆信息异常的问题

    这篇文章主要介绍了解决jmap命令打印JVM堆信息异常的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-12-04
  • MySQL的常用命令集锦

    下面是我们经常会用到且非常有用的MySQL命令。下面你看到#表示在Unix命令行下执行命令,看到mysql>表示当前已经登录MySQL服务器,是在mysql客户端执行mysql命令。 登录MySQL,如果连接远程数据库,需要用-h指定hostname。登...2015-11-24
  • C#实现的调用DOS命令操作类实例

    这篇文章主要介绍了C#实现的调用DOS命令操作类,实例分析了C#调用系统常用DOS命令的相关技巧,非常具有实用价值,需要的朋友可以参考下...2020-06-25
  • shell脚本批量复制及执行命令的示例详解

    这篇文章主要介绍了批量复制及执行命令shell脚本,本文通过列举几个示例给大家详细介绍,对大家的工作或学习具有一定的参考借鉴价值,需要的朋友可以参考下...2020-07-11
  • 在docker中执行linux shell命令的操作

    这篇文章主要介绍了在docker中执行linux shell命令的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-30
  • 一条命令重启所有已停止的docker容器操作

    这篇文章主要介绍了一条命令重启所有已停止的docker容器操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-20
  • Redis常用数据类型命令实例汇总

    这篇文章主要介绍了Redis常用数据类型命令实例汇总,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2021-01-15
  • MySQL中的binlog相关命令和恢复技巧

    操作命令:复制代码 代码如下:show binlog events in 'mysql-bin.000016' limit 10;reset master 删除所有的二进制日志flush logs 产生一个新的binlog日志文件show master logs; 或者 show binary logs; 查看二进制文...2014-05-31
  • Redis Scan命令的基本使用方法

    这篇文章主要给大家介绍了关于Redis中Scan命令的基本使用方法,文中通过示例代码介绍的非常详细,对大家学习或者使用Redis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2021-01-15
  • POP3协议命令原始码及工作原理

    http://www.linuxforum.net Jephe Wu (2001-04-21 18:17:49) 一 简介: 1. POP适用于C/S结构的脱机模型的电子邮件协议,目前已发展到第三版,称POP3。脱机模型即不能在...2016-11-25
  • Zabbix远程执行命令的示例详解

    这篇文章主要介绍了Zabbix远程执行命令,本文主要配置验证zabbix执行远程命令的相关知识,通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值 ,需要的朋友可以参考下...2021-05-07
  • ubuntu下使用SQLite3的基本命令

    sqlite3一款主要用于嵌入式的轻量级数据库,本文旨在为熟悉sqlite3基本命令提供技术文档。希望对读者们有所帮助,如有疑问请和我联系,尽可能解答...2020-07-11
  • python之pyinstaller组件打包命令和异常解析实战

    前段时间在制作小工具的时候,直接在命令行用pyinstaller工具打包成功后,启动exe可执行文件的时候各种报错, 今天,我们就分享一下踩坑经过,需要的朋友可以参考下...2021-09-20