2006-04-01

对了,你在命令后面加回车了么?

小张这些日子正在做某邮件软件的Gmail 支持,但是似乎遇到了没有办法逾越的障碍。因为,大多数的邮件服务器商都未采用基于Ssl连接的Pop3协议,所以这个邮件软件原本没有这个功能。然而Gmail只支持基于Ssl连接的Pop3协议,所以小张的任务就是给邮件软件增加基于Ssl连接的Pop3协议的功能。

被折磨两三天后,小张来问我有什么建议。

Tiny:“那么,协议看了么?基于Ssl连接的Pop3协议有啥区别么?”

小张:“看起来没什么大区别,但是不知道是不是有什么要加密的认证流程。”

Tiny:“那么现在能连接到服务器了么?”

小张:“可以了,使用了OpenSsl的库,Gmail的服务器返回一个信息 "+OK Gpop ready q36pf3852152pyg" ”

Tiny:“根据Pop3协议的约定,这代表你的连接很正确,然后你给他发User和Pass了么?”

小张:“问题就在这里,我发送了User和Pass但是服务器一点反应都没有。”

Tiny:“哦?连 -ERR 信息都没有么?”

小张:“一点反应都没有。你说是那里错了呢?”

Tiny:“哦,我试试看。”

我懒得现写一个程序了,打开Firefox输入 https://pop.gmail.com:995/ 一回车,立刻响应如下:
+OK Gpop ready q36pf3852152pyg
-ERR bad command q36pf3852152pyg
-ERR bad command q36pf3852152pyg
-ERR bad command q36pf3852152pyg
-ERR bad command q36pf3852152pyg
-ERR bad command q36pf3852152pyg
-ERR bad command q36pf3852152pyg
-ERR bad command q36pf3852152pyg
-ERR bad command q36pf3852152pyg
-ERR bad command q36pf3852152pyg
-ERR bad command q36pf3852152pyg
这说明,我们这边的网络连接Gmail的服务器很快,而且反应也正确啊。那么小张的程序问题在哪里呢?

小张:“郝哥,是不是我们发信息的顺序不对呢?或者手里面的协议写的不全面?”

我心说,这不太对,协议对错无所谓,为什么服务器没有响应呢?无所谓,我们先看看正确的协议是怎样的。这时想到Outlook Express有日志功能,我打开Outlook Express配置好我的Gmail账号。然后在选择菜单“工具-〉选项”,然后在选项对话框的维护页,选择记录邮件的访问日志。(这个日志会保存在上面设定的存储文件夹。)

OE选项对话框的维护页可以打开邮件访问的日志

然而,从日志可以很清晰看到,基于Ssl连接的Pop3协议跟普通的Pop3协议没有任何本质区别。

POP3: 22:39:21 [rx] +OK Gpop ready 36pf3567290nza
POP3: 22:39:21 [tx] USER tinyfool
POP3: 22:39:22 [rx] +OK send PASS
POP3: 22:39:22 [tx] PASS *********
POP3: 22:39:22 [rx] +OK Welcome.
POP3: 22:39:22 [tx] STAT
POP3: 22:39:22 [rx] +OK 26 8139171
POP3: 22:39:23 [tx] LIST
POP3: 22:39:23 [rx] +OK 26 messages (8139171 bytes)
POP3: 22:39:23 [rx] 1 9268
POP3: 22:39:23 [rx] 2 3827
POP3: 22:39:23 [rx] 3 616929
POP3: 22:39:23 [rx] 4 27164
POP3: 22:39:23 [rx] 5 13456
POP3: 22:39:23 [rx] 6 1854
POP3: 22:39:23 [rx] 7 6078693
POP3: 22:39:23 [rx] 8 3139
POP3: 22:39:23 [rx] 9 10862
POP3: 22:39:23 [rx] 10 53442
POP3: 22:39:23 [rx] 11 343820
POP3: 22:39:23 [rx] 12 29832
POP3: 22:39:23 [rx] 13 86862
POP3: 22:39:23 [rx] 14 667057
POP3: 22:39:23 [rx] 15 2336
POP3: 22:39:23 [rx] 16 25130
POP3: 22:39:23 [rx] 17 14377
POP3: 22:39:23 [rx] 18 6795
POP3: 22:39:23 [rx] 19 40428
POP3: 22:39:23 [rx] 20 11224
POP3: 22:39:23 [rx] 21 18744
POP3: 22:39:23 [rx] 22 20920
POP3: 22:39:23 [rx] 23 17022
POP3: 22:39:23 [rx] 24 12724
POP3: 22:39:23 [rx] 25 17125
POP3: 22:39:23 [rx] 26 6141
POP3: 22:39:23 [rx] .
POP3: 22:39:23 [tx] RETR 1
POP3: 22:39:23 [rx] +OK message follows
POP3: 22:39:37 [tx] RETR 2
POP3: 22:39:37 [rx] +OK message follows
POP3: 22:39:39 [tx] RETR 3
POP3: 22:39:39 [rx] +OK message follows
POP3: 22:41:16 [tx] RETR 4
POP3: 22:41:17 [rx] +OK message follows
POP3: 22:41:20 [tx] RETR 5
POP3: 22:41:20 [rx] +OK message follows
POP3: 22:41:21 [tx] RETR 6
POP3: 22:41:22 [rx] +OK message follows
POP3: 22:41:22 [tx] RETR 7
POP3: 22:41:23 [rx] +OK message follows
那么,小张的问题是什么呢?协议显然没错,而且他也连接到服务器了。真奇怪。

这时候,我突然想起,我还没看到小张的代码呢,万一他犯了一些低级错误呢?98年我第一次写Pop3服务器的时候就犯过一个错误,在返回信息后面没有添加回车,结果客户端就不会响应。

于是,我问小张:“对了,你在命令后面加回车了么?”

小张摸了摸头,“那后面还需要加回车的么?”

Tiny:“…………………………………………”

问题就这么解决了,不知道小张学到了什么,我希望他学会在对手里面的资料疑惑的时候,如何通过设计实验来验证他们的正确性。以及如何更仔细的看自己手里面的资料,相信协议文档里面写明了,需要回车。

而我呢?也许应该在这孩子开始跟我抱怨的时候,就先去看看他的代码,呵呵。人总是会犯一些看似很愚蠢的低级错误的,这跟智力无关,这往往是因为经验不足,或者粗心。

Technorati Tags: , , , ,

请不要吝惜您的评论,每一条评论,都是我在漫漫长夜前行的力量

8 条评论:

Anonymous Tiger 说...

我昨天也是被一个愚蠢的问题给耍了,越是愚蠢的问题越难解决,也越耗时间。

11:14 下午

 
Anonymous Tiger 说...

怕了

11:15 下午

 
Anonymous Huk 说...

这样的问题教会了我们,如何在资讯海洋中找到正确答案最是关键。

11:20 下午

 
Blogger 猛禽 说...

我当年第一次实现POP3客户端时也犯过忘记回车的低级错误。-_-

8:51 下午

 
Blogger tiny 说...

看来这个低级错误是成为高手的必由之路啊!

12:55 上午

 
Anonymous Victor Lue 说...

有个问题我至今没法解释。 98年我在客户家,打印机不好使。 重插,重装,换驱动,换线能换的都换了,就是不行。 后来计算机上换了根内存条就好使了。

11:17 上午

 
Blogger tiny 说...

这个问题很好解释啊,内存不好造成系统不稳定,这是很常见的问题

11:22 上午

 
Anonymous 匿名 说...

嘿嘿,这么巧,刚昨天我犯了这个错误,忘了加回车符,也是没反应.

3:04 下午

 

发表评论

<< 主页