16.5 项目:向会员发送会费提醒电子邮件
假定你一直“自愿”为“强制自愿俱乐部”记录会员会费。这确实是一项枯燥
的工作,包括维护一个电子表格,记录每个月谁交了会费,并用电子邮件提醒那些没交的会员。不必你自己查看电子表格,而是向会费超期的会员复制和粘贴相同的电子邮件。你猜对了,让我们编写一个脚本,帮你完成任务。
在较高的层面上,下面是程序要做的事:
• 从 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 项目:向会员发送会费提醒电子邮件相关推荐
- 利用Java实现微信公众号发送信息提醒通知
项目场景: 项目场景:利用Java实现微信公众号发送信息提醒通知! Java实现方法: 1.首先创建实现公众号消息发送的方法: public ReturnDO<String> sendTe ...
- [简单便捷]springboot整合企业微信webhook快速发送消息提醒
springboot整合企业微信webhook快速发送消息提醒(wework webhook robot) a java SDK for wework webhook robot 介绍(introdu ...
- UNIAPP实战项目笔记57 发送手机验证码 接入短信SDK
UNIAPP实战项目笔记57 发送手机验证码 接入短信SDK 注册时候需要发送验证 通过验阿里云或腾讯云等短信sdk供应商 实际案例图片 后端接口文件 index.js var express = r ...
- RTX发送消息提醒实现以及注意事项
RTX发送消息提醒实现以及注意事项 一.RTX简介 RTX是腾讯公司推出的企业级即时通信平台.该平台定位于降低企业通信费用,增强企业内部沟通能力,改善企业与客户之间的沟通渠道,创造新兴的企业沟通文化, ...
- Java毕设项目超市会员积分管理系统计算机(附源码+系统+数据库+LW)
Java毕设项目超市会员积分管理系统计算机(附源码+系统+数据库+LW) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ ...
- JAVA毕设项目理发店会员管理系统(java+VUE+Mybatis+Maven+Mysql)
JAVA毕设项目理发店会员管理系统(java+VUE+Mybatis+Maven+Mysql) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(We ...
- Flowable发送工作提醒
1.利用flowable的时间监听器+websokect给用户发送工作提醒 @Component public class ProcessEndListener implements Flowable ...
- 如何给自己心仪的人每天发送天气提醒消息
" 如何给自己心仪的人每天发送天气提醒消息" 首先我们来想想一下,女朋友叫你每天给她发送一条天气消息,而且不能重复,如果你能坚持一个年,那她就同意嫁给你.可是你想了一下,你特别懒, ...
- 使用python+微信发送消息提醒,实现程序监控
使用python+微信发送消息提醒,实现程序监控 使用python+微信可以非常方便的提醒自己运行的程序是否报错,监控程序运行状态 1.申请微信测试号 https://mp.weixin.qq.com ...
最新文章
- 3D视觉检测的未来:光度立体技术
- [ASP.NET入门随想七]主角与配角——OO思想的多态、接口与委托
- 什么是“ 2的补码”?
- windows 下搭建python虚拟环境
- 操作系统的功能和特征
- 浅析php中的stdClass
- SD Card Formatter for Mac Download
- 谈谈Java开发中的对象拷贝
- 最简单的模拟U盘病毒(Autorun.inf)
- 教你用Java7的Fork/Join框架开发高并发程序
- java .class文件和.class文件区别是什么?
- CA SDK 使用简介
- matlab中的语言,把c语言变成matlab语言,可以在matlab中运行。
- libreoffice word转pdf时中文乱码问题解决
- 穿衣助手 张凯:电商产品经理的成长之路
- 使用MATLAB计算切比雪夫多项式系数
- Canvas 输出位图
- JSP之java.lang.ClassNotFoundException
- 计算机一黑屏就显示当前账户已锁定,电脑黑屏用户已锁定账户怎么办?
- Win10磁盘管理器:轻松和安全地调整Win10的分区大小
热门文章
- FDD and HDD
- 检测和识别机动车驾驶证信息OCR
- Tinkpad T480设置U盘启动
- 数据预处理:自定义PDF格式批量转换TXT系统
- html5 css3 图片画廊,js和CSS3 3D立方体图片画廊特效
- 基于Android的上位软件,基于Android的电子套结机上位机软件设计
- 四川农大2020计算机专业录取分数线,2020四川农业大学研究生分数线汇总(含2016-2019历年复试)...
- 网易云音乐前副总裁教你如何做产品 —《幕后产品》读书笔记
- AUC的相关知识及K-S曲线和K-S值介绍
- 面试题:在浏览器输入 URL 回车之后发生了什么?(超详细版)