ExtMail Webmail 出现unknow.bin的分析与补丁
Hi all:论坛有用户反映webmail读新邮件(带附件)时第一次下栽附件提示unknow.bin,返回邮件列表再读邮件就正常,而使用EMOS或maildrop的朋友却从未遇到此问题(1.0.5版本以后)。
[b]问题概述[/b]
在论坛的朋友gaosheng_guo 协助下,终于分析清楚出现这个情况的原因,主要原因是由于maildir_find() 函数中,处理文件名的正则表达式不完善,只考虑了Maildir++的规范,而没有考虑好对Maildir(最原始版本)的支持,导致了这个bug。一般情况下谁也不会考虑到问题在此,例如:
virtual或其他不支持Maildir++的MDA产生的文件名:
[quote]
1236886591.Vfd02I7944afM711851.mail.example.com:2,A
[/quote]
maildrop或其他支持Maildir++的MDA产生的文件名:
[quote]
1236847295.M577390P24666V0000000000000908I00000000015601BA_0.mail.example.com,S=1242:2,A
[/quote]
可以看到Maildir++在文件名已附带了该文件的大小(S=xxx),而不支持Maildir++的则不包含此内容。
maildir_find() 函数只对S=xxx形式进行处理,没兼容到不包括此特征内容的情况,因此产生了unknow.bin的问题。
[b]解决方法[/b]
请打以下补丁:
[quote]
--- extmail-1.0.7/libs/Ext/Storage/Maildir.pm 2009-03-04 23:59:27.000000000 +0800
+++ extmail/libs/Ext/Storage/Maildir.pm 2009-03-12 16:45:03.000000000 +0800
@@ -687,13 +687,13 @@
return "" unless($file); # check $file null or not
return $file if (-r _name2mdir($fd).'/cur/'.$file);
- $file=~s/,S=\d+.*//; # the static part
+ $file =~ s/(:?,S=\d+)*:2,.*$//; # the static part
opendir DIR, _name2mdir($fd).'/cur/' or die "Error $!\n";
my @lists = grep { !/^\./ } readdir DIR;
close DIR;
for(@lists) {
my $tmpname = $_;
- $tmpname =~ s/,S=\d+.*//;
+ $tmpname =~ s/(:?,S=\d+)*:2,.*$//;
if($tmpname eq $file) {
if(m#/#) {
s/.*\/([^\/]+)$/$1/; # save the filename
[/quote]
[b]受影响版本[/b]
Webmail 1.0.x 全部版本 添加到1.07就是了,顺便升级版本号1.07p1。 呵呵。主要是很多人遇到此问题,都感觉到莫名其妙,就赶紧发布先。
这个补丁将会在1.0.8里出现的。 谢谢, 狂顶! 还好,我们的是1236847295.M577390P24666V0000000000000908I00000000015601BA_0.mail.example.com,S=1242:2,A 顶~~~~~~:victory: 我也中招了,按楼主说的改了两行就行了,呵呵~:lol 请问楼主,是不是
加
$file =~ s/(:?,S=\d+)*:2,.*$//; # the static part
$tmpname =~ s/(:?,S=\d+)*:2,.*$//;
减
$file=~s/,S=\d+.*//; # the static part
$tmpname =~ s/,S=\d+.*//;
可是我去看了,我的版本是1.0.1的,但是我里面,已经是像楼主说的那样的了。这是怎么回事?
页:
[1]