1

In my production log I see many errors like below

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)

How can I get more details what happens? How could I properly handle this exception?

LA_
  • 19,823
  • 58
  • 172
  • 308

2 Answers2

1

I have no unicode problems with this code (without the InboundMailHandler):

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

edit:

I have made some tests in dev_appserver > Inbound Mail with "àèé" in subject field and the subject is a unicode but if your msg_body is not unicode, find the codec with type(msg_body) and decode the subject first of all.

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
Gianni Di Noia
  • 1,577
  • 10
  • 25
  • THanks. The main problem I have is that this problem happens with just some emails, not with all of them. And even before I start parsing it. I am even not sure how to get details of the message, which causes this problem. – LA_ Nov 10 '13 at 14:31
  • Put aside `InboundMailHandler` can help to debug. Your app raise the unicode error only when find "strange" characters. In the case that you submit is subject. btw, encoding in py27 is a black hole. – Gianni Di Noia Nov 10 '13 at 15:25
  • Do I understand you correctly that you suggest to use `webapp2.RequestHandler`/`post` instead of `InboundMailHandler`? – LA_ Nov 10 '13 at 15:32
  • Regardless of the fact that I still haven't resolved it, I am giving you the bounty - you gave me an idea how to debug it further. Thank you. – LA_ Nov 14 '13 at 18:47
  • thank you, it was not necessary. Have you tried with `message.subject.decode()`? – Gianni Di Noia Nov 14 '13 at 22:58
0
import base64

message_raw = request.body.encode('UTF-8')
message_decoded = base64.urlsafe_b64decode(message_raw)
message = InboundEmailMessage(message_decoded)
espeed
  • 4,754
  • 2
  • 39
  • 51