从python函数调用时,邮件无主题传递

时间:2015-09-09 04:14:42

标签: python

我有一个示例代码如下:

import smtplib
def send_mail(PASS,FAIL):
    me = "XXXX"
    you = "YYYY"
    print "Start of program"
    server = smtplib.SMTP('ZZZ', 25)
    total_testcase = "15/12"
    print total_testcase
    message = """From: From Person <XXXX>
    To: To Person <YYYY>
    Subject: mail testing

    %s
    """ %total_testcase
    print message
    server.sendmail(me, you, message)


send_mail(8,9)

当我发送电子邮件时,它是在没有主题的情况下发送的

但是,如果我使用代码而不是函数调用 - 那么它与主题的交付正常。我在函数调用中缺少的任何东西。请建议。

1 个答案:

答案 0 :(得分:1)

您遇到的问题是使用三引号多线字符串。当你把它放在你的函数中时,你要缩进它的所有行,以便它们与其余的代码对齐。但是,这会在第一行之后的每一行的开头产生不必要的(和不适当的)空格。

SMTP邮件标题中的前导空格表示应继续使用上一个标题。这意味着您的前三行都会合并到From标题中。

你可以通过省略前导空格来解决这个问题:

def send_mail(PASS,FAIL):
    #...
    message = """From: From Person <XXXX>
To: To Person <YYYY>
Subject: mail testing

%s
""" % total_testcase
    #...

或者使用\n代替字符串中的真实换行符:

message = "From: From Person <XXXX>\nTo: To Person <YYYY>\nSubject: mail testing\n\n%s" % total_testcase

或者最后,您可以保留当前代码以生成消息,但之后删除前导空格:

def send_mail(PASS,FAIL):
    #...
    message = """From: From Person <XXXX>
    To: To Person <YYYY>
    Subject: mail testing

    %s
    """ % total_testcase
    message = "\n".join(line if not line.startswith("    ") else line[4:]
                        for line in message.splitlines())
    #...

这最后一个选项有点脆弱,因为它可能会从total_testcase字符串中的行中删除所需的空格(如果它有多行),而不仅仅是由于多行字符串而添加的空格。如果您使用制表符进行缩进,或者除了四个空格之外的任何其他内容,它也会中断。我不确定我是否真的推荐这种方法。

最后一种方法的更好版本是使用标准库中的textwrap.dedent function。它删除了字符串中每行开头出现的任何缩进(但只删除了所有行共有的缩进)。这确实需要对您创建message的方式进行一些小改动,因为您需要第一行与所有其他行具有相同的前导空格(您还需要避免在没有缩进的情况下添加任何换行符)来自total_testcase)的额外文字。

以下是代码:

import textwrap

def send_mail(PASS,FAIL):
    #...
    # backslash after the quotes on the first line avoids a empty line at the start
    message = """\
    From: From Person <XXXX>
    To: To Person <YYYY>
    Subject: mail testing

    %s
    """ % total_testcase
    message = textwrap.dedent(message)
    #...