29-第3步_发送定制的电子邮件提醒
第3步:发送定制的电子邮件提醒
得到所有未付费成员的名单后,就可以向他们发送电子邮件提醒了。将下面的代码添加到程序中,但要代入你的真实电子邮件地址和提供商的信息:
#! python3
# sendDuesReminders.py - Sends emails based on payment status in spreadsheet.
--snip--
# Log in to email account.
smtpObj = smtplib.SMTP('smtp. ', 587)
smtpObj.ehlo()
smtpObj.starttls()
smtpObj.login('[email protected]', sys.argv[1])
调用 smtplib.SMTP()
并传入提供商的域名和端口,来创建一个 SMTP
对象。调用 ehlo()
和 starttls()
,然后调用 login()
,并传入你的电子邮件地址和 sys.argv[1]
(其中保存着你的口令字符串)。在每次运行程序时,将口令作为命令行参数输入,避免在源代码中保存口令。
程序登录到你的电子邮件账户后,就应该遍历 unpaidMembers
字典,向未支付会费的会员的电子邮件地址发送针对个人的电子邮件。将以下代码添加到sendDuesReminders.py:
#! python3
# sendDuesReminders.py - Sends emails based on payment status in spreadsheet.
--snip--
# Send out reminder emails.
for name, email in unpaidMembers.items():
❶ body = "Subject: %s dues unpaid.\nDear %s,\nRecords show that you have not
paid dues for %s. Please make this payment as soon as possible. Thank you!'" %
(latestMonth, name, latestMonth)
❷ print('Sending email to %s...' % email)
❸ sendmailStatus = smtpObj.sendmail('[email protected]', email, body)
❹ if sendmailStatus != {}:
print('There was a problem sending email to %s: %s' % (email, sendmailStatus))
smtpObj.quit()
这段代码循环遍历 unpaidMembers
中的姓名和电子邮件。对于每个没有付费的成员,我们用最新的月份和成员的名称定制了一条消息,并保存在 body
中❶。输出表示正在向这个会员的电子邮件地址发送电子邮件❷。然后调用 sendmail()
,向它传入地址和定制的消息❸。返回值保存在 sendmailStatus
中。
回忆一下,如果SMTP服务器在发送某个电子邮件时报告错误, sendmail()
方法将返回一个非空的字典值。 for
循环的最后部分在❹行检查返回的字典是否非空,如果非空,则输出收件人的电子邮件地址以及返回的字典。
程序完成发送所有电子邮件后,调用 quit()
方法,与SMTP服务器断开连接。
如果运行该程序,输出结果会像这样:
Sending email to [email protected]...
Sending email to [email protected]...
Sending email to [email protected]...
收件人会收到一封关于他们未支付会费的邮件,看起来就像你手动发送的邮件一样。