假定你一直“自愿”为“强制自愿俱乐部”记录会员会费。这确实是一项枯燥
的工作,包括维护一个电子表格,记录每个月谁交了会费,并用电子邮件提醒那些没交的会员。不必你自己查看电子表格,而是向会费超期的会员复制和粘贴相同的电子邮件。你猜对了,让我们编写一个脚本,帮你完成任务。
在较高的层面上,下面是程序要做的事:
•    从 Excel 电子表格中读取数据。
•    找出上个月没有交费的所有会员。
•    找到他们的电子邮件地址,向他们发送针对个人的提醒。这意味着代码需要做到以下几点:
•    用openpyxl 模块打开并读取Excel 文档的单元格(处理 Excel 文件参见第 12 章)。
•    创建一个字典,包含会费超期的会员。
•    调用 smtplib.SMTP()、ehlo()、starttls()和 login(),登录 SMTP 服务器。
•    针对会费超期的所有会员,调用 sendmail()方法,发送针对个人的电子邮件提醒。打开一个新的文件编辑器窗口,并保存为 sendDuesReminders.py。

第 1 步:打开 Excel 文件
假定用来记录会费支付的 Excel 电子表格看起来如图 16-2 所示,放在名为
duesRecords.xlsx 的文件中。可以从http://nostarch.com/automatestuff/下载该文件。

该电子表格中包含每个成员的姓名和电子邮件地址。每个月有一列,记录会员的付款状态。在成员交纳会费后,对应的单元格就记为 paid。
该程序必须打开 duesRecords.xlsx,通过调用 get_highest_column()方法,弄清楚最近一个月的列(可以参考第 12 章,了解用 openpyxl 模块访问 Excel 
电子表格文件单元格的更多信息)。在文件编辑器窗口中输入以下代码:

#!  python3
#  sendDuesReminders.py  -  Sends  emails  based  on  payment  status  in  spreadsheet. import  
openpyxl,  smtplib,  sys
#  Open  the  spreadsheet  and  get  the  latest  dues  status.
➊  wb  =  openpyxl.load_workbook('duesRecords.xlsx')
➋  sheet  =  wb.get_sheet_by_name('Sheet1')

➌  lastCol  =  sheet.get_highest_column()
➍  latestMonth  =  sheet.cell(row=1,  column=lastCol).value #  TODO:  Check  each  
member's  payment  status.
#  TODO:  Log  in  to  email  account. #  TODO:  Send  out  reminder  emails.
导入 openpyxl、smtplib 和 sys 模块后,我们打开 duesRecords.xlsx 文件,将得
到的 Workbook 对象保存在 wb 中➊。然后,取得 Sheet  1,将得到的 Worksheet 对象保存在 sheet 中➋。既然有了 
Worksheet 对象,就可以访问行、列和单元格。我们将最后一列保存在 lastCol 中➌,然后用行号 1 和 lastCol 
来访问应该记录着最近月份的单元格。取得该单元格的值,并保存在 latestMonth  中➍。

第 2 步:查找所有未付成员
一旦确定了最近一个月的列数(保存在 lastCol 中),就可以循环遍历第一行(这是列标题)之后的所有行,看看哪些成员在该月会费的单元格中写着 paid。如果会员没有支付,就可以从列 1 和 2 
中分别抓取成员的姓名和电子邮件地址。这些信息将放入 unpaidMembers 字典,它记录最近一个月没有交费的所有成员。将以下代码添加到 sendDuesReminder.py 中。

#!  python3
#  sendDuesReminders.py  -  Sends  emails  based  on  payment  status  in  spreadsheet.

--snip--

#  Check  each  member's  payment  status. unpaidMembers  =  {}
➊  for  r  in  range(2,  sheet.get_highest_row()  +  1):
➋            payment  =  sheet.cell(row=r,  column=lastCol).value if  payment  !=  
'paid':
➌                      name  =  sheet.cell(row=r,  column=1).value
➍                      email  =  sheet.cell(row=r,  column=2).value
➎                      unpaidMembers[name]  =  email

这段代码设置了一个空字典unpaidMembers,然后循环遍历第一行之后所有的行➊。对于每一行,最近月份的值保存在 payment 中➋。如果 
payment 不等于'paid',则第一列的值保存在 name 中➌,第二列的值保存在 email 中➍,name 和 email 添加到 
unpaidMembers 中➎。

第 3 步:发送定制的电子邮件提醒
得到所有未付费成员的名单后,就可以向他们发送电子邮件提醒了。将下面的代码添加到程序中,但要代入你的真实电子邮件地址和提供商的信息:
#!  python3
#  sendDuesReminders.py  -  Sends  emails  based  on  payment  status  in  spreadsheet.

--snip--

