根據excel數據過期發送郵件提醒


#!/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如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM