2016-04-28 28 views
0

我在理解rfc4978时遇到了一些问题。
据我所知,服务器返回OK包括命令名称后,所有东西都被压缩。然而,似乎我误解了几件事(因为[Gmail]/sfgs没有重命名,显然该文件没有发送)如何通过Openssl使用imap压缩与shell中的imap服务器通话?

$ cat deflatecommands /dev/stdin | socat - OPENSSL:imap.googlemail.com:993,compress=none 
* CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA ID XLIST CHILDREN X-GM-EXT-1 UIDPLUS COMPRESS=DEFLATE ENABLE MOVE CONDSTORE ESEARCH UTF8=ACCEPT APPENDLIMIT=35882577 LIST-EXTENDED LIST-STATUS 
a001 OK [email protected] authenticated (Success) 
a002 OK Success 
2016/04/28 21:47:03 socat[16204.25769803872] E SSL_write(): Broken pipe 

其中deflatecommands包含:

a001 LOGIN myus.tyer mypassord 
a002 COMPRESS DEFLATE 
xÚK400VrõsôuUPŠvÏMÌ̉Õ/NK/[email protected]‰— Ô) 

其解压缩,得到:

a001 LOGIN myus.tyer mypassord 
a002 COMPRESS DEFLATE 
a003 RENAME "[Gmail]/sfgs" "[Gmail]/xxxxxxxxxxx" 

deflatecommands当然的使用未压缩和压缩部分crfl行结尾。

$ openssl zlib a003 > a003.zlib 
$ cat a001 a002 a003.zlib > defaltecommands 
+0

由于我的连接速度,最后一件事情,没有任何事情发送之前'a002 OK Success'if打印在屏幕上。 – user2284570

+0

我不确定这会起作用。所有三个命令都将在一个数据包中发送,但服务器在启用压缩时可能会刷新输入缓冲区。您可能需要在压缩和压缩命令之间暂停。另外,如果压缩部分中存在CRLF,那也是一个问题。您需要以二进制模式编辑文件,并确保没有明文CRLF。 – Max

+0

@Max:''003.zlib'中没有未压缩的ᴄʀʟꜰ。再次,没有任何压缩的字节在GImap返回“OK成功”之前发送。 – user2284570

回答

0

为什么你需要从壳谈IMAP: deflatecommands与创造的呢?虽然我赞赏您选择IMAP确实支持的繁重流水线操作,但所允许的流水线命令存在限制。 LOGIN理论上是安全的,但我不会在等待它的结果之前亲自排队任何东西(并且这是您的天真外壳管道将达到其极限的时刻)。 COMPRESS DEFLATE不是以任何方式安全管道,因为服务器必须打开透明压缩。在很多语言中,这通常涉及各个层上的网络缓冲区的刷新。

为什么在激活COMPRESS扩展时会使整个事情变得复杂?这绝不是必要的,在这种特殊情况下它不会真的为您节省任何可测量的字节数量。

+0

'这并不是必须的,在这种特殊情况下,它不会真的为你节省任何可测量的字节数。'**这是错误的!**我正计划发送一些大的数据,但是一旦压缩后就会给出50Mb 。传统的电子邮件客户端太大而无法完成,并且如果解压缩的话,在243Kb/s *(上传速度)*互联网连接上会花费太多时间。请不要以为我试图解决错误的问题。 http://stackoverflow.com/q/14959461/2284570 *(事实上,我现在使用一个小的shell脚本在继续之前等待服务器响应)*。 – user2284570

+0

祝你好运,试图将“GB大”保存到GMail中。无论如何,你选择使用shell脚本,好吧,你将不得不面对诱发的痛苦。 –