Python:smtplib在函数内部错误地格式化电子邮件,但是当从函数外部运行相同的代码时,它正确地格式化了电子邮件

2024-05-19 19:28:55 发布

您现在位置:Python中文网/ 问答频道 /正文

出于一个让我无法理解的原因,每当我试图通过调用函数发送此电子邮件时,该电子邮件缺少主题,缺少“收件人:”并且电子邮件正文被四个空格抵消。然而,当完全相同的代码直接在脚本体中运行时,所有的东西都是完美的格式。在

import smtplib

def send_email():
    sender = 'email@address.com'
    receivers = ['email@address.com']

    message_header = """From: Me <email@address.com>
    To: Me <email@address.com>
    Subject: This is the messages's subject

    """

    message_body = 'This is the message\'s body'

    message = message_header + message_body

    try:
        smtpObj = smtplib.SMTP('server_name', 25)
        smtpObj.sendmail(sender, receivers, message)
        print("Successfully sent email")
    except OSError:
        print("Error: unable to send email")

send_email()

Tags: thecomsendmessageisaddress电子邮件email
3条回答

(这将向您展示如何修复当前代码;my other answer向您展示了实现该代码的正确方法。)


message_header中的每一行,但第一行前面有4个空格,包括连接两个字符串后的正文:

>>> repr(message_header)
'"From: Me <email@address.com>\\n    To: Me <email@address.com>\\n    Subject: This is the messages\'s subject\\n\\n    "'

(我在UNIX环境中进行了测试,因此这里显示了\n。我假设您使用的是一个以DOS行结尾的文件,它已经使用了SMTP期望的\r\n。)

要么你自己消灭他们:

^{pr2}$

哪个很难看,或者使用textwrap.dedent

def send_email():
    sender = 'email@address.com'
    receivers = ['email@address.com']

    message_header = textwrap.dedent(
        """From: Me <email@address.com>
           To: Me <email@address.com>
           Subject: This is the messages's subject

        """)

这将从其参数的每一行中删除相同数量的空白:

dedent(text)
    Remove any common leading whitespace from every line in `text`.

    This can be used to make triple-quoted strings line up with the left
    edge of the display, while still presenting them in the source code
    in indented form.

    Note that tabs and spaces are both treated as whitespace, but they
    are not equal: the lines "  hello" and "    hello" are
    considered to have no common leading whitespace.  (This behaviour is
    new in Python 2.5; older versions of this module incorrectly
    expanded tabs before searching for common leading whitespace.)

更好的方法是使用'\r\n'.join为您构造字符串。在

def send_email():
    sender = 'email@address.com'
    receivers = ['email@address.com']

    headers = [
      'From: Me <email@address.com>',
      'To: Me <email@address.com>',
      "Subject: This is the message's subject"
    ]

    message_body = 'This is the message\'s body'

    message = '\r\n'.join(headers + ['', ''] + [message_body])
def send_email():
    ...
    message_header = """From: Me <email@address.com>
____To: Me <email@address.com>
____Subject: This is the messages's subject

____"""

对比:

^{pr2}$

请注意,函数中有空格,因为它们是缩进的。我给你加了下划线。在

可以使用以下方法修复此问题:

def send_email():
    ...
    message_header = """From: Me <email@address.com>
To: Me <email@address.com>
Subject: This is the messages's subject

"""

我的另一个答案是,您应该使用email包来生成消息,而不是尝试手动构造它。在

def send_email():
    sender = 'email@address.com'
    receivers = ['email@address.com']

    message_body = 'This is the message\'s body'

    msg = email.MIMEText(message_body)
    msg['Subject'] = "This is the message's subject"
    msg['From'] = 'Me <%s>' % (sender,)
    msg['To'] = ', '.join(receivers)


    try:
        smtpObj = smtplib.SMTP('server_name', 25)
        smtpObj.sendmail(sender, receivers, msg.as_string())
        print("Successfully sent email")
    except OSError:
        print("Error: unable to send email")

相关问题 更多 >