pyramid_mailer `Message` 和 `Content-Transfer-Encoding`
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)
我在google上搜索了一下,发现这与换行符和Transfer-Content-Encoding
有关。事实上,如果我每 ~50 个字符添加 \r\n
,我将看不到添加 =
。但问题是我可能想发送一个比这更长的超链接...
Pyramid 文档 (https://docs.pylonsproject.org/projects/pyramid_mailer/en/latest/) says I can use Attachment
rather than plain string. And indeed as soon as I do that I can set this Transfer-Content-Encoding
to something like base64
(as suggested here: 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
构造函数。
这是 "Content-Disposition" header 您需要设置以控制内容对收件人可用的方式。
将其设置为 "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')
我用 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
,我将看不到添加 =
。但问题是我可能想发送一个比这更长的超链接...
Pyramid 文档 (https://docs.pylonsproject.org/projects/pyramid_mailer/en/latest/) says I can use Attachment
rather than plain string. And indeed as soon as I do that I can set this Transfer-Content-Encoding
to something like base64
(as suggested here: 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
构造函数。
这是 "Content-Disposition" header 您需要设置以控制内容对收件人可用的方式。
将其设置为 "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')