pyramid_mailer `Message` and `Content-Transfer-Encoding`



我使用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)

我在谷歌上搜索了一下,发现这与换行符和Transfer-Content-Encoding有关。事实上,如果我每50个字符添加一个rn,我就看不到添加了=。但问题是,我可能想发送一个比这更长的超链接。。。

金字塔文档(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构造函数。

这是您需要设置的"内容处置"标头,以控制内容对收件人的可用性。

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

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

最新更新