如何使用非零返回码将电子邮件发送到使用 smtplib 的备份地址?
Posted
技术标签:
【中文标题】如何使用非零返回码将电子邮件发送到使用 smtplib 的备份地址?【英文标题】:How can I use a non-zero returncode to send email to a backup address using smtplib? 【发布时间】:2022-01-22 11:12:47 【问题描述】:我正在 Python3 中试验smtplib
。
我想将变量的内容发送到电子邮件地址。如果有smtplib.SMTPAuthenticationError
,我想将该变量发送到另一个电子邮件地址。这有效(见下面的代码)。但是如果我想添加第三个电子邮件地址(如果前两个由于某种原因失败)怎么办?
我不认为try
和except
允许我添加另一个相同代码块(具有不同的电子邮件登录详细信息)。
我知道使用subprocess
,可以获取变量的returncode
,然后使用if
。
例如:
result = subprocess.run(["ls", "-al"], capture_output = True)
if result !=0:
do_something_to_list_the_directory
如果不使用subprocess
,我不知道如何做到这一点。有人可以请教吗?
代码如下:
try:
mail_sending_attempt = smtplib.SMTP("smtp_provider", 587)
mail_sending_attempt.starttls()
mail_sending_attempt.login(send, passinfo) ### this will not work
mail_sending_attempt.sendmail(send, receive, message)
mail_sending_attempt.quit()
except Exception:
mail_sending_attempt = smtplib.SMTP("smtp_provider", 587)
mail_sending_attempt.starttls()
mail_sending_attempt.login(send2, passinfo2) ### this will not work
mail_sending_attempt.sendmail(send2, receive2, message)
mail_sending_attempt.quit()
【问题讨论】:
为什么不在第一个except
块中使用嵌套的try
-except
?看到这个问题:***.com/questions/17015230/…
【参考方案1】:
如果邮件较多,可以使用下面的sn-p
from dataclasses import dataclass
@dataclass
class EmailData:
send: str
passinfo: str
receive: str
main = EmailData("send1", "passinfo1", "receive1")
backup_1 = EmailData("send2", "passinfo2", "receive2")
...
for data in [main, backup_1, ...]:
try:
mail_sending_attempt = smtplib.SMTP("smtp_provider", 587)
mail_sending_attempt.starttls()
mail_sending_attempt.login(data.send, data.passinfo)
mail_sending_attempt.sendmail(data.send, data.receive, message)
mail_sending_attempt.quit()
break
except Exception:
continue
else:
# the case when we won't encounter break, so every login failed.
raise Exception
【讨论】:
以上是关于如何使用非零返回码将电子邮件发送到使用 smtplib 的备份地址?的主要内容,如果未能解决你的问题,请参考以下文章