繁体   English   中英

Python:将消息编码为base64以解决“!”和行长问题

[英]Python: Encoding message as base64 to solve “!” and line length issue

背景

关于以下文章:

所有问题和解决方案都涉及PHP问题,但是我在Python中遇到了这个问题。

如果我直接将电子邮件发送给收件人,则一切正常,没有出现感叹号,并且消息正确显示。

但是,利用大学用于其“邮件列表”解决方案的“ Sympa”( https://www.sympa.org/ )系统,来自该系统的电子邮件在消息中插入了感叹号和换行符,并在HTML中插入了换行符导致显示问题。

问题出在线长上。 任何长于998个字符的神奇行的行都将获得此感叹号并插入换行符。

现在的问题

他们提到的解决方案之一是在base64中编码消息的主体,这显然不受行长问题的影响。 但是,我无法弄清楚如何在Python中正确地形成消息并具有正确的标头和编码,因此该消息将在电子邮件客户端中正确显示。

目前,我只成功发送了带有base64编码主体的电子邮件作为附件。 布莱克!

我需要发送HTML编码的电子邮件(表格和某些格式)。 我创建一个非常长的串联字符串,将所有html压缩在一起。 它很难看,但可以正确显示。

救命?!

注意: 如果其他任何人遇到了此问题,并且有解决方案可以使我发送不受行长问题困扰的电子邮件,我将不胜感激!

源代码按要求

# Add support for emailing reports
import smtplib
# from email.mime.text import MIMEText
from email.mime.message import MIMEMessage
from email.encoders import encode_base64
from email.message import Message

... ...

headerData = {"rDate": datetime.datetime.now().strftime('%Y-%m-%d')}
msg_body = msg_header.format(**headerData) + contact_table + spacer + svc_table

theMsg = Message()
theMsg.set_payload(msg_body)
encode_base64(theMsg)
theMsg.add_header('Content-Transfer-Encoding', 'base64')
envelope = MIMEMessage(theMsg, 'html')

theSubject = "Audit for: "+aService['description']
envelope['Subject'] = theSubject

from_addr = "xxx@xxx"
envelope['From'] = from_addr

to_addrs = "xxx@xxxx"
# to_addrs = aService['contact_email']
envelope['To'] = to_addrs

# Send the message via our own SMTP server.
s = smtplib.SMTP('x.x.x.x')
s.sendmail(from_addr, to_addrs, envelope.as_string())
s.quit()

解决方案,谢谢@Serge Ballesta回到MIMEText,并指定字符集似乎可以解决问题:

envelope = MIMEText(msg_body, 'html', _charset='utf-8') 
assert envelope['Content-Transfer-Encoding'] == 'base64'

envelope['Subject'] = "Audit for: "+aService['description']

from_addr = "f5-admins@utlists.utexas.edu"
envelope['From'] = from_addr

to_addrs = "xx-test@xx.xx.edu"
envelope['To'] = to_addrs

# Send the message via our own SMTP server.
s = smtplib.SMTP('xx.xx.xx.edu')
s.sendmail(from_addr, to_addrs, envelope.as_string())
s.quit()

显然我只是在刺伤,没有考虑字符集。 使用MIMEText而不是MIMEMessage。

通常,如果未将主体声明为纯ASCII,则email.mime.MIMEText自动将Content-Transfert-Encoding为base64。 因此,假设body包含邮件body的HTML文本(那里没有邮件头),则将其声明为utf-8应该就足够了:

msg = email.mime.text.MIMEText(body, 'html', _charset='utf-8')

# assert the cte:
assert msg['Content-Transfer-Encoding'] == 'base64'

theSubject = "Audit for: "+aService['description']
msg['Subject'] = theSubject

from_addr = "xxx@xxx"
msg['From'] = from_addr

to_addrs = "xxx@xxxx"
# to_addrs = aService['contact_email']
msg['To'] = to_addrs

# optionally set other headers
# msg['Date']=datetime.datetime.now().isoformat()

# Send the message
s = smtplib.SMTP('x.x.x.x')
s.sendmail(from_addr, to_addrs, msg.as_bytes())
s.quit()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM