[英]mail is delivering without subject when calling from function in 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)
當我發送電子郵件時,它沒有主題地傳遞
但是,如果我使用代碼而不是函數調用-那么它可以很好地處理主題。 我在函數調用中缺少的任何內容。 請提出建議。
您遇到的問題是用三引號引起來的多行字符串。 將其放在函數中時,您要縮進其所有行,以便它們與其余代碼對齊。 但是,這會導致在第一行之后的消息的每一行的開頭出現不必要的(和不合適的)空格。
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
字符串(如果有多行)中total_testcase
行中所需的空格,而不只是由於多行字符串而添加了空格。 如果您使用制表符進行縮進或除四個空格外的其他內容,它也會中斷。 我不確定我是否真的會推薦這種方法。
最后一種方法的一個更好的版本是使用標准庫中的textwrap.dedent
函數 。 它刪除字符串中每行開頭出現的所有縮進(但僅刪除所有行共有的縮進)。 這確實需要對創建message
進行一些小的更改,因為您需要第一行與所有其他行具有相同的前導空格(您還需要避免添加任何新行,而不必在total_testcase
的多余文本中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)
#...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.