【问题标题】:InboundEmailMessage raises UnicodeDecodeError exceptionInboundEmailMessage 引发 UnicodeDecodeError 异常
【发布时间】:2013-10-11 20:39:43
【问题描述】:

在我的生产日志中,我看到许多错误,如下所示

0.1.0.20 - - [04/Oct/2013:11:07:03 -0700] "POST /_ah/mail/mail@myapp.appspotmail.com HTTP/1.1" 500 0 - - "myapp.appspot.com" ms=258 cpu_ms=27 app_engine_release=1.8.5 instance=00c61b117c920d68f9913bdef33c5b25f4288840

E 2013-10-04 22:07:03.434 
    'ascii' codec can't decode byte 0xd0 in position 0: ordinal not in range(128)
    Traceback (most recent call last):
      File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 1511, in __call__
        rv = self.handle_exception(request, response, e)
      File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 1505, in __call__
        rv = self.router.dispatch(request, response)
      File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 1253, in default_dispatcher
        return route.handler_adapter(request, response)
      File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 1077, in __call__
        return handler.dispatch()
      File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 547, in dispatch
        return self.handle_exception(e, self.app.debug)
      File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 545, in dispatch
        return method(*args, **kwargs)
      File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/webapp/mail_handlers.py", line 69, in post
        self.receive(mail.InboundEmailMessage(self.request.body))
      File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/api/mail.py", line 775, in __init__
        self.update_from_mime_message(mime_message)
      File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/api/mail.py", line 1337, in update_from_mime_message
        super(InboundEmailMessage, self).update_from_mime_message(mime_message)
      File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/api/mail.py", line 1246, in update_from_mime_message
        super(EmailMessage, self).update_from_mime_message(mime_message)
      File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/api/mail.py", line 1126, in update_from_mime_message
        subject = _decode_and_join_header(mime_message['subject'], separator=u'')
      File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/api/mail.py", line 591, in _decode_and_join_header
        for s, c in email.header.decode_header(header))
      File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/api/mail.py", line 591, in <genexpr>
        for s, c in email.header.decode_header(header))
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 0: ordinal not in range(128)

如何获得更多详细信息?我该如何正确处理这个异常?

【问题讨论】:

    标签: python google-app-engine email unicode decode


    【解决方案1】:

    我对这段代码没有 unicode 问题(没有InboundMailHandler):

    message = mail.InboundEmailMessage(request.body)
    msg_body = message.subject
    

    编辑:

    我在dev_appserver &gt; Inbound Mail 中使用"àèé" 在主题字段中进行了一些测试,并且主题是unicode,但如果您的msg_body 不是unicode,请找到带有type(msg_body) 的编解码器并首先解码主题。

    message = mail.InboundEmailMessage(request.body)
    msg_body = message.subject # if unicode or
    msg_body = message.subject.decode("ascii") # if ascii then
    _str = msg_body.encode("utf-8") # str
    

    【讨论】:

    • 谢谢。我遇到的主要问题是,这个问题只发生在一些电子邮件上,而不是所有电子邮件。甚至在我开始解析它之前。我什至不确定如何获取导致此问题的消息的详细信息。
    • 抛开InboundMailHandler可以帮助调试。只有在发现“奇怪”字符时,您的应用才会引发 unicode 错误。在您提交的情况下是主题。顺便说一句,py27 中的编码是一个黑洞。
    • 我是否正确理解您建议使用webapp2.RequestHandler/post 而不是InboundMailHandler?
    • 不管我还没有解决它,我给你赏金 - 你给了我一个如何进一步调试它的想法。谢谢。
    • 谢谢,没必要。你试过message.subject.decode()吗?
    【解决方案2】:
    import base64
    
    message_raw = request.body.encode('UTF-8')
    message_decoded = base64.urlsafe_b64decode(message_raw)
    message = InboundEmailMessage(message_decoded)
    

    【讨论】:

      猜你喜欢
      • 2016-04-25
      • 1970-01-01
      • 2014-10-25
      • 1970-01-01
      • 1970-01-01
      • 2016-08-31
      • 2013-08-02
      • 2012-10-10
      • 1970-01-01
      相关资源
      最近更新 更多