У меня нет доступной установки 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 для обеих частей.