如何使用Python的smtplib发送电子邮件中的换行符?

时间:2013-01-03 12:41:17

标签: python email python-2.7 smtplib

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

我按\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)

5 个答案:

答案 0 :(得分:25)

不幸的是,对于我们所有人来说,并非每种类型的程序或应用程序都使用与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"

答案 1 :(得分:17)

您声明的邮件正文包含HTML内容("Content-Type: text/html")。换行符的HTML代码为<br>。您应该将内容类型更改为text/plain或使用HTML标记进行换行而不是简单\n,因为后者在呈现HTML文档时会被忽略。


作为旁注,请查看email package。有些类可以为您简化电子邮件的定义(with examples)。

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

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()

答案 2 :(得分:0)

将内容类型标题设置为Content-Type: text/plain(末尾为\r\n),这样我就可以发送多行纯文本电子邮件。

答案 3 :(得分:0)

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

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

body = "Dear Student, \n- Please send your report\n- Thank you for your attention"

答案 4 :(得分:0)

在我的情况下,'\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中正确显示。