Python 循环中的代码表现不同

Python code behaves differently when in a loop

我想尝试使用 python 发送电子邮件,并在网上找到了一些准系统代码

import smtplib

gmail_user = 'myaddress@gmail.com'
gmail_pw = 'myPassword'

sent_from = gmail_user

to = ['mailAdrr1@domain.com', 'mailAdrr2@domain.com']

subject = 'Some Subject'
body = 'Some body'

email_text = """\
From: %s
To: %s
Subject: %s
%s
""" % (sent_from, ", ".join(to), subject, body)

try:
    smtp_server = smtplib.SMTP_SSL('smtp.gmail.com', 465)
    smtp_server.ehlo()
    smtp_server.login(gmail_user, gmail_pw)
    smtp_server.sendmail(sent_from, to, email_text)
    smtp_server.close()
    print("Success")
except Exception as ex:
    print("Error: ", ex)

现在我想分别向每个目标发送一封电子邮件,所以我在代码中添加了一个 foreach 循环。这导致电子邮件 header 被弄乱,所有 header 都被解释为发件人 header。虽然当我把它们打印出来时,它们看起来还不错

在对为什么会发生这种情况感到非常困惑之后,我决定尝试将整个代码包装在一个 for 循环中,并进行一次迭代——根据我的理解——应该不会有任何改变。但实际上它确实会产生与上述相同的问题。这就是我将代码包装在一个循环中的方式:

import smtplib

for i in range(1):
    gmail_user = 'myaddress@gmail.com'
    gmail_pw = 'myPassword'

    sent_from = gmail_user

    to = ['mailAdrr1@domain.com', 'mailAdrr2@domain.com']

    subject = 'Some Subject'
    body = 'Some body'

    email_text = """\
    From: %s
    To: %s
    Subject: %s
    %s
    """ % (sent_from, ", ".join(to), subject, body)

    try:
        smtp_server = smtplib.SMTP_SSL('smtp.gmail.com', 465)
        smtp_server.ehlo()
        smtp_server.login(gmail_user, gmail_pw)
        smtp_server.sendmail(sent_from, to, email_text)
        smtp_server.close()
        print("Success")
    except Exception as ex:
        print("Error: ", ex)

如果确实在代码中完成了所有操作,为什么一次迭代的 for 循环会改变代码的工作方式?

我怀疑这是你想要的代码:

import smtplib

gmail_user = 'MyEmail@gmail.com'
gmail_pw = 'MyPassword'

sent_from = gmail_user

to = ['PersonA@gmail.com', 'PersonB@gmail.com']

subject = 'Some Subject for multiple people'
body = 'Some body for a few'


smtp_server = smtplib.SMTP_SSL('smtp.gmail.com', 465)
smtp_server.ehlo()
smtp_server.login(gmail_user, gmail_pw)

for email in to:
    email_text = 'Subject:{}\n\n{}'.format(subject, body)
    
    try:
        smtp_server.sendmail(sent_from, email, email_text)
        print("Success")
    except Exception as ex:
        print("Error: ", ex)
smtp_server.close()

您的处理方式有两个主要问题。无论出于何种原因,如果您在循环内部登录,它将失败。我已将其移至开头并在末尾调用 close() 以防止多次登录。 您遇到的第二个问题与如何格式化电子邮件数据本身有关。我使用这个答案示例来帮助完成这项工作,因此请参阅此以了解更多信息:

希望这能解决您的问题! 非常感谢,GhostDog