功能说明:
读取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
#合同到期邮件提醒.py
import smtplib
from email.mime.text import MIMEText
import schedule
import time
import xlwings as xw
import pandas as pd
from datetime import datetime, timedelta
from dateutil.relativedelta import relativedelta
def 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 values
def 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邮箱服务,默认端口为465
s.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)
效果