#  Log  in  to  email  account.
smtpObj  =  smtplib.SMTP('smtp.gmail.com',  587) smtpObj.ehlo()
smtpObj.starttls() smtpObj.login('my_email_address@gmail.com',  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('my_email_address@gmail.com',  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  alice@example.com... Sending  email  to  bob@example.com...
Sending  email  to  eve@example.com...
收件人将收到如图 16-3 所示的电子邮件。

16.5 项目:向会员发送会费提醒电子邮件相关推荐

  1. 利用Java实现微信公众号发送信息提醒通知

    项目场景: 项目场景:利用Java实现微信公众号发送信息提醒通知! Java实现方法: 1.首先创建实现公众号消息发送的方法: public ReturnDO<String> sendTe ...

  2. [简单便捷]springboot整合企业微信webhook快速发送消息提醒

    springboot整合企业微信webhook快速发送消息提醒(wework webhook robot) a java SDK for wework webhook robot 介绍(introdu ...

  3. UNIAPP实战项目笔记57 发送手机验证码 接入短信SDK

    UNIAPP实战项目笔记57 发送手机验证码 接入短信SDK 注册时候需要发送验证 通过验阿里云或腾讯云等短信sdk供应商 实际案例图片 后端接口文件 index.js var express = r ...

  4. RTX发送消息提醒实现以及注意事项

    RTX发送消息提醒实现以及注意事项 一.RTX简介 RTX是腾讯公司推出的企业级即时通信平台.该平台定位于降低企业通信费用,增强企业内部沟通能力,改善企业与客户之间的沟通渠道,创造新兴的企业沟通文化, ...

  5. Java毕设项目超市会员积分管理系统计算机(附源码+系统+数据库+LW)

    Java毕设项目超市会员积分管理系统计算机(附源码+系统+数据库+LW) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ ...

  6. JAVA毕设项目理发店会员管理系统(java+VUE+Mybatis+Maven+Mysql)

    JAVA毕设项目理发店会员管理系统(java+VUE+Mybatis+Maven+Mysql) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(We ...

  7. Flowable发送工作提醒

    1.利用flowable的时间监听器+websokect给用户发送工作提醒 @Component public class ProcessEndListener implements Flowable ...

  8. 如何给自己心仪的人每天发送天气提醒消息

    " 如何给自己心仪的人每天发送天气提醒消息" 首先我们来想想一下,女朋友叫你每天给她发送一条天气消息,而且不能重复,如果你能坚持一个年,那她就同意嫁给你.可是你想了一下,你特别懒, ...

  9. 使用python+微信发送消息提醒,实现程序监控

    使用python+微信发送消息提醒,实现程序监控 使用python+微信可以非常方便的提醒自己运行的程序是否报错,监控程序运行状态 1.申请微信测试号 https://mp.weixin.qq.com ...

最新文章

  1. 3D视觉检测的未来:光度立体技术
  2. [ASP.NET入门随想七]主角与配角——OO思想的多态、接口与委托
  3. 什么是“ 2的补码”?
  4. windows 下搭建python虚拟环境
  5. 操作系统的功能和特征
  6. 浅析php中的stdClass
  7. SD Card Formatter for Mac Download
  8. 谈谈Java开发中的对象拷贝
  9. 最简单的模拟U盘病毒(Autorun.inf)
  10. 教你用Java7的Fork/Join框架开发高并发程序
  11. java .class文件和.class文件区别是什么?
  12. CA SDK 使用简介
  13. matlab中的语言,把c语言变成matlab语言,可以在matlab中运行。
  14. libreoffice word转pdf时中文乱码问题解决
  15. 穿衣助手 张凯:电商产品经理的成长之路
  16. 使用MATLAB计算切比雪夫多项式系数
  17. Canvas 输出位图
  18. JSP之java.lang.ClassNotFoundException
  19. 计算机一黑屏就显示当前账户已锁定,电脑黑屏用户已锁定账户怎么办?
  20. Win10磁盘管理器:轻松和安全地调整Win10的分区大小

热门文章

  1. FDD and HDD
  2. 检测和识别机动车驾驶证信息OCR
  3. Tinkpad T480设置U盘启动
  4. 数据预处理:自定义PDF格式批量转换TXT系统
  5. html5 css3 图片画廊,js和CSS3 3D立方体图片画廊特效
  6. 基于Android的上位软件,基于Android的电子套结机上位机软件设计
  7. 四川农大2020计算机专业录取分数线,2020四川农业大学研究生分数线汇总(含2016-2019历年复试)...
  8. 网易云音乐前副总裁教你如何做产品 —《幕后产品》读书笔记
  9. AUC的相关知识及K-S曲线和K-S值介绍
  10. 面试题:在浏览器输入 URL 回车之后发生了什么?(超详细版)