利用python怎么实现一个定时发送邮件功能
创始人
2024-12-27 00:41:41
0次

全部代码如下:

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 = \
    '''
    
    
      

hi,All:

                          工作事项           负责人           进度           风险与问题              '''   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 = \       '''                        {workdata}             {person_name}             {progress}             {issue}                  '''.format(workdata=workdata.replace('\n', '
'), person_name=person_name, progress=progress, issue=issue)     html_content_start += html_content_suffer     html_content_end = \     '''                      '''   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 = \
    '''
    
    
      

hi,All:

                          工作事项           负责人           进度           风险与问题              '''   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 = \       '''                        {workdata}             {person_name}             {progress}             {issue}                  '''.format(workdata=workdata.replace('\n', '
'), person_name=person_name.replace('\n', '
'), progress=progress.replace('\n', '
'), issue=issue.replace('\n', '
'))     html_content_start += html_content_suffer     html_content_end = \     '''                      '''   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()

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...