32

我编写了一个脚本,将消息写入文本文件并将其作为电子邮件发送。一切都很顺利,除了电子邮件最终似乎都在一行中。

我添加了换行符\n,它适用于文本文件,但不适用于电子邮件。你知道可能的原因是什么吗?


这是我的代码:

import smtplib, sys
import traceback
def send_error(sender, recipient, headers, body):

    SMTP_SERVER = 'smtp.gmail.com'
    SMTP_PORT = 587
    session = smtplib.SMTP('smtp.gmail.com', 587)
    session.ehlo()
    session.starttls()
    session.ehlo
    session.login(sender, 'my password')
    send_it = session.sendmail(sender, recipient, headers + "\r\n\r\n" +  body)
    session.quit()
    return send_it


SMTP_SERVER = 'smtp.gmail.com'
SMTP_PORT = 587
sender = 'sender_id@gmail.com'
recipient = 'recipient_id@yahoo.com'
subject = 'report'
body = "Dear Student, \n Please send your report\n Thank you for your attention"
open('student.txt', 'w').write(body) 

headers = ["From: " + sender,
               "Subject: " + subject,
               "To: " + recipient,
               "MIME-Version: 1.0",
               "Content-Type: text/html"]
headers = "\r\n".join(headers)
send_error(sender, recipient, headers, body)
4

8 回答 8

37

对我们所有人来说不幸的是,并非每种类型的程序或应用程序都使用与 python 相同的标准化。

看着你的问题,我注意到你的标题是:"Content-Type: text/html"

这意味着您需要为新行使用 HTML 样式标签,这些标签称为换行符。<br>

你的文字应该是:

"Dear Student, <br> Please send your report<br> Thank you for your attention"

如果您更愿意使用字符类型的换行符,则必须将标题更改为:"Content-Type: text/plain"

您仍然需要将换行符从单字符更改为电子邮件中使用\n的双字符。\r\n

您的文字将是:

"Dear Student, \r\n Please send your report\r\n Thank you for your attention"
于 2013-01-03T12:51:10.387 回答
26

您已将消息正文声明为具有 HTML 内容 ( "Content-Type: text/html")。换行的 HTML 代码是<br>. 您应该将内容类型更改为text/plain或使用 HTML 标记代替换行符,\n因为后者在呈现 HTML 文档时会被忽略。


作为旁注,还请查看电子邮件包。有一些类可以为您简化电子邮件消息的定义(带有示例)。

例如,您可以尝试(未经测试):

import smtplib
from email.mime.text import MIMEText

# define content
recipients = ["recipient_id@yahoo.com"]
sender = "sender_id@gmail.com"
subject = "report reminder"
body = """
Dear Student,
Please send your report
Thank you for your attention
"""

# make up message
msg = MIMEText(body)
msg['Subject'] = subject
msg['From'] = sender
msg['To'] = ", ".join(recipients)

# sending
session = smtplib.SMTP('smtp.gmail.com', 587)
session.starttls()
session.login(sender, 'my password')
send_it = session.sendmail(sender, recipients, msg.as_string())
session.quit()
于 2013-01-03T13:23:29.477 回答
6

在我的情况下'\r\n'没有工作,但'\r\r\n'确实如此。所以我的代码是:

from email.mime.text import MIMEText
body = 'Dear Student,\r\r\nPlease send your report\r\r\nThank you for your attention'
msg.attach(MIMEText(body, 'plain'))

该消息以多行形式写入,并在 Outlook 中正确显示。

于 2019-03-07T01:40:25.930 回答
1

我也遇到过这个。我在行尾发现了一点空白,足以让我的 SMTP 服务识别新行

body = 'value of variable x = ' + myVarX + "   \r\n"  \
       + 'value of variable y = ' + myVarY 

我认为这更多是 SMTP 问题,而不是 Python 问题,这可以解释此线程中解决方案的范围

于 2021-09-23T03:06:57.070 回答
0

将内容类型标头设置为Content-Type: text/plain\r\n末尾带有)允许我发送多行纯文本电子邮件。

于 2014-03-31T12:40:56.893 回答
0

Outlook 将从它认为是额外内容的纯文本中删除换行符。 https://support.microsoft.com/en-us/kb/287816

您可以尝试以下更新以使线条看起来像子弹。这对我有用。

body = "Dear Student, \n- Please send your report\n- Thank you for your attention"
于 2016-09-19T21:43:30.967 回答
0

我也遇到了这个问题,这个线程有助于确定它首先发生的原因。我不知所措,因为我知道我的代码是正确的。我尝试了一些东西,但对我有用的是为正文中的每一行添加一个 \t\n 。

from email.mime.text import MIMEText
lines = ['line1', 'line2', 'line3']
body = '\t\n'.join(lines)
msg = MIMEText(body)
于 2021-09-16T19:23:16.407 回答
-1

为我添加\n\n作品

body = """"""

body += "This is message1\n\n"
body += "This is message2"

输出:

This is message1
This is message2
于 2021-10-27T13:48:02.400 回答