import platform import os import socket import sqlite3 import shutil import sys import urllib.request import urllib import http.client import smtplib from urllib.error import URLError, HTTPError from datetime import datetime, timedelta def email(user, pwd, recipient, subject, body): FROM = user TO = recipient if isinstance(recipient, list) else [recipient] SUBJECT = subject TEXT = body # Prepare actual message message = """From: %s\nTo: %s\nSubject: %s\n\n%s """ % (FROM, ", ".join(TO), SUBJECT, TEXT) try: server = smtplib.SMTP("smtp.gmail.com", 587) server.ehlo() server.starttls() server.login(user, pwd) server.sendmail(FROM, TO, message) server.close() print('成功寄出電子郵件') except: print("寄送電子郵件發生錯誤!") deviceName = "" if len(sys.argv) > 1: deviceName = sys.argv[1].lower() else: print("Usage: diskFreeSpace deviceName") print("Ex1.: diskFreeSpace F:") print("Ex2.: diskFreeSpace /") print("Ex3.: diskFreeSpace /Volumes/Macintash\\ HD") print("") sys.exit(-1) dbFile = "diskFreeSpace2.db" conn = sqlite3.connect(dbFile) print("Opened database successfully") c = conn.cursor() c.execute(''' CREATE TABLE IF NOT EXISTS freeSpaceLog ( id INTEGER PRIMARY KEY AUTOINCREMENT, freeBits INTTEGER NOT NULL DEFAULT 0, CRDT TIMESTAMP DEFAULT CURRENT_TIMESTAMP, delta INTEGER, ZODT DATETIME ); ''') print("freeSpaceLog created successfully") conn.commit() now1 = datetime.now() nws1 = now1.strftime("%Y-%m-%d %H:%M:%S") lastFree = 0 oldDate = now1 results = c.execute("SELECT id, freeBits, CRDT FROM freeSpaceLog ORDER BY id desc LIMIT 1") for row in results: print("id = ", row[0]) print("freeBits = ", row[1]) print("CRDT = ", row[2], "\n") lastFree = row[1] oldDate = row[2] total, used, free = shutil.disk_usage(deviceName) print(free) c.execute(''' INSERT INTO freeSpaceLog(freeBits,CRDT) VALUES ( ''' + str(free) + ",'" + nws1 + "'" + ''')''') conn.commit() if lastFree == 0: print("This is the first time running and can not estimate usage date!") sys.exit(1) rl2 = c.execute(''' SELECT MAX(id) from freeSpaceLog ''') maxid = 0 for row in rl2: maxid = row[0] print("MAX(id) = ", maxid) spaceUsed = lastFree - free c.execute("UPDATE freeSpaceLog set delta = " + str(spaceUsed) + " WHERE id = " + str(maxid)) conn.commit() c.execute("update freeSpaceLog " + "set ZODT = datetime(strftime('%s',CRDT) + freeBits / delta * 86400, 'unixepoch', 'localtime') " + "WHERE id = " + str(maxid)) conn.commit() c.execute(""" update freeSpaceLog set delta = (select avg(delta) from freespacelog where id > 1) where id = 1 """) conn.commit() c.execute(""" update freeSpaceLog set ZODT = datetime(strftime('%s',CRDT) + freeBits / delta * 86400, 'unixepoch', 'localtime') where id = 1 """) conn.commit() msg = "" host = socket.gethostname() if spaceUsed == 0: msg = deviceName + " no space used! for " + host else: rl3 = c.execute("SELECT ZODT FROM freeSpaceLog WHERE id = 1") diskFullDate = "" for row in rl3: diskFullDate = row[0] msg = host + " disk " + deviceName + " will be full at " + diskFullDate conn.close() print(msg) gmail_user = '請填入您的用來寄信的gmail信箱地址' gmail_password = '請填入您的gmail密碼' email_to = '請填入收信的電子郵件信箱' subject = 'diskFreeSpace2 硬碟空間資訊' body = msg email(gmail_user,gmail_password,email_to,subject,body) ''' 目的:監視硬碟空間與估計硬碟空間用完的日期。 作者:寶焰自在工作室 徐承岳 Mario Hsu。 沿革: 2020-05-25 0.0.0.3 1.為了釋出,方便應用,訊息通知改由Email來完成。 2.變更檔案名稱為diskFreeSpace2.py。 3.產生的資料庫檔案也變更為diskFreeSpace2.db。 4.email函式來自 https://stackoverflow.com/questions/10147455/how-to-send-an-email-with-gmail-as-provider-using-python 2019-11-09 0.0.0.2 1.增加資料庫欄位。 2.變更估計用完日期採平均數計算。 2019-11-04 0.0.0.1 1.誕生日。 '''