功能说明:

读取excel中的到期日期识别出即将到期的合同,邮件提醒对应的用户并抄送自己

流程分析:

  1. 设定需要提醒的日期范围
  2. 逐个获取excel中到期日期数据与今天日期进行比较是否符合条件
  3. 获取需要发送提醒的邮箱地址
  4. 发送邮件,邮件增加抄送

    全代码:

    ```python from datetime import datetime, timedelta

def remind_check():

  1. path = "到期提醒邮件.xlsx" #指定文件所在路径
  2. values = read_excel(path) #调用read_excel模块读取数据
  3. print("读取excel数据中...")
  4. for i in range(len(values)):
  5. line = values.iloc[i] #选中一行数据
  6. #print(line)
  7. dead_line = line['到期日期']
  8. a = (datetime.now() + timedelta(days=7)) #当前日期7天内 设置需要提醒的日期
  9. if dead_line <= a:
  10. print(dead_line)
  11. name = line['合同名称']
  12. dead_line = line['到期日期']
  13. users = line['用户邮箱']
  14. content = '<p style = "margin:0 auto">'+'合同名称:'+name+' '+"到期日期:"+str(dead_line)+'</p>'
  15. Send_mail(users,content)
  16. print(name+"邮件提醒发送成功!")
  17. print("\n")
  1. <a name="WJfNL"></a>
  2. # 全代码:
  3. ```python
  4. #合同到期邮件提醒.py
  5. import smtplib
  6. from email.mime.text import MIMEText
  7. import schedule
  8. import time
  9. import xlwings as xw
  10. import pandas as pd
  11. from datetime import datetime, timedelta
  12. from dateutil.relativedelta import relativedelta
  13. def read_excel(path):
  14. pd.set_option('display.max_columns', None) #解决表格多列时中间省略显示问题(本程序用不到)
  15. pd.set_option('display.max_rows', None) #解决表格多行时中间省略显示问题(本程序用不到)
  16. pd.set_option('display.width', 5000) #解决表格打印换行
  17. #读取excel文件中的数据
  18. app = xw.App(visible = False, add_book = False) #打开excel程序
  19. workbook = app.books.open(path) #打开数据工作簿
  20. worksheet = workbook.sheets[0] #选中第一个工作表
  21. values = worksheet.range("A1").expand().options(pd.DataFrame, index = False).value #提取表中的数据
  22. print(values)
  23. workbook.close() #关闭工作簿
  24. app.quit() #关闭excel程序
  25. return values
  26. def Send_mail(users,content):
  27. user = '496077837@qq.com' #发件人的邮箱
  28. pwd = "替换成自己的" #QQ邮箱的SMTP授权码
  29. to = users #收件人的邮箱,多个收件人用英文逗号隔开
  30. cc_list = ['496077837@qq.com',] #设置抄送的邮箱,多个请用英文逗号隔开
  31. mail_msg = []
  32. mail_msg.append('<p>小主,您好!您有一个合同将到期,请查阅:</p>')
  33. mail_msg.append(content)
  34. mail_msg.append('<p style = "margin:0 auto">祝好!</p>')
  35. mail_msg.append('<p style = "margin:0 auto">小蟒</p>')
  36. mail_msg = '\n'.join(mail_msg)
  37. msg = MIMEText(mail_msg, "html", "utf-8") #添加正文内容
  38. #2.设置邮件主题、发件人、收件人
  39. msg["Subject"] = '测试邮件主题!' #设置邮件的主题
  40. msg["From"] = user #设置发件人
  41. msg["To"] = to #设置收件人
  42. msg['Cc'] = ','.join(cc_list)
  43. #3.发送邮件
  44. try:
  45. s = smtplib.SMTP_SSL("smtp.qq.com", 465) #选择qq邮箱服务,默认端口为465
  46. #s = smtplib.SMTP_SSL("smtp.163.com", 465) #选择163邮箱服务,默认端口为465
  47. s.login(user, pwd) #登陆邮箱
  48. s.send_message(msg) #发送邮件
  49. s.quit() #退出QQ邮箱服务
  50. print("Success!")
  51. except Exception as e:
  52. print("send email failed! next is the reason")
  53. print(e)
  54. def remind_check():
  55. path = "到期提醒邮件.xlsx" #指定文件所在路径
  56. values = read_excel(path) #调用read_excel模块读取数据
  57. print("读取excel数据中...")
  58. for i in range(len(values)):
  59. line = values.iloc[i] #选中一行数据
  60. #print(line)
  61. dead_line = line['到期日期']
  62. a = (datetime.now() + timedelta(days=7)) #当前日期7天内 设置需要提醒的日期
  63. if dead_line <= a:
  64. print(dead_line)
  65. name = line['合同名称']
  66. dead_line = line['到期日期']
  67. users = line['用户邮箱']
  68. content = '<p style = "margin:0 auto">'+'合同名称:'+name+' '+"到期日期:"+str(dead_line)+'</p>'
  69. Send_mail(users,content)
  70. print(name+"邮件提醒发送成功!")
  71. print("\n")
  72. #values = read_excel(path) #调用read_excel模块读取数据
  73. #定时执行的代码
  74. #schedule.every().day.at("09:03").do(eating) #每天定时执行任务
  75. schedule.every(1).minutes.do(remind_check) #每隔1分钟定时执行任务
  76. #schedule.every().hour.do(eating) #每隔1小时间定时执行任务
  77. #schedule.every().monday.at("12:00").do(eating) #每周一定时执行任务
  78. while True: #让程序一直运行
  79. schedule.run_pending() #运行所有可以运行的schedule任务
  80. time.sleep(10)

效果
image.png
image.png

image.png