如今有一個場景,須要每個月的最後一天,發送一封郵件。html
有沒有辦法使用Python的標準庫輕鬆肯定(即一個函數調用)給定月份的最後一天?python
答案是有的,使用 datetime 就能夠實現服務器
#!/usr/bin/env python # coding: utf-8 import datetime def last_day_of_month(any_day): """ 獲取得到一個月中的最後一天 :param any_day: 任意日期 :return: string """ next_month = any_day.replace(day=28) + datetime.timedelta(days=4) # this will never fail return next_month - datetime.timedelta(days=next_month.day) # 注意: 年月日,這些變量必須是數字,不然報錯! year = 2019 # 年 month = 5 # 月 day = 16 # 日 res = last_day_of_month(datetime.date(year, month, day)) print(res)
執行輸出:ide
2019-05-31
#!/usr/bin/env python3 # coding: utf-8 import datetime def last_day_of_month(any_day): """ 獲取得到一個月中的最後一天 :param any_day: 任意日期 :return: string """ next_month = any_day.replace(day=28) + datetime.timedelta(days=4) # this will never fail return next_month - datetime.timedelta(days=next_month.day) # 當前日期 now = datetime.datetime.now().date() year,month,day = str(now).split("-") # 切割 # 年月日,轉換爲數字 year = int(year) month = int(month) day = int(day) # 獲取這個月最後一天 last_day = last_day_of_month(datetime.date(year, month, day)) # 判斷當前日期是否爲月末 if str(now) == last_day: print('yes') else: print('no')
執行輸出:函數
no
發送郵件部分,參考連接:ui
http://www.javashuo.com/article/p-suzbljwg-gb.htmlthis
./ ├── send_mail.py └── alert.py
send_mail.py編碼
#!/usr/bin/env python3 # coding: utf-8 """ 發送郵件 """ import sys import smtplib # 加載smtplib模塊 from email.mime.text import MIMEText from email.utils import formataddr class SendMail(object): def __init__(self, sender, title, content): self.sender = sender # 發送地址 self.title = title # 標題 self.content = content # 發送內容 self.sys_sender = '123456@163.com' # 系統帳戶 self.sys_pwd = '123456' # 系統帳戶密碼 def send(self): try: """ 構造一個郵件對象, 第一個參數就是郵件正文, 第二個參數是MIME的subtype,傳入'html',最終的MIME就是'text/html'。 最後必定要用utf-8編碼保證多語言兼容性。 """ msg = MIMEText(self.content, 'html', 'utf-8') # 發件人格式 msg['From'] = formataddr(["IT事業部系統", self.sys_sender]) # 收件人格式 msg['To'] = formataddr(["", self.sender]) # 郵件主題 msg['Subject'] = self.title # SMTP服務器 server = smtplib.SMTP("smtp.163.com", 25) # 登陸帳戶 server.login(self.sys_sender, self.sys_pwd) # 發送郵件 server.sendmail(self.sys_sender, [self.sender, ], msg.as_string()) # 退出帳戶 server.quit() return True except Exception as e: print(e) return False if __name__ == '__main__': # 參數個數,因爲sys.argv[0]就是腳本名,因此要減1 num = len(sys.argv) - 1 if num < 3 or num > 3: exit("參數錯誤,必須傳3個參數!當前參數個數爲%s" % num) sender = sys.argv[1] # 發送地址 title = sys.argv[2] # 標題 content = sys.argv[3] # 發送內容 # 調用send方法,發送郵件 ret = SendMail(sender, title, content).send() if ret: print('發送成功!') else: print('發送失敗!')
alert.pyspa
#!/usr/bin/env python3 # coding: utf-8 """ 月末發送一封郵件 """ import datetime from send_mail import SendMail class AlertServices(object): def __init__(self): pass def last_day_of_month(self,any_day): """ 獲取得到一個月中的最後一天 :param any_day: 任意日期 :return: string """ next_month = any_day.replace(day=28) + datetime.timedelta(days=4) # this will never fail return next_month - datetime.timedelta(days=next_month.day) def main(self): """ 主程序 :return: """ # 當前日期 now = datetime.datetime.now().date() year,month,day = str(now).split("-") # 切割 # 年月日,轉換爲數字 year = int(year) month = int(month) day = int(day) # 獲取這個月最後一天 last_day = self.last_day_of_month(datetime.date(year, month, day)) # 判斷當前日期是否爲月末 if str(now) != last_day: print("不是月末") return False # 發送郵件 sender = "12345678@qq.com" # 發送地址 title = "月末提醒" # 標題 content = "還不快點寫報告" # 發送內容 # 調用send方法,發送郵件 ret = SendMail(sender, title, content).send() if ret: print('發送成功!') else: print('發送失敗!') if __name__ == '__main__': # 執行主程序 AlertServices().main()
執行 alert.py,輸出:code
不是月末
定義Linux任務計劃,天天早上9點執行一次。
0 9 * * * root /usr/bin/python3 /opt/alert/alert.py
本文參考連接: