现在有一个场景,需要每月的最后一天,发送一封邮件。
有没有办法使用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