发布时间:2020-02-24 09:42:50编辑:admin阅读(2663)
现在有一个场景,需要每月的最后一天,发送一封邮件。
有没有办法使用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)
执行输出:
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
发送邮件部分,参考链接:
https://www.cnblogs.com/xiao987334176/p/10022026.html
./ ├── 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.py
#!/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,输出:
不是月末
定义Linux任务计划,每天早上9点执行一次。
0 9 * * * root /usr/bin/python3 /opt/alert/alert.py
本文参考链接:
https://cloud.tencent.com/developer/ask/188186
上一篇: microk8s 搭建
47569
45926
36869
34433
29042
25681
24530
19685
19205
17717
5542°
6119°
5653°
5707°
6663°
5449°
5454°
5961°
5934°
7264°