依赖aliyun的邮件推送服务
1、安装依赖包
pip3 install alibabacloud_dm20151123
2、编写配置文件config.json
{"alibaba_cloud": {"access_key_id": "XXXXXXXXXXXXXXXXXXX","access_key_secret": "XXXXXXXXXXXXXXXX","region_id": "ap-southeast-1","endpoint": "dm.ap-southeast-1.aliyuncs.com"},"email": {"from_address": "abc@XXXX.com","to_address": ["acdtf92@gmail.com","segrd@let.vet"]},"ssl": {"domains": ["ase.abc.com","ase.abc.cn:8443"]}
}
3、脚本正文
import json
import ssl
import socket
from datetime import datetime
from alibabacloud_dm20151123.client import Client as Dm20151123Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_dm20151123 import models as dm_20151123_models
from alibabacloud_tea_util import models as util_models# 读取配置文件
def load_config(file_path: str) -> dict:with open(file_path, 'r') as f:return json.load(f)def get_ssl_cert_expiry_date(host_with_port: str) -> datetime:try:# 处理主机和端口,默认端口是 443if ':' in host_with_port:host, port = host_with_port.split(':')port = int(port)else:host = host_with_portport = 443context = ssl.create_default_context()with socket.create_connection((host, port)) as sock:with context.wrap_socket(sock, server_hostname=host) as ssock:cert = ssock.getpeercert()expiry_date_str = cert['notAfter']expiry_date = datetime.strptime(expiry_date_str, '%b %d %H:%M:%S %Y GMT')return expiry_dateexcept Exception as e:# 记录错误,但不发送邮件print(f"Error retrieving SSL certificate for {host_with_port}: {e}")return Noneclass Sample:@staticmethoddef create_client(config: dict) -> Dm20151123Client:alibaba_cloud_config = config['alibaba_cloud']client_config = open_api_models.Config(access_key_id=alibaba_cloud_config['access_key_id'],access_key_secret=alibaba_cloud_config['access_key_secret'])client_config.endpoint = alibaba_cloud_config['endpoint']return Dm20151123Client(client_config)@staticmethoddef send_email(config: dict, subject: str, body: str) -> None:client = Sample.create_client(config)email_config = config['email']to_addresses = ','.join(email_config['to_address']) # 将多个地址合并为逗号分隔的字符串single_send_mail_request = dm_20151123_models.SingleSendMailRequest(account_name=email_config['from_address'],to_address=to_addresses,subject=subject,html_body=body,reply_to_address=True,address_type=1 # Added AddressType parameter)runtime = util_models.RuntimeOptions()try:response = client.single_send_mail_with_options(single_send_mail_request, runtime)print(f"Email sent successfully: {response}")except Exception as error:# 记录错误,但不将错误信息发送到邮件中print(f"Error sending email: {error.message}")@staticmethoddef main() -> None:config = load_config('config.json')ssl_config = config['ssl']domains = ssl_config['domains']for domain in domains:expiry_date = get_ssl_cert_expiry_date(domain)if expiry_date:days_remaining = (expiry_date - datetime.now()).daysif days_remaining <= 10:subject = f"SSL Certificate Expiry Warning for {domain}"body = f"SSL certificate for {domain} will expire on {expiry_date.strftime('%Y-%m-%d %H:%M:%S')}. Only {days_remaining} days remaining."Sample.send_email(config, subject, body)elif days_remaining < 0:subject = f"SSL Certificate Expired for {domain}"body = f"SSL certificate for {domain} expired on {expiry_date.strftime('%Y-%m-%d %H:%M:%S')}. It has been expired for {-days_remaining} days."Sample.send_email(config, subject, body)else:# 记录证书检索错误,但不发送邮件print(f"Skipping {domain} due to SSL certificate retrieval error.")if __name__ == '__main__':Sample.main()
4、执行结果
# /usr/bin/python3 ssl_spirtime.py --config-file config.json
Error retrieving SSL certificate for biking999.com: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1131)
Skipping bidd999.com due to SSL certificate retrieval error.
Email sent successfully: {'headers': {'date': 'Wed, 18 Sep 2024 07:36:36 GMT', 'content-type': 'application/json;charset=utf-8', 'content-length': '82', 'connection': 'keep-alive', 'keep-alive': 'timeout=25', 'access-control-allow-origin': '*', 'access-control-expose-headers': '*', 'x-acs-request-id': 'D2D4F3A9-DFA3-3BF4-8CA1-1EAF53925294', 'x-acs-trace-id': 'dfa8887a84c0eec8eb4fdb464b1d8f58', 'etag': '8uOlvXmQYUyBJKzVwsfMCGA2'}, 'statusCode': 200, 'body': {'EnvId': '8000000005879627107', 'RequestId': 'D2D4F3A9-DFA3-3BF4-8CA1-1EAF53925294'}}