#!/usr/bin/python3 # @Date: 2020/8/18 9:23 # @Author: zhangcheng # @email: 3359957053@qq.com # -*- coding: utf-8 -*- """ 各部門虛擬機申請到期前,發送郵件提醒,避免遺漏處理 """ import os import xlrd import xlwt import smtplib import openpyxl import datetime import pythoncom import uuid from PIL import ImageGrab,Image from openpyxl import load_workbook from win32com.client import Dispatch from email.mime.text import MIMEText from email.utils import formataddr # 發件人郵箱賬號 sender = "xxxxx@utry.cn" # 發件人郵箱的密碼(授權碼,即客戶端密碼),騰訊郵箱的登錄密碼也能登錄成功 password = "xxx" # 抄送給哪些人員 cc_receiver = ["xxxx@qq.com"] def main(): # 獲取當天的日期 sNow = datetime.datetime.now().date() todayToexcel(sNow) just_open(filePath()) # 打開excel wb = xlrd.open_workbook(filename=filePath()) # 獲取sheet的數量 sheetNumbers = len(wb.sheet_names()) for j in range(0, sheetNumbers): sheet1 = wb.sheet_by_index(j) sheet1Name = load_workbook(filename = filePath()).worksheets[j] sheet1Name = str(sheet1Name).strip("<Worksheet>") # 獲取行數 nrows1 = sheet1.nrows for iRow in range(1, nrows1): # 獲取指定單元格數據 starttime = dateFormate(sheet1.cell(iRow, 5).value) endtime = dateFormate(sheet1.cell(iRow, 6).value) reportstart = datetime.datetime.now() + datetime.timedelta(days=7) reportstart = str(reportstart.strftime('%Y-%m-%d')) reportend = datetime.datetime.now() + datetime.timedelta(days=3) reportend = str(reportend.strftime('%Y-%m-%d')) if endtime == reportstart or endtime == reportend: #從excel中提取收件人郵箱 to_receiver = [ sheet1.cell(iRow, 4).value ] # if sheet1Name == "虛擬機": # else: s1 = "虛擬機IP地址:" + "".join(str(sheet1.cell(iRow, 0).value).ljust(17)) s2 = "虛擬機配置:" + "".join(str(sheet1.cell(iRow, 1).value).ljust(17)) s3 = "歸屬部門:" + "".join(str(sheet1.cell(iRow, 2).value).ljust(17)) s4 = "責任人:" + "".join(str(sheet1.cell(iRow, 3).value).ljust(17)) s5 = "開始時間:" + "".join(str(starttime).ljust(17)) s6 = "到期時間:" + "".join(str(endtime).ljust(17)) s7 = "距離到期天數:" + "".join(str(int(sheet1.cell(iRow, 10).value)).ljust(17)) s = s1 + s2 + s3 + s4 + s5 + s6 + s7 # 距離到期時間為第三天和第七天發送郵件 ret = sendEmail(to_receiver,s,sheet1Name) if ret: print("郵件發送成功") else: print("郵件發送失敗") def sendEmail(to_receiver,content,Name): """ 發送郵件 :param to_receiver: 收件人 :param content: 添加郵件正文描述 :param Name: sheetName :return: """ # 打開excel ret = True try: mail_body = "郵件提醒:\r\n 請注意如下{}即將到期,請確認是否續期,如已處理可忽略此封郵件,如過期將予以清除".format(Name) + "\r\n" + content + " \r\n (此郵件由系統自動發送,請勿回復)" # 郵件內容 msg = MIMEText(mail_body, 'plain', 'utf-8') # 括號里的對應發件人郵箱昵稱、發件人郵箱賬號 msg['From'] = sender # 括號里的對應收件人郵箱昵稱、收件人郵箱賬號 msg['To'] = ";".join(to_receiver) # 括號里的對應抄送人郵箱昵稱、收件人郵箱賬號 msg['Cc'] = ";".join(cc_receiver) # 郵件的主題 msg['Subject'] = "{}到期提醒".format(Name) receiver = to_receiver + cc_receiver # SMTP服務器,騰訊企業郵箱端口是465,騰訊郵箱支持SSL(不強制), 不支持TLS server = smtplib.SMTP_SSL("smtp.exmail.qq.com", 465) # 登錄服務器,括號中對應的是發件人郵箱賬號、郵箱密碼 server.login(sender, password) # 發送郵件,括號中對應的是發件人郵箱賬號、收件人郵箱賬號、發送郵件 server.sendmail(sender, receiver, msg.as_string()) # 關閉連接 server.quit() # 如果 try 中的語句沒有執行,則會執行下面的 ret=False except Exception: ret = False return ret def filePath(): """ 獲取需要讀取的excel文件路徑 :return: """ sPath = os.getcwd() #獲取當前路徑 sFile = "測試.xlsx" #文件名 sExcelFile = sPath + "\\" + sFile #拼接完整路徑 return sExcelFile def todayToexcel(today): """ 修改excel中today時間為今天 :param today: 今天的日期 :return: """ wb = openpyxl.load_workbook(filePath()) sheetNumber = len(wb.sheetnames) for j in range(0, sheetNumber): outSheet = wb.worksheets[j] nRows = outSheet.max_row for i in range(2, nRows+1): outSheet.cell(row=i, column=11).value = today wb.save(filePath()) def just_open(filename): """ 用於讀取excel中的公式結果,解決xlrd讀取公式單元格內容為空的問題 :param filename: excel文件路徑 :return: """ xlApp = Dispatch("Excel.Application") xlApp.Visible = False xlBook = xlApp.Workbooks.Open(filename) xlBook.Save() xlBook.Close() def dateFormate(timestamp): """ 格式化excel時間格式 :param timestamp: 從excel獲取的時間格式 :return: """ delta = datetime.timedelta(days=timestamp) timestamp = datetime.datetime.strptime('1899-12-30', '%Y-%m-%d') + delta timestamp = timestamp.strftime('%Y-%m-%d') return timestamp if __name__ == '__main__': main()
excel如下: