全部代码如下:

import time
from datetime import datetime
from email.header import Header
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddrimport xlrd
from apscheduler.schedulers.blocking import BlockingScheduler
from xlrd import xldate_as_tupleISOTIMEFORMAT = '%Y%m%d'
import smtplibdef read_file(file_path):file_list = []work_book = xlrd.open_workbook(file_path)sheet_data = work_book.sheet_by_name('Sheet1')print('now is process :', sheet_data.name)Nrows = sheet_data.nrowsfor i in range(1, Nrows):file_list.append(sheet_data.row_values(i))return file_listdef _format_addr(s):name, addr = parseaddr(s)return formataddr((Header(name, 'utf-8').encode(), addr))def sendEmail(from_addr, password, to_addr, smtp_server, file_list):nowDate = str(time.strftime(ISOTIMEFORMAT, time.localtime()))html_content_start = \'''<html><body><p>hi,All:</p><table border="0"width="95%"height="50%"cellpadding="1"style="margin:15px"cellspacing="1"bordercolor="#D3D3D3"bgcolor="#9F9F9F"><tr bgcolor="#D3D3D3" style="margin:10px"><th style="padding:6;font-size:16">工作事项</th><th style="padding:6;font-size:16">负责人</th><th style="padding:6;font-size:16">进度</th><th style="padding:6;font-size:16">风险与问题</th></tr>'''for i in range(len(file_list)):work = file_list[i]workdata, person_name, progress, issue = str(work[0]), str(work[1]), str(work[2]), str(work[3])if '.' in str(work[2]):  # 填的数字progress = "%.0f%%" % (work[2] * 100)  # 浮点转成百分比updateTime = xldate_as_tuple(work[4], 0)value = datetime(*updateTime)# 先转换为时间数组,然后转换为其他格式timeStruct = time.strptime(str(value), "%Y-%m-%d %H:%M:%S")uptTime = str(time.strftime("%Y%m%d", timeStruct))if uptTime != nowDate:raise RuntimeError('有人没有更新最新记录:' + str(work[1]))html_content_suffer = \'''<tr bgcolor="#FFFFFF" ><td style="padding:6;font-size:14">{workdata}</td><td style="padding:6;font-size:14">{person_name}</td><td style="padding:6;font-size:14">{progress}</td><td style="padding:6;font-size:14">{issue}</td></tr>'''.format(workdata=workdata.replace('\n', '<br>'), person_name=person_name, progress=progress, issue=issue)html_content_start += html_content_sufferhtml_content_end = \'''</table></body></html>'''html_content = html_content_start + html_content_endtry:msg = MIMEMultipart()msg.attach(MIMEText(html_content, 'html', 'utf-8'))msg['From'] = _format_addr('发送方 <%s>' % from_addr)msg['To'] = _format_addr(to_addr + '<%s>' % to_addr)msg['Subject'] = Header('主题' + nowDate, 'utf-8').encode()server = smtplib.SMTP_SSL(smtp_server, 465)server.login(from_addr, password)  # 登录邮箱服务器server.sendmail(from_addr, [to_addr], msg.as_string())  # 发送信息server.quit()print("from_addr:" + str(from_addr), "  to_addr:", to_addr, "已发送成功!")except Exception as e:print("发送失败" + e)def job():root_dir = 'D:\\develop\\python\\file'file_path = root_dir + "\\excel.xlsx"from_addr = 'aaa@163.com'  # 邮箱登录用户名password = 'mima'  # 登录密码smtp_server = 'smtp.com'  # 服务器地址,默认端口号25to_addr = 'aaa@163.com'  # 接收方邮箱file_list = read_file(file_path)sendEmail(from_addr, password, to_addr, smtp_server, file_list)print('发送完成')if __name__ == '__main__':# 该示例代码生成了一个BlockingScheduler调度器,使用了默认的任务存储MemoryJobStore,以及默认的执行器ThreadPoolExecutor,并且最大线程数为10。# BlockingScheduler:在进程中运行单个任务,调度器是唯一运行的东西scheduler = BlockingScheduler()# 采用阻塞的方式# 采用corn的方式,每天18点发送scheduler.add_job(job, 'cron', hour='18')'''year (int|str) – 4-digit yearmonth (int|str) – month (1-12)day (int|str) – day of the (1-31)week (int|str) – ISO week (1-53)day_of_week (int|str) – number or name of weekday (0-6 or mon,tue,wed,thu,fri,sat,sun)hour (int|str) – hour (0-23)minute (int|str) – minute (0-59)econd (int|str) – second (0-59)start_date (datetime|str) – earliest possible date/time to trigger on (inclusive)end_date (datetime|str) – latest possible date/time to trigger on (inclusive)timezone (datetime.tzinfo|str) – time zone to use for the date/time calculations (defaults to scheduler timezone)*    any    Fire on every value*/a    any    Fire every a values, starting from the minimuma-b    any    Fire on any value within the a-b range (a must be smaller than b)a-b/c    any    Fire every c values within the a-b rangexth y    day    Fire on the x -th occurrence of weekday y within the monthlast x    day    Fire on the last occurrence of weekday x within the monthlast    day    Fire on the last day within the monthx,y,z    any    Fire on any matching expression; can combine any number of any of the above expressions'''scheduler.start()

