pyramid_mailer的Message和Content-Transfer-Encoding

时间:2019-01-21 14:51:21

标签: python email smtp pylons

我正在使用pyramid_mailer发送电子邮件,发现了一个奇怪的问题,当我将Office365用作SMTP服务器时,它在邮件中添加了随机的=字符。我没有在其他邮件服务器上遇到这个问题(我用gmail和我自己的postfix服务器对此进行了测试)

我发送如下电子邮件:

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有关。实际上,如果我每隔50个字符添加\r\n,就不会看到=的添加。但是问题是我可能想要发送比该更长的超链接...

金字塔文档(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_htmlbody_text传递给Message构造函数。

1 个答案:

答案 0 :(得分:1)

这是“ Content-Disposition”标题,您需要设置此标题以控制收件人如何使用内容。

将其设置为“附件”可以下载文件,使用“内联”可以将内容(例如徽标)直接包含在您的电子邮件中,等等:

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')