pyramid_mailer `Message` и` Content-Transfer-Encoding` - PullRequest
0 голосов
/ 21 января 2019

Я отправляю электронные письма с pyramid_mailer и обнаружил эту странную проблему, заключающуюся в том, что при использовании Office365 в качестве SMTP-сервера в мое сообщение добавляются случайные символы =. Я не получаю эту проблему с любым другим почтовым сервером (я проверял это с Gmail, а также с моим собственным постфиксным сервером)

Я отправляю электронные письма, как показано ниже:

from pyramid_mailer.mailer import Mailer

from pyramid_mailer.message import Attachment, Message

mailer = Mailer()
mailer.smtp_mailer.hostname = "test.mail.at.office365"
mailer.smtp_mailer.username = "my_user"
mailer.smtp_mailer.password = "secret"
mailer.smtp_mailer.port = 587
mailer.smtp_mailer.tls = True

message = Message(
    subject="Test",
    sender="my_user@my_domain.com",
    recipients="test_user@test_domain.com",
    body="very long text, at least 75 characters long so Office 365 will break it and insert annoying '=' into message",
    html="very long text, at least 75 characters long so Office 365 will break it and insert annoying '=' into message",
)

mailer.send_immediately(message)

Я искал в Google и обнаружил, что это как-то связано с переносами строк и Transfer-Content-Encoding. И действительно, если я добавлю \r\n каждые ~ 50 символов, я не увижу =. Но проблема в том, что я могу отправить гиперссылку, которая будет длиннее ...

Документация по пирамиде (https://docs.pylonsproject.org/projects/pyramid_mailer/en/latest/) говорит, что я могу использовать Attachment вместо простой строки. И действительно, как только я это сделаю, я могу установить для этого Transfer-Content-Encoding что-то вроде base64 (как предлагается здесь: https://jeremytunnell.com/2009/01/04/really-hairy-problem-with-seemingly-random-crlf-and-spaces-inserted-in-emails/) но мое сообщение отображается как вложение, а не как обычное сообщение ...

Кажется, нет никакого способа добавить этот Transfer-Content-Encoding к Message объекту ... Я пытался использовать Message.extra_headers = {'Transfer-Content-Encoding': 'base64'}, но это не помогло.

У меня совершенно нет идей, буду признателен за любую помощь ...


- Правка -

Благодаря ответу ниже от @Mess:

from pyramid_mailer.message import Attachment
my_message = "very long text, at least 75 characters long so Office 365 will break it and insert annoying '=' into message"
body_html = Attachment(data=my_message, transfer_encoding="base64", disposition='inline')
body_text = Attachment(data=my_message, transfer_encoding="base64", disposition='inline')

Затем передайте body_html и body_text в Message конструктор.

1 Ответ

0 голосов
/ 21 января 2019

Это заголовок «Content-Disposition», который необходимо установить, чтобы контролировать доступность содержимого для получателя.

Установите для него значение «attachment», чтобы разрешить загрузку файла, используйте «inline» длявозможность включать содержимое, например, логотип, прямо в вашу электронную почту и т. д .:

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition

Надеюсь, это укажет вам правильное направление.

РЕДАКТИРОВАТЬ:

При использовании пакета pyramid_mailer это будет что-то вроде:

from pyramid_mailer.message import Attachment
attachment = Attachment(data=some_data, transfer_encoding="base64", disposition='inline')
...