smtplib、Unicode与OpenERP核心的问题

2 投票
1 回答
720 浏览
提问于 2025-04-17 15:07

我现在正在开发一个模块,用于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:

http://bugs.python.org/issue5285

撰写回答