如何使用Python和SMTP发送格式正确的电子邮件?

3

我尝试使用Python脚本发送电子邮件,但是以我期望的格式发送的邮件没有按照我的预期显示。下面是我的发送电子邮件方法 -

def send_mail(data):
    sender = 'fromuser@host.com'
    receivers = ['touser@host.com']

    message = """From: fromuser@host.com
    To: touser@host.com
    Subject: Send mail from python!!

    """
    body = 'Some Text\n'
    for item in data:
        body = body + '{name} - {res}\n'.format(name=item['name'], res=item['res'])

    message = message + body

    try:
       smtpObj = smtplib.SMTP('corp.host.com' )
       smtpObj.sendmail(sender, receivers, message)
       print "Mail sent"
    except smtplib.SMTPException:
       print "You can't spam. Mail sending failed!"

这里的数据只有键值对。

我在Outlook邮箱中收到了这样一封电子邮件 -

在我的Outlook中,发件人:部分显示以下字符串,这是错误的 -

fromuser@host.com To: touser@host.com Subject: Send mail from python!!

同时,“收件人”(To:)和“主题”(Subject:)为空,这也是错误的。

在正文中,我看到所有内容都在一行中,但我希望结果显示为-

Some Text

machinA - 0
machineB - 0
machineC - 0

我该如何表示我的数据以在Outlook邮箱中显示如此?

1
头部必须用\r\n分隔。使用电子邮件类来构建正确的消息。 - Max
@Max 在这里是正确的。看起来你现在已经有了,但如果你需要一个例子,告诉我们。 - Feign
当然可以。您能否根据我的示例提供一个例子? - AKIWEB
另外,你不小心调用了标题折叠,因为你的收件人和主题行有缩进。三重引号将保留缩进。 - Max
@Max: 谢谢你的建议,Max。如果可能的话,你能否提供一个以我的例子为基础的示例,这样我就能更好地理解了。 - AKIWEB
显示剩余2条评论
1个回答

10

由于三引号保留所有空格,你可能会意外发送:

From: fromuser@host.com
      To: touser@host.com
      Subject: Send mail from python!!

这会触发标题展开:缩进的行意味着标题被继续。因此,这确实是一个格式不良的发件人标题。您需要确保没有多余的空格。这样可以修复当前示例:

def send_mail(data):
    sender = 'fromuser@host.com'
    receivers = ['touser@host.com']

    message = """\
From: fromuser@host.com
To: touser@host.com
Subject: Send mail from python!!
"""
    body = '\n\nSome Text\n'
    for item in data:
        body = body + '{name} - {res}\n'.format(name=item['name'], res=item['res'])

    message = message + body

    try:
       smtpObj = smtplib.SMTP('corp.host.com' )
       smtpObj.sendmail(sender, receivers, message)
       print "Mail sent"
    except smtplib.SMTPException:
       print "You can't spam. Mail sending failed!"

然而,你根本不应该手动构建消息。Python在email.message中包含了一些可爱的类,用于构建邮件消息。

import email.message

m = email.message.Message()
m['From'] = "fromuser@host.com"
m['To'] = "touser@host.com"
m['Subject'] = "Send mail from python!!"

m.set_payload("Your text only body");

现在,您可以将您的消息转换为字符串:
>>> m.as_string()
'To: touser@host.com\nFrom: fromuser@host.com\nSubject: Send mail from python!!\n\nyour text-only body'

我要提醒你,正确处理电子邮件是一个非常庞大和复杂的主题,如果你想使用非ASCII字符、附件等,需要有一定的学习曲线,并且需要使用email.message库的所有功能,这个库有很多文档,你应该阅读并理解。


谢谢您的建议。现在我能够正确地看到发件人、收件人和主题部分了。但是邮件正文中的数据根本没有出现。现在只有发件人、收件人和主题部分能够正常工作。您有什么想法,为什么会发生这种情况呢? - AKIWEB
我正在尝试使用您的第一个选项,因为我的数据非常简单和直接,所以现在选择第一个选项。 - AKIWEB
主题后面需要两个换行符。可以在标题部分添加它们,或者在正文前添加。 - Max

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接