表格如下:

如果放在linux系统中执行,上述脚本不能执行成功,是因为对编码等有要求,全部更新代码如下:

#coding=utf-8
import time
from datetime import datetime
from email.header import Header
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddrimport sysimport xlrd
from apscheduler.schedulers.blocking import BlockingScheduler
from xlrd import xldate_as_tupleISOTIMEFORMAT = '%Y%m%d'
import smtplib
import logging
logging.basicConfig()def read_file(file_path):file_list = []work_book = xlrd.open_workbook(file_path)sheet_data = work_book.sheet_by_name('Sheet1')print('now is process :', sheet_data.name)Nrows = sheet_data.nrowsfor i in range(1, Nrows):file_list.append(sheet_data.row_values(i))return file_listdef _format_addr(s):name, addr = parseaddr(s)return formataddr((Header(name, 'utf-8').encode(), addr))def sendEmail(from_addr, password, to_addr, smtp_server, file_list):nowDate = str(time.strftime(ISOTIMEFORMAT, time.localtime()))html_content_start = \'''<html><body><p>hi,All:</p><table border="0"width="95%"height="50%"cellpadding="1"style="margin:15px"cellspacing="1"bordercolor="#D3D3D3"bgcolor="#9F9F9F"><tr bgcolor="#D3D3D3" style="margin:10px"><th style="padding:6;font-size:16">工作事项</th><th style="padding:6;font-size:16">负责人</th><th style="padding:6;font-size:16">进度</th><th style="padding:6;font-size:16">风险与问题</th></tr>'''for i in range(len(file_list)):work = file_list[i]workdata, person_name, progress, issue = str(work[0]), str(work[1]), str(work[2]), str(work[3])if '.' in str(work[2]):  # 填的数字progress = "%.0f%%" % (work[2] * 100)  # 浮点转成百分比updateTime = xldate_as_tuple(work[4], 0)value = datetime(*updateTime)# 先转换为时间数组,然后转换为其他格式timeStruct = time.strptime(str(value), "%Y-%m-%d %H:%M:%S")uptTime = str(time.strftime("%Y%m%d", timeStruct))if uptTime != nowDate:raise RuntimeError('有人没有更新最新记录:' + str(work[1]))html_content_suffer = \'''<tr bgcolor="#FFFFFF" ><td style="padding:6;font-size:14">{workdata}</td><td style="padding:6;font-size:14">{person_name}</td><td style="padding:6;font-size:14">{progress}</td><td style="padding:6;font-size:14">{issue}</td></tr>'''.format(workdata=workdata.replace('\n', '<br>'), person_name=person_name.replace('\n', '<br>'), progress=progress.replace('\n', '<br>'), issue=issue.replace('\n', '<br>'))html_content_start += html_content_sufferhtml_content_end = \'''</table></body></html>'''html_content = html_content_start + html_content_endtry:msg = MIMEMultipart()msg.attach(MIMEText(html_content, 'html', 'utf-8'))msg['From'] = _format_addr('发送方 <%s>' % from_addr)msg['To'] = _format_addr(to_addr + '<%s>' % to_addr)msg['Subject'] = Header('主题' + nowDate, 'utf-8').encode()server = smtplib.SMTP_SSL(smtp_server, 465)server.login(from_addr, password)  # 登录邮箱服务器server.sendmail(from_addr, [to_addr], msg.as_string())  # 发送信息server.quit()print("from_addr:" + str(from_addr), "  to_addr:", to_addr, "已发送成功!")except Exception as e:print("发送失败" + e)def job():root_dir = 'D:\\develop\\python\\file'file_path = root_dir + "\\excel.xlsx"from_addr = 'aaa@163.com'  # 邮箱登录用户名password = 'mima'  # 登录密码smtp_server = 'smtp.com'  # 服务器地址,默认端口号25to_addr = 'aaa@163.com'  # 接收方邮箱file_list = read_file(file_path)sendEmail(from_addr, password, to_addr, smtp_server, file_list)print('发送完成')if __name__ == '__main__':# 该示例代码生成了一个BlockingScheduler调度器,使用了默认的任务存储MemoryJobStore,以及默认的执行器ThreadPoolExecutor,并且最大线程数为10。# BlockingScheduler:在进程中运行单个任务,调度器是唯一运行的东西scheduler = BlockingScheduler()# 采用阻塞的方式reload(sys)sys.setdefaultencoding("utf8")# 采用corn的方式scheduler.add_job(job, 'cron', hour='21', minute='0')'''year (int|str) – 4-digit yearmonth (int|str) – month (1-12)day (int|str) – day of the (1-31)week (int|str) – ISO week (1-53)day_of_week (int|str) – number or name of weekday (0-6 or mon,tue,wed,thu,fri,sat,sun)hour (int|str) – hour (0-23)minute (int|str) – minute (0-59)econd (int|str) – second (0-59)start_date (datetime|str) – earliest possible date/time to trigger on (inclusive)end_date (datetime|str) – latest possible date/time to trigger on (inclusive)timezone (datetime.tzinfo|str) – time zone to use for the date/time calculations (defaults to scheduler timezone)*    any    Fire on every value*/a    any    Fire every a values, starting from the minimuma-b    any    Fire on any value within the a-b range (a must be smaller than b)a-b/c    any    Fire every c values within the a-b rangexth y    day    Fire on the x -th occurrence of weekday y within the monthlast x    day    Fire on the last occurrence of weekday x within the monthlast    day    Fire on the last day within the monthx,y,z    any    Fire on any matching expression; can combine any number of any of the above expressions'''scheduler.start()

