我有一个示例代码如下:
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)
当我发送电子邮件时,它是在没有主题的情况下发送的
但是,如果我使用代码而不是函数调用 - 那么它与主题的交付正常。我在函数调用中缺少的任何东西。请建议。
答案 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)
#...