2

我遇到了一个奇怪的问题,我的电子邮件的最后 10-20 个字符被截断。

发送邮件的代码如下:

#Get the runtime arguments.
subject = args[0]
content = str(args[1]).replace("\\n","<br/>") #Python automatically escapes the backslash in runtime arguments, so "\n" turns into "\\n".

#Create the email message.
msg = MIMEText(content, 'html')
msg['From']=sender
msg['To']=",".join(recipients)
msg['Subject']=subject

print "Sending email with subject \""+subject+"\" to: " + ",".join(recipients)

print "Content: \n" + content;
print "\n\n"
print "msg.as_string(): \n" + msg.as_string()

#Set the SMPTP server, and send the email.
s = smtplib.SMTP(server)
s.sendmail(sender,recipients,msg.as_string())
s.quit()

正如您在代码中看到的,我将内容和最终消息都打印到屏幕上,两者都打印正确。但是当收件人收到电子邮件时,它会被截断。我不能 100% 确定它是被一定数量的字符截断,还是在一定数量的字符之后被截断,但我怀疑是后者。

奇怪的是,如果电子邮件以纯文本而不是 HTML 格式发送,它们就可以很好地发送。但不幸的是,大多数收件人都使用 Outlook,它认为它比我更清楚在纯文本电子邮件中的换行位置......

任何见解将不胜感激。

编辑:我还应该提到这不是格式良好的 HTML。基本上,我只是用

<br/>

我不确定这是否会有所作为。除了刹车标签之外,没有任何东西与 HTML 标签很相似,所以问题不在于意外的标签弄乱了格式。

4

2 回答 2

3

如果您要从电子邮件中删除所有换行符,那么您就有麻烦了。SMTP 服务器通常不接受超过 1,000 个字符的行。如果您想发送自由格式的数据,请将其封装在 Quoted-Printable 之类的东西中(您可以在其中放入“不可见”的换行符,这些换行符将被客户端删除——不过,请注意正确地对消息本身进行 QP 编码)。

In quoted printable (RFC 2045), you can hex-encode any =22special=22 chara=
cter, like this (or=20in=20fact,=20any=20character=20at=all), and add line=
 breaks where you see fit by prefixing them with an equals sign.  Of cours=
e, you also have to encode any literal equals sign, like this: =3D.  Bette=
r use a library which understands the details of this format than write yo=
ur own encoder, though.

如果您指定Content-Transfer-Encoding: binary,理论上您可以传入任意长度的行,但坚持7bit允许的内容并使用合适的Content-Transfer-Encoding类似quoted-printable或(如果您想真正疯狂)会更好,更安全base64

于 2012-04-02T16:39:45.733 回答
0

要详细说明Tripleee的答案,这就是您在实践中的做法:

import quopri

#Create the email message.
content = quopri.encodestring(content)
msg = MIMEText(content, 'html')
msg.replace_header('content-transfer-encoding', 'quoted-printable')
...
于 2018-03-13T18:45:54.180 回答