循环生成的电子邮件不发送主题

Emails generated in loop not sending subject

以下脚本正确发送:

import smtplib, argparse
parser = argparse.ArgumentParser(description="fdsafsa")
parser.add_argument('-r', nargs='?', default=False, help='help')
args = parser.parse_args()
foo = 1
baz = 'fdsa'
TEXT = 'This is the message %d%s' %(foo,baz)

message = '\
From: me@yahoo.com \n\
To: %s \n\
Subject: Data saved successfully \n\
%s' %(args.r,TEXT)

s = smtplib.SMTP('localhost')
s.sendmail('me@yahoo.com',args.r,message)

但此脚本无法正确发送电子邮件(注意 for loop

import smtplib, argparse
parser = argparse.ArgumentParser(description="fdsafsa")
parser.add_argument('-r', nargs='?', default=False, help='help')
args = parser.parse_args()
for ii in range(2):
    foo = 1d
    baz = 'fdsa'
    TEXT = 'This is the message %d%s' %(foo,baz)

    message = '\
    From: me@yahoo.com \n\
    To: %s \n\
    Subject: Data saved successfully \n\
    %s' %(args.r,TEXT)

    s = smtplib.SMTP('localhost')
    s.sendmail('me@yahoo.com',args.r,message)

在后一个示例中,电子邮件不包含主题或发件人字段。相反,它们出现在体内。

正文示例:

发件人:我@yahoo.com

致:我@yahoo.com

主题:数据保存成功

这是消息1fdsa

在前面的例子中,只有 "This is a the message 1fdsa" 部分出现在正文中。为什么 smtplib 模块在 for loop 中时无法正确读取来自 message 的发件人、收件人和主题字段?

您已将代码缩进作为循环的一部分,但 multi-line 字符串还包括每行的前导空格作为字符串本身的一部分 - 正如您将其打印出来时所看到的.电子邮件对此类事情非常敏感,因此它不再将这些行视为 headers.

最好通过字符串连接来完成此操作:

message = (
    'From: me@yahoo.com \n'
    'To: %s \n'
    'Subject: Data saved successfully \n'
     '%s' %(args.r,TEXT)
)

因为这些行都在括号内,所以它们会自动连接起来。