smtplib、Unicode与OpenERP核心的问题
我现在正在开发一个模块,用于OpenERP 6.1.1(python 2.7),这个模块需要在多个工作流程状态变化时发送邮件通知。到目前为止,这听起来很简单。当我配置一个ir.mail_server实例并想要测试它时,却遇到了以下异常:
Server Traceback (most recent call last):
File "/opt/openerp61/server/openerp/addons/web/common/http.py", line 592, in send
result = openerp.netsvc.dispatch_rpc(service_name, method, args)
File "/opt/openerp61/server/openerp/netsvc.py", line 360, in dispatch_rpc
result = ExportService.getService(service_name).dispatch(method, params)
File "/opt/openerp61/server/openerp/service/web_services.py", line 572, in dispatch
res = fn(db, uid, *params)
File "/opt/openerp61/server/openerp/osv/osv.py", line 167, in execute_kw
return self.execute(db, uid, obj, method, *args, **kw or {})
File "/opt/openerp61/server/openerp/osv/osv.py", line 121, in wrapper
return f(self, dbname, *args, **kwargs)
File "/opt/openerp61/server/openerp/osv/osv.py", line 176, in execute
res = self.execute_cr(cr, uid, obj, method, *args, **kw)
File "/opt/openerp61/server/openerp/osv/osv.py", line 164, in execute_cr
return getattr(object, method)(cr, uid, *args, **kw)
File "/opt/openerp61/server/openerp/addons/base/ir/ir_mail_server.py", line 191, in test_smtp_connection
smtp_debug=smtp_server.smtp_debug)
File "/opt/openerp61/server/openerp/addons/base/ir/ir_mail_server.py", line 241, in connect
connection.login(user, password)
File "/usr/lib/python2.7/smtplib.py", line 598, in login
(code, resp) = self.docmd(encode_cram_md5(resp, user, password))
File "/usr/lib/python2.7/smtplib.py", line 562, in encode_cram_md5
response = user + " " + hmac.HMAC(password, challenge).hexdigest()
File "/usr/lib/python2.7/hmac.py", line 72, in __init__
self.outer.update(key.translate(trans_5C))
TypeError: character mapping must return integer, None or unicode
问题看起来很明显,因为传递给smtplib.SMTP.login()的用户名和密码是unicode编码的,而HMAC不喜欢这个。如果我“修复”OpenERP的核心,把这些参数转换成字符串,一切似乎都正常工作。至少ir.mail_server的“测试连接”功能是这么说的。
由于我在这个项目中同时学习OpenERP和Python,所以我不知道接下来该怎么做,因为几乎没有人提到过遇到这个问题。因此,我猜测可能是我的开发环境有些“问题”,导致了这个错误。我可以选择把这个核心补丁留着继续开发,但这并不是一个好主意,因为这可能会在未来某天给我带来麻烦。
如果有人能提供一些建议,那就太好了。
1 个回答
3
你说得对,HMAC不支持unicode字符。你可以采取以下措施来解决这个问题,前提是你在用户名和密码中只使用ASCII字符。(你需要自己修改/opt/openerp61/server/openerp/addons/base/ir/ir_mail_server.py
文件的第241行来应用这个修复)
connection.login(str(user), str(password))
关于这个问题,Trac中有一个bug: