Django EmailMultiAl Альтернативы и отображение электронной почты в формате HTML в Outlook 2003 на Win2003 - PullRequest
2 голосов
/ 06 июня 2009

Я использую django.core.mail.EmailMultiAlternatives при отправке сообщений электронной почты из моего приложения django, чтобы убедиться, что сообщение переходит на текстовый, если почтовый клиент не поддерживает HTML.

Вот мой метод send_email:

def send_email(self, from_address, to_list, subject, msg_text, msg_html):
        subject=subject.replace('\r','').replace('\n',' ')
        self.msg = EmailMultiAlternatives(subject, msg_text, from_address, to_list)
        self.msg.attach_alternative(msg_html, "text/html")
        self.msg.content_subtype = "html"
        self.msg.send()

Отлично работает с Gmail, Hotmail и многими другими почтовыми клиентами - отображение содержимого HTML без проблем. Но он не будет отображать содержимое HTML в Outlook 2003, работающем на Win2003 - только текстовая версия.

Если я принудительно вставлю HTML в вызов EmailMultiAlternatives, то есть использую msg _html instead of msg _text, например:

self.msg = EmailMultiAlternatives(subject, msg_html, from_address, to_list)

тогда он работает корректно на всех клиентах; но это означает, что для клиентов, которые не поддерживают HTML или (что более вероятно), отключена поддержка этого текста, нет резервной копии текста.

Я думаю, что стоит упомянуть, что электронная почта генерируется в приложении django, работающем в Mac OS X (на тот случай, если это связано с различиями в символах конца строки между ОС).

Я вижу, что люди, использующие другие языки , имели похожие проблемы с outlook ...

Интересно, есть ли у кого-нибудь представление о том, ПОЧЕМУ внешний вид будет вести себя по-другому, и есть ли простое исправление, которое можно применить в моем коде?

1 Ответ

5 голосов
/ 08 июня 2009

У меня нет доступной установки Outlook для проверки этого, поэтому мне интересно узнать причину пятой строки в вашей функции.

self.msg.content_subtype = "html"

Я не знаю много о внутренних компонентах электронной почты, но в моей системе эта строка приводит к тому, что обе части сообщения имеют тип содержимого text / html. В противном случае выдается сообщение с «Content-Type: text / plain» в первой части и «Content-Type: text / html» во второй.

В любом случае, в одном из ответов на вопрос о Java упоминается изменение набора символов на iso-8859-1. Я думаю, вы должны сделать это с помощью django.core.mail.

Класс EmailMessage (от которого наследуются EmailMultiAlternatives) имеет атрибут с именем «encoding», который устанавливает кодировку для использования. По умолчанию это None, поэтому вместо него используется кодировка по умолчанию utf-8 (если не переопределена в настройках).

Другими словами, добавьте что-то вроде следующего перед строкой отправки в функции, указанной в вопросе:

self.msg.content_subtype = "iso-8859-1"

К сожалению, это изменит только кодировку, указанную в первой части (msg_text в функции выше). Кажется, что функция, которая присоединяет альтернативный контент, не использует атрибут кодирования. Я не уверен, что это правильный подход, но я подклассифицировал EmailMultiAl Альтернативы, чтобы переопределить соответствующую функцию, и, похоже, она работала нормально.

class EmailMultiAlternativesWithEncoding(EmailMultiAlternatives):
    def _create_attachment(self, filename, content, mimetype=None):
        """
        Converts the filename, content, mimetype triple into a MIME attachment
        object. Use self.encoding when handling text attachments.
        """
        if mimetype is None:
            mimetype, _ = mimetypes.guess_type(filename)
            if mimetype is None:
                mimetype = DEFAULT_ATTACHMENT_MIME_TYPE
        basetype, subtype = mimetype.split('/', 1)
        if basetype == 'text':
            encoding = self.encoding or settings.DEFAULT_CHARSET
            attachment = SafeMIMEText(smart_str(content,
                settings.DEFAULT_CHARSET), subtype, encoding)
            # original text being replaced above (not last argument)
            # attachment = SafeMIMEText(smart_str(content,
            #     settings.DEFAULT_CHARSET), subtype, settings.DEFAULT_CHARSET)
        else:
            # Encode non-text attachments with base64.
            attachment = MIMEBase(basetype, subtype)
            attachment.set_payload(content)
            Encoders.encode_base64(attachment)
        if filename:
            attachment.add_header('Content-Disposition', 'attachment',
                                  filename=filename)
        return attachment

Я не уверен, должна ли часть «smart_str (content, settings.DEFAULT_CHARSET)» также ссылаться на «кодирование», а не «settings.DEFAULT_CHARSET», но это - текст обработки текста сообщения (django.core.mail. EmailMessage.message).

Как я уже сказал, у меня нет Outlook, поэтому я не могу на самом деле протестировать аспект Outlook, но он, похоже, меняет кодировку на iso-8859-1 для обеих частей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...