Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:将消息编码为base64以解决“问题”&引用;和线路长度问题_Python_Email_Encoding - Fatal编程技术网

Python:将消息编码为base64以解决“问题”&引用;和线路长度问题

Python:将消息编码为base64以解决“问题”&引用;和线路长度问题,python,email,encoding,Python,Email,Encoding,背景 关于下列条款: 所有问题和解决方案都涉及PHP问题,但我在Python中遇到了这个问题 如果我直接将电子邮件发送给收件人,一切正常,不会出现感叹号,消息也会正确显示 然而,利用我们的“Sympa”()系统,该大学使用它的“邮件列表”解决方案,来自该系统的电子邮件在消息中插入感叹号和换行符,HTML换行符导致显示问题 问题源于线路长度。任何长度超过998个字符的行都会插入感叹号和换行符 现在是问题 他们提到的解决方案之一是在base64中对消息体进行编码,这显然不受行长问题的影响。

背景

关于下列条款:

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

如果我直接将电子邮件发送给收件人,一切正常,不会出现感叹号,消息也会正确显示

然而,利用我们的“Sympa”()系统,该大学使用它的“邮件列表”解决方案,来自该系统的电子邮件在消息中插入感叹号和换行符,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,并指定一个字符集似乎可以做到这一点:


显然,我只是随便说说而已,并没有考虑角色设置。使用MIMEText而不是MIMEMessage。

通常,
email.mime.MIMEText
会自动将
内容传输编码设置为base64(如果正文未声明为纯ASCII)。因此,假设
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()

有很多方法可以强制对消息进行编码,但这可能取决于您如何编写消息。如果您在任何时候使用
setContent(content)
,使用
setContent(content,cte='base64')
就足够了。如果你展示你的代码,我会更详细。源代码发布,匿名。谢谢@SergeBallesta!:)
encode_base64
是对
email.message.message
进行编码的正确方法,因此此部分应该可以工作。让我担心的是,您有
msg_body=msg_header.format(…)+…
,让我认为
msg_body
在不应该包含头的时候包含头。你能举一个简单但可重复的例子吗?对不起。。变量名使用不当。这里没有标题,我应该说是“message_top”,它是在动态内容(通过循环、API调用等完成)之前生成“contact_table”和“svc_table”的消息内容。唯一的标题是在“信封”中完成的,信封是“mimessage”的一个实例。我尝试了您的建议,收到了错误:AttributeError:MIMEText实例没有“as_bytes”属性。应该是MIMEText还是MIMEMessage?挖掘…我尝试了你的建议,收到错误:AttributeError:MIMEText实例没有属性“as_bytes”。我把它保留为:as_string(),它成功了!我所有的html电子邮件都不再损坏(不再添加“!”和换行符)。非常感谢。如果没有as_字节,则应升级到最新的Python 3(3.4或更高版本)。
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()