Я отправляю электронные письма с 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
конструктор.