Mailman2.1.9系统的一些BUG修复
1、邮件列表归档中文乱码问题。
A.错误描述:如果客户端发送的邮件编码为GB2312编码,则当把邮件归档时,会出现信体为乱码的现象。
B.问题分析:经过对邮件原文的分析,邮件本身没有问题,信头上也有编码信息,比如我发送的测试信信体为:
- ------=_NextPart_000_0180_01CB096D.0DEF1A50
- Content-Type: text/plain;
- charset="gb2312"
- Content-Transfer-Encoding: base64
- 1eLKx9K7t+K3otfUT3V0bG9va7XEsuLK1NPKvP6jrNPKvP6x4MLrzqqjukdCMjMxMg0KDQpUaGlz
- IGlzIGEgdGVzdCBtYWlsIHNlbmRlZCBieSBPVVRMT09LLCBhbmQgaXShr3MgZW5jb2RpbmcgYnkg
- R0IyMzEyLi4NCg0KIA0KDQpIYW5kYW9saWFuZw0KDQq6q7XAwcENCg0K
- ------=_NextPart_000_0180_01CB096D.0DEF1A50
经过对信体进行Base64解码,发现信体信息正常,编码正常。这就跟踪到问题可能出现在解码的模块。经过读代码发现,Mailman是调用pipermail进行解码的,据此跟踪到信体的解解码在HyperArch.py模块的Article类里完成。
C.问题修正:在Article类里加入编码判断并进行转码:
- if body and charset != Utils.GetCharSet(self._lang):
- # decode body
- try:
- #body = body.decode(charset)
- if charset == 'gb2312':
- body = body.decode(charset, 'ignore').encode(Utils.GetCharSet(self._lang))
- else:
- body = unicode(body, charset)
- except (UnicodeError, LookupError):
- body = None
2、邮件列表的List页面乱码问题:
A.问题描述:在Mailman2.1.9版本中,如果管理员后台设置了语言为中文,而系统又没有进行编码设置,那么Mailman邮件列表中文界面极有可能显示为乱码。
B.问题分析:通过查看网页源代码发现,此时的编码为“us-ascii”,这是默认的编码。再检查模板,发现模板的编码都是UTF-8,此时编码是混淆的。
C.修正:更改Default.py或者mm_cfg.py文件,把zh_CN编码改成:add_language('zh_CN', _('Chinese (China)'), 'utf-8')。
3、脚本change_pw无法找到列表错误。
A.错误描述:当邮件列表的名字有大小写字母时,会出现无法修改邮件列表的错误,例如:
当我在命令行下输入:./change_pw --listname=Mailman-dev-test --password=123456,此时可能出现:No such list "Mailman-dev-test"的错误。
B.问题分析:这是因为没有把所有字母转成小写的缘故,邮件列表在本地都存储为小写。如果没有转换,则Mailman/MailList.py模块第616会抛出:Errors.MMUnknownListError错误:
- if not Utils.list_exists(self.internal_name()):
- raise Errors.MMUnknownListError
C. 修正:在change_pw脚本的openlist方法中,将传入的listname转成小写:
- listname = listname.lower().strip()