可以开车了!~

python脚本定时发送邮件相关推荐

  1. 定时运行python脚本并发送邮件_python实现定时发送邮件到指定邮箱

    本文实例为大家分享了python实现定时发送邮件到指定邮箱的具体代码,供大家参考,具体内容如下 整个链路:传感器采集端采集数据,边缘端上传数据库,从数据库拿到数据. 产品端有个自动出报告的需求,并且希 ...

  2. 用python自动化定时发送邮件(普通文本,html,图片,附件等)_亲测有效

    这周有需求将Bi报表每天定时,自动的群发给team成员,今天搜集资料完成了这个需求,可以发送普通文本,图片,附件已经html形式将其展现出来,整套代码如下:已亲测可行,相关信息已脱敏~ 写完脚本后登陆 ...

  3. 清除python shell中的内容_如何使用python脚本定时清空文件内容?

    我们一直在对大家强调关于python脚本的使用,但是有部分同学提出疑问,就是关于上期跟大家说的shell脚本没有实质性的使用效果,如果在实际应用里,要怎么使用这个脚本,它又能实现什么效果,其实针对这个 ...

  4. Python脚本定时发送微信文件

    背景:朋友让我改一个文件,可我改完已经半夜了.这时候如果微信发给朋友恐会打扰他休息.于是决定用Python写一个自动发送微信信息的脚本,第二天早上自动发送. 任务简述:使用Python自动化程序,把f ...

  5. python stmp 定时发送邮件

    一.定时发送 安装schedule模块: pip install schedule 然后就是代码了: import schedule import time #引入schedule和timedef j ...

  6. 使用python脚本定时备份web网站

    1 #!/usr/bin/env python 2 #-*- coding: utf-8 -*- 3 4 import os 5 import time 6 7 # 备份的指定目录 8 source ...

  7. python脚本自动发送邮件和叮叮机器人发送群消息

    一.发送邮件 写脚本前需配置邮件获取授权码,如下图,开启POP3/SMTP服务 import yamail import requests import time import hmac import ...

  8. 利用Python实现定时发送邮件,实现一款营销工具

    说起自动化绝对算是茶余饭后最有显B格的谈资,毕竟解放双手是从老祖先那里就流传下来的基因,都2020了,你每天上班还要登录各个邮箱账号查收邮件?快来解锁本章内容 很多人学习python,不知道从何学起. ...

  9. 【Demo】python脚本定时提醒喝水脚本

    #from win10toast import ToastNotifier from win10toast_persist import ToastNotifier from apscheduler. ...

