功能说明:
读取excel中的到期日期识别出即将到期的合同,邮件提醒对应的用户并抄送自己
流程分析:
- 设定需要提醒的日期范围
- 逐个获取excel中到期日期数据与今天日期进行比较是否符合条件
- 获取需要发送提醒的邮箱地址
- 发送邮件,邮件增加抄送
全代码:
```python from datetime import datetime, timedelta
def remind_check():
path = "到期提醒邮件.xlsx" #指定文件所在路径values = read_excel(path) #调用read_excel模块读取数据print("读取excel数据中...")for i in range(len(values)):line = values.iloc[i] #选中一行数据#print(line)dead_line = line['到期日期']a = (datetime.now() + timedelta(days=7)) #当前日期7天内 设置需要提醒的日期if dead_line <= a:print(dead_line)name = line['合同名称']dead_line = line['到期日期']users = line['用户邮箱']content = '<p style = "margin:0 auto">'+'合同名称:'+name+' '+"到期日期:"+str(dead_line)+'</p>'Send_mail(users,content)print(name+"邮件提醒发送成功!")print("\n")
<a name="WJfNL"></a># 全代码:```python#合同到期邮件提醒.pyimport smtplibfrom email.mime.text import MIMETextimport scheduleimport timeimport xlwings as xwimport pandas as pdfrom datetime import datetime, timedeltafrom dateutil.relativedelta import relativedeltadef read_excel(path):pd.set_option('display.max_columns', None) #解决表格多列时中间省略显示问题(本程序用不到)pd.set_option('display.max_rows', None) #解决表格多行时中间省略显示问题(本程序用不到)pd.set_option('display.width', 5000) #解决表格打印换行#读取excel文件中的数据app = xw.App(visible = False, add_book = False) #打开excel程序workbook = app.books.open(path) #打开数据工作簿worksheet = workbook.sheets[0] #选中第一个工作表values = worksheet.range("A1").expand().options(pd.DataFrame, index = False).value #提取表中的数据print(values)workbook.close() #关闭工作簿app.quit() #关闭excel程序return valuesdef Send_mail(users,content):user = '496077837@qq.com' #发件人的邮箱pwd = "替换成自己的" #QQ邮箱的SMTP授权码to = users #收件人的邮箱,多个收件人用英文逗号隔开cc_list = ['496077837@qq.com',] #设置抄送的邮箱,多个请用英文逗号隔开mail_msg = []mail_msg.append('<p>小主,您好!您有一个合同将到期,请查阅:</p>')mail_msg.append(content)mail_msg.append('<p style = "margin:0 auto">祝好!</p>')mail_msg.append('<p style = "margin:0 auto">小蟒</p>')mail_msg = '\n'.join(mail_msg)msg = MIMEText(mail_msg, "html", "utf-8") #添加正文内容#2.设置邮件主题、发件人、收件人msg["Subject"] = '测试邮件主题!' #设置邮件的主题msg["From"] = user #设置发件人msg["To"] = to #设置收件人msg['Cc'] = ','.join(cc_list)#3.发送邮件try:s = smtplib.SMTP_SSL("smtp.qq.com", 465) #选择qq邮箱服务,默认端口为465#s = smtplib.SMTP_SSL("smtp.163.com", 465) #选择163邮箱服务,默认端口为465s.login(user, pwd) #登陆邮箱s.send_message(msg) #发送邮件s.quit() #退出QQ邮箱服务print("Success!")except Exception as e:print("send email failed! next is the reason")print(e)def remind_check():path = "到期提醒邮件.xlsx" #指定文件所在路径values = read_excel(path) #调用read_excel模块读取数据print("读取excel数据中...")for i in range(len(values)):line = values.iloc[i] #选中一行数据#print(line)dead_line = line['到期日期']a = (datetime.now() + timedelta(days=7)) #当前日期7天内 设置需要提醒的日期if dead_line <= a:print(dead_line)name = line['合同名称']dead_line = line['到期日期']users = line['用户邮箱']content = '<p style = "margin:0 auto">'+'合同名称:'+name+' '+"到期日期:"+str(dead_line)+'</p>'Send_mail(users,content)print(name+"邮件提醒发送成功!")print("\n")#values = read_excel(path) #调用read_excel模块读取数据#定时执行的代码#schedule.every().day.at("09:03").do(eating) #每天定时执行任务schedule.every(1).minutes.do(remind_check) #每隔1分钟定时执行任务#schedule.every().hour.do(eating) #每隔1小时间定时执行任务#schedule.every().monday.at("12:00").do(eating) #每周一定时执行任务while True: #让程序一直运行schedule.run_pending() #运行所有可以运行的schedule任务time.sleep(10)
效果


