Электронная почта Django utf-8 поставляется с поврежденными символами

У меня проблема с отправкой писем с русским текстом с моего сервера. Я отправляю электронные письма следующим образом:

from django.core.mail import EmailMultiAlternatives
message = EmailMultiAlternatives(
    'some subject',
    '',
    '[email protected]',
    ['[email protected]']
)
message.attach_alternative(unicode_text_with_html, "text/html")
message.send()

Когда это письмо приходит на почтовый сервис (например, gmail.com) иногда встречается пара испорченных символов - Ð � вместо буквы. Другие буквы (даже те же буквы) не повреждаются. Когда я указываю кодировку cp1251 (т.е. message.encoding = 'cp1251'), электронные письма не повреждаются. Но есть почтовые сервисы, которые не принимают кодировку cp1251 и выдают пользователю ошибку, когда он пытается прочитать сообщение.

Когда я использую сервер электронной почты на основе файлов с кодировкой utf-8, я также не получаю поврежденных символов в теле сообщения. И кодировка установлена ​​​​в utf-8.

Интересно, как можно так разбить сообщение в кодировке utf-8. Могу ли я что-нибудь сделать, чтобы избавиться от этих символов?

P.S.: Я использую Postfix в качестве почтового сервера для отправки писем.

ОБНОВЛЕНИЕ: На моем тестовом сервере ситуация была точно такой же. Я удалил Postfix и заменил его Qmail. Все работало нормально. Я поменял его обратно, и символы снова вернулись. Итак, мое последнее предположение состоит в том, что это проблема Postfix. Попробую настроить конфиг.


person PukeCloud    schedule 13.12.2013    source источник
comment
Пробовали ли вы использовать файл ugettext Django _(unicode_text_with_html)   -  person yuvi    schedule 13.12.2013
comment
Интересно, как это может помочь. Только что попробовал это, и это ничего не сделало.   -  person PukeCloud    schedule 13.12.2013


Ответы (2)


Я бы подумал о добавлении только этих строк:

#-*- coding: utf-8 -*-
from __future__ import unicode_literals

Это помогло мне избавиться от ошибок, таких как:

'ascii' codec can't encode character u'\u0119' in position 6: ordinal not in range(128)
person andilabs    schedule 28.10.2014

Вам нужно запустить его через что-то вроде php htmlentities(), чтобы преобразовать все нераспознанные символы в безопасные объекты html. В вашем случае преобразуется в это: Ð

В качестве альтернативы есть несколько веб-конвертеров, некоторые из которых перечислены >в этом ответе.

person John    schedule 13.12.2013
comment
Дело в том, что каждый символ распознается и в порядке. Когда я отправляю точно такое же электронное письмо через бэкэнд Gmail, все в порядке. Подозреваю, что проблема где-то в настройках постфикса - person PukeCloud; 13.12.2013