ошибка unicode в python

В приведенном ниже коде я получаю сообщение об ошибке на mailServer.sendmail(gmailUser, m.to_addr, msg.as_string())

  2011-08-12 17:33:02,542 ERROR send exception Traceback (most recent call last): File "sendmail.py", line 33, in bulksend mailServer.sendmail(gmailUser, m.to_addr, msg.as_string()).replace(u'\xa0', '') File "/usr/lib/python2.4/email/Message.py", line 129, in as_string g.flatten(self, unixfrom=unixfrom) File "/usr/lib/python2.4/email/Generator.py", line 82, in flatten self._write(msg) File "/usr/lib/python2.4/email/Generator.py", line 113, in _write self._dispatch(msg) File "/usr/lib/python2.4/email/Generator.py", line 139, in _dispatch meth(msg) File "/usr/lib/python2.4/email/Generator.py", line 205, in _handle_multipart g.flatten(part, unixfrom=False) File "/usr/lib/python2.4/email/Generator.py", line 82, in flatten self._write(msg) File "/usr/lib/python2.4/email/Generator.py", line 113, in _write self._dispatch(msg) File "/usr/lib/python2.4/email/Generator.py", line 139, in _dispatch meth(msg) File "/usr/lib/python2.4/email/Generator.py", line 182, in _handle_text self._fp.write(payload) UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 173: ordinal not in range(128) o 

Это метод send :

  • Индекс Python элемента в списке без ошибок?
  • Войдите в Facebook, используя запросы python
  • Сопоставьте два списка букв в Python
  • Сокращение Python для нескольких условных выражений в выражении if
  • Как зафиксировать событие закрытия окна командной строки в python
  • Python: результаты группы по временным интервалам
  •  def send(request) qs = "......." if qs.count(): smaid = qs[0].id gmailUser = 'no-reply@xx.com' gmailPassword = 'xx' mailServer = smtplib.SMTP('smtp.gmail.com', 587) mailServer.ehlo() mailServer.starttls() mailServer.ehlo() mailServer.login(gmailUser, gmailPassword) tosend = MailQueue.objects.filter(school = smaid, send = 0) for m in tosend: msg = MIMEMultipart() msg['From'] = gmailUser msg['To'] = m.to_addr msg["Content-type"] = "text/html" sub = m.subject sub = sub.replace(u"\u2019"," ") msg['Subject'] = sub body = m.body body = body.replace(u"\u2019"," ") msg.attach(MIMEText(body, 'html')) mailServer.sendmail(gmailUser, m.to_addr, msg.as_string()) m.send = 1 m.save() mailServer.close() except: write_exception("send exception") 

  • SSLError: невозможно подключиться к URL-адресу HTTPS, потому что модуль SSL недоступен в Google App Engine
  • Понимание того, как создать кучу в Python
  • Найти новую папку в каталоге на Python
  • Pythonic способ игнорировать переменную управления контуром
  • Как «cd» в Python?
  • Как перезаписать предыдущую печать на stdout в python?
  • 4 Solutions collect form web for “ошибка unicode в python”

    Во-первых, у вас есть ошибка, которая не была запущена в строке перед вызовом sendmail. MIMEText по умолчанию пытается использовать кодировку ASCII. Это явно не работает для unicode. Вы считаете, что по умолчанию будет использовать utf-8, если будет принят un-ASCII unicode, но это не так. (Я считаю это ошибкой, но уже слишком поздно исправлять ее в Python2). Поэтому ваш код должен сообщить MIMEText, что кодировка использовать:

     msg.attach(MIMEText(body, 'html', 'utf-8')) 

    Но ваша ошибка возникает после шага MIMEText, который указывает, что он, вероятно, является unicode в ваших заголовках. Как уже упоминалось, вы не можете отправлять unicode в SMTP. Но ответ заключается не в том, чтобы закодировать его на utf-8. Вы не можете отправлять utf-8 поверх SMTP в заголовках (только в телах).

    Для правильного кодирования в кодировке Unicode в заголовках используйте класс заголовка (email.header.Header):

     msg['Subject'] = Header(sub, header_name='Subject') 

    Да, это боль. Это также немного уродливо, так как CTE кодирует весь заголовок, а не только части, которые не являются ASCII. Мы работаем над тем, чтобы сделать эту работу проще и лучше в Python3, но мы пока не совсем там.

    Адреса с юникодом в них сложнее. Вы должны использовать Header для кодирования отображаемого имени, а затем передать это formataddr:

     disp_name = u'some unicode string' addr = 'some@address.example.com' msg['To'] = formataddr((str(Header(disp_name)), addr)) 

    Этот адресный трюк не документирован. Многие программы emall для Python вызывают Header во всем заголовке адреса, но это приводит к недействительным результатам RFC (к счастью, многие почтовые программы обрабатывают декодирование в любом случае).

    Все это должно быть намного лучше в Python 3.3.

    SMTP не понимает unicode. Вы должны закодировать заголовки и тело сообщения на байтовые строки перед передачей их в SMTPLIB.

    Я бы порекомендовал вам использовать marrow.mailer вместо того, чтобы кататься самостоятельно. marrow.mailer уже кодирует все для вас, даже интернационализированные имена доменов.

    https://github.com/marrow/marrow.mailer

    Мне кажется, что когда вы выполняете msg.as_string() , библиотека в конце концов записывает его в файл-подобный объект, в котором возникает ошибка. Вероятно, объект ожидает кодировку ASCII, поэтому Unicode не поддерживается.

    Это msg.as_string() . Он терпит неудачу, потому что тело является unicode (вместо str ) и содержит некоторые кодовые точки выше 128.

    Чтобы исправить это, убедитесь, что тело в msg.attach(MIMEText(body, 'html')) имеет тип str , возможно, путем его кодирования.

     msg.attach(MIMEText(body.encode('utf-8'), 'html')) 

    Вам также нужно будет установить кодировку. Думаю, это будет:

     msg["Content-type"] = "text/html;charset=utf-8" 
    Python - лучший язык программирования в мире.