最新文章

  1. 微信小程序wx.request POST获取不到数据解决办法
  2. linux dma拷贝数据到用户态,图解:零拷贝Zero-Copy技术大揭秘
  3. sklear多项式回归
  4. 《高级软件架构师讲义》学习笔记5
  5. android闹钟实现原理
  6. 并行算法 Parallel Algorithm -- 提高执行效率
  7. 广东2021高考成绩位次查询,广东一分一段表查询2021-广东省2021年一分一段统计表...
  8. python连接不上数据库_绕不过去的Python连接MySQL数据库
  9. Project Euler 102:Triangle containment 包含原点的三角形
  10. ggplot2 多个柱状图比较_15. 再论ggplot2作图的图形元素组成
  11. 【正点原子Linux连载】第六十五章 Linux 音频驱动实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0
  12. 企业内部网路怎么防止网络出现环路?
  13. 求助!神舟笔记本BIOS进不去!
  14. 怎么学python入门?python新手学习路线
  15. python变量的声明和赋值
  16. 能够1年涨薪2次的软件测试工程师,他到底强在哪里?
  17. 使用命令行激活window10 亲测有效【不要修改命令】
  18. 知识产品经理需要掌握什么知识?
  19. ES-pinyin插件配置和使用
  20. SqlLocalDB使用笔记

热门文章

  1. [转]: 探索中国独立博客的发展
  2. 九阴真经Ambari——1.熟悉Hortonworks官网结构并找到Ambari下载地址
  3. html加拼音注释,HTML——格式化文本标记、拼音/音标注释ruby 标记和rt/rp 标记、段落缩进标记blockquote、预格式化标记pre...
  4. 工程技术开发的圈套与局限性
  5. 【论文阅读】Automatic Detection of Various Malicious Traffic Using Side Channel Features on TCP Packets
  6. 基于墨刀的视频剪辑软件Xshow原型化系统
  7. 小程序服务器域名和业务域名的总结和配置
  8. 0x00000709无法连接打印机怎么办?
  9. 17世纪初诞生了第一台电子计算机,世界上第一台计算机诞生于多少年?
  10. 集成Opencascade+Gmsh+OSG的CAD测试程序