Как заменить / перезаписать заголовок по умолчанию EmailMultiAlternatives - PullRequest
1 голос
/ 14 мая 2019

Среда: Ubuntu 18.10, Python 2.7.15, Django 1.11.16

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

msg = EmailMultiAlternatives(some_subject, some_body, 'from@some-domain.com', ['to@some@domain'])

img_data = open('path/to/image.png', 'rb').read()
img = MIMEImage(img_data)
msg.attach(img)

msg.send()

(я включил только тот код, который, на мой взгляд, уместен, но я могу добавить больше по требованию.)

Вышеуказанное правильно работает, и изображениеправильно отображается на большинстве почтовых клиентов (около 7 из них, мобильных, настольных или веб-почты), на которых я тестировал, с двумя исключениями: Mozilla Thunderbird 60 и некоторые собственные почтовые клиенты macOS.

В Thunderbirdизображение отображается не в строке, а в самом конце сообщения.На клиенте macOS изображение отображается встроенным, но, кроме того, оно также отображается в самом конце сообщения.

Я составил и отправил тестовое сообщение из другого почтового клиента, содержащее встроенное изображение, которое отображалось правильнокак на Thunderbird, так и на macOS.Я сравнил заголовки этого сообщения с заголовками сообщения, созданного моим кодом.

Я заметил, что для ошибочного сообщения 'Content-Type' установлено на 'multipart/mixed', в то время как правильно отображаемое сообщение имеет тот же заголовок, установленный на 'multipart/related'.

Я сохранил ошибочное сообщение в файле eml, вручную изменил значение этого заголовка и затем загрузил сообщение в Thunderbird.Сообщение было правильно отображено, и изображение было в нужном месте.

Если бы я мог установить для этого заголовка правильное значение, проблема была бы решена.

Итак, мой вопрос: есть ли возможность указать EmailMultiAlternatives установить 'Content-Type' : 'multipart/related' вместо значения по умолчанию 'multipart/mixed'?

Я попытался добавить заголовок, как этоно он не работает:

msg = EmailMultiAlternatives(some_subject, some_body, 'from@some-domain.com', ['to@some@domain'], headers={'Content-Type' : 'multipart/related'})

Я получил следующую ошибку (я использую Amazon SES):

400 Bad Request
<ErrorResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
  <Error>
    <Type>Sender</Type>
    <Code>InvalidParameterValue</Code>
    <Message>Duplicate header 'Content-Type'.</Message>
  </Error>
  <RequestId>xxxxxxxxxx</RequestId>
</ErrorResponse>

Если я не могу изменить этот заголовок, вы предлагаете какие-либо альтернативы

1 Ответ

1 голос
/ 14 мая 2019

Если вы посмотрите на исходный код, вы увидите, что EmailMultiAlternatives является подклассом EmailMessage, который сам имеет атрибут класса:

mixed_subtype = 'mixed'

Так что, если вы создадите свой собственный подкласс, чтобы переопределить это, вы должны получить то, что вам нужно:

class EmailMultiAlternativesRelated(EmailMultiAlternatives):
    mixed_subtype = 'related'

Вот и все, теперь вы просто используете этот новый класс, и он будет использовать "multipart / related".

(метод _create_attachments() передает этот подтип в SafeMIMEMultipart Python, который создает фактические заголовки для каждого вложения.)

...