python脚本定时发送邮件


Posted in Python onDecember 22, 2020

本文实例为大家分享了python定时发送邮件的具体代码,供大家参考,具体内容如下

全部代码如下:

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, formataddr
 
import xlrd
from apscheduler.schedulers.blocking import BlockingScheduler
from xlrd import xldate_as_tuple
 
ISOTIMEFORMAT = '%Y%m%d'
import smtplib
 
 
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.nrows
 
  for i in range(1, Nrows):
    file_list.append(sheet_data.row_values(i))
 
  return file_list
 
 
def _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_suffer
 
  html_content_end = \
    '''
      </table>
    </body>
    </html>
    '''
  html_content = html_content_start + html_content_end
 
  try:
    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' # 服务器地址,默认端口号25
  to_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 year
    month (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 minimum
    a-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 range
    xth y  day  Fire on the x -th occurrence of weekday y within the month
    last x  day  Fire on the last occurrence of weekday x within the month
    last  day  Fire on the last day within the month
    x,y,z  any  Fire on any matching expression; can combine any number of any of the above expressions
    '''
  scheduler.start()

表格如下:

python脚本定时发送邮件

如果放在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, formataddr
 
import sys
 
import xlrd
from apscheduler.schedulers.blocking import BlockingScheduler
from xlrd import xldate_as_tuple
 
ISOTIMEFORMAT = '%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.nrows
 
  for i in range(1, Nrows):
    file_list.append(sheet_data.row_values(i))
 
  return file_list
 
 
def _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_suffer
 
  html_content_end = \
    '''
      </table>
    </body>
    </html>
    '''
  html_content = html_content_start + html_content_end
 
  try:
    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' # 服务器地址,默认端口号25
  to_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 year
    month (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 minimum
    a-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 range
    xth y  day  Fire on the x -th occurrence of weekday y within the month
    last x  day  Fire on the last occurrence of weekday x within the month
    last  day  Fire on the last day within the month
    x,y,z  any  Fire on any matching expression; can combine any number of any of the above expressions
    '''
  scheduler.start()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python基于twisted实现简单的web服务器
Sep 29 Python
python解析xml文件操作实例
Oct 05 Python
Python采用socket模拟TCP通讯的实现方法
Nov 19 Python
django使用图片延时加载引起后台404错误
Apr 18 Python
Python遍历文件夹和读写文件的实现方法
May 10 Python
简单谈谈Python的pycurl模块
Apr 07 Python
Python qqbot 实现qq机器人的示例代码
Jul 11 Python
Python 格式化输出_String Formatting_控制小数点位数的实例详解
Feb 04 Python
Python将二维列表list的数据输出(TXT,Excel)
Apr 23 Python
Python的Django框架实现数据库查询(不返回QuerySet的方法)
May 19 Python
Python爬虫实现selenium处理iframe作用域问题
Jan 27 Python
Python预测分词的实现
Jun 18 Python
如何用python批量调整视频声音
Dec 22 #Python
分享一个python的aes加密代码
Dec 22 #Python
解决PyCharm无法使用lxml库的问题(图解)
Dec 22 #Python
去除python中的字符串空格的简单方法
Dec 22 #Python
Python lxml库的简单介绍及基本使用讲解
Dec 22 #Python
Python中过滤字符串列表的方法
Dec 22 #Python
python中@property的作用和getter setter的解释
Dec 22 #Python
You might like
用PHP读取和编写XML DOM的实现代码
2011/02/03 PHP
PHP中的函数-- foreach()的用法详解
2013/06/24 PHP
PHP的引用详解
2015/02/22 PHP
Yii2――使用数据库操作汇总(增删查改、事务)
2016/12/19 PHP
PHP实现的各类hash算法长度及性能测试实例
2017/08/27 PHP
PHP 结合 Boostrap 结合 js 实现学生列表删除编辑及搜索功能
2019/05/21 PHP
laravel-admin 实现在指定的相册下添加照片
2019/10/21 PHP
用脚本调用样式的几种方法
2006/12/09 Javascript
跨浏览器的事件对象介绍
2012/06/27 Javascript
使用jquery清空、复位整个输入域
2015/04/02 Javascript
简介JavaScript中toTimeString()方法的使用
2015/06/12 Javascript
javascript从作用域链谈闭包
2020/07/29 Javascript
JS实现颜色动态淡化效果
2017/03/06 Javascript
AngularJS 仿微信图片手势缩放的实例
2017/09/28 Javascript
nodejs acl的用户权限管理详解
2018/03/14 NodeJs
Vue.js实现双向数据绑定方法(表单自动赋值、表单自动取值)
2018/08/27 Javascript
vue使用el-upload上传文件及Feign服务间传递文件的方法
2019/03/15 Javascript
React 使用Hooks简化受控组件的状态绑定
2019/03/18 Javascript
vue-cli3.X快速创建项目的方法步骤
2019/11/14 Javascript
详解Vue template 如何支持多个根结点
2020/02/10 Javascript
python3写的简单本地文件上传服务器实例
2018/06/04 Python
Windows下python3.6.4安装教程
2018/07/31 Python
使用python实现语音文件的特征提取方法
2019/01/09 Python
Python中new方法的详解
2019/01/15 Python
简单了解python 生成器 列表推导式 生成器表达式
2019/08/22 Python
Python 使用 Pillow 模块给图片添加文字水印的方法
2019/08/30 Python
CSS实现圆形放大镜狙击镜效果 只有圆圈里的放大
2012/12/10 HTML / CSS
HTML5 通过Vedio标签实现视频循环播放的示例代码
2020/08/05 HTML / CSS
美国新兴城市生活方式零售商:VILLA
2017/12/06 全球购物
椰子猫砂:CatSpot
2018/08/27 全球购物
美国运动鞋和服装网上商店:YCMC
2018/09/15 全球购物
初中班长竞选稿
2015/11/20 职场文书
《惊弓之鸟》教学反思
2016/02/20 职场文书
创业计划书之物流运送
2019/09/17 职场文书
如何使用Tkinter进行窗口的管理与设置
2021/06/30 Python
redis protocol通信协议及使用详解
2022/07/15 Redis