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
我想尝试使用 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