检测公网 ip 变化后发送邮箱(三)- 制作方便使用的 docker 镜像
一、修改脚本
之前用 python 脚本完成了检测公网 ip 变化后发送邮箱的功能。实际能使用,但是如果运行在本地需要做相应的修改。
个人非常喜欢用 docker 将程序打包,这个脚本也不例外,当然既然要放在 docker 里面运行,就对之前的脚本做了一定的修改和完善。
比如说之前的 api 只能设置一个,现在可以一次性配置多个,以免某个 api 出现问题导致脚本无法正常运行。此外,将收发件邮箱、授权密码和检测间隔等都做成了环境变量。
import os
import requests
import re
import time
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
class ENV:
def __init__(self):
if(os.environ.get("FROM_EMAIL") == None):
raise Exception("请配置发送邮箱账户!")
if(os.environ.get("FROM_EMAIL_PASSWORD") == None):
raise Exception("请配置发送邮箱授权密码!")
api_str = "https://myip4.ipip.net, https://ddns.oray.com/checkip, https://ip.3322.net" if os.environ.get("API") == None else os.environ.get("API")
api_list = api_str.split(",")
# 对不符合规范添加 http请求头, 使 api 符合协议
for i in range(len(api_list)):
match = re.match("http", api_list[i])
if(match == None):
api_list[i] = "http://" + api_list[i]
self.api_list = api_list
self.from_email = os.environ.get("FROM_EMAIL")
self.from_email_password = os.environ.get("FROM_EMAIL_PASSWORD")
self.to_email = self.from_email if os.environ.get("TO_EMAIL") == None else os.environ.get("TO_EMAIL")
self.smtp_server = "smtp.qq.com" if os.environ.get("SMTP_SERVER") == None else os.environ.get("SMTP_SERVER")
self.smtp_port = 465 if os.environ.get("SMTP_PORT") == None else os.environ.get("SMTP_PORT")
self.interval = 10 if os.environ.get("INTERVAL") == None else os.environ.get("SMTP_PORT")
def current_ip(api_list):
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36"}
for api in api_list:
html = requests.get(api, headers=headers)
if(html.status_code == 200):
currentIp = re.findall( r'[0-9]+(?:\.[0-9]+){3}',html.text)[0]
return currentIp
print("所有获取公网的 api 均不可用")
def sendmail(oldIp, currentIp, env):
# 发信方的信息:发信邮箱,QQ 邮箱授权码
from_addr = env.from_email
password = env.from_email_password
# 收信方邮箱
to_addr = env.to_email
# 发信服务器
smtp_server = env.smtp_server
smtp_port = env.smtp_port
template = """
<p>主人,您的 ip 地址改变啦!</p>
<p>原 ip 地址:{0}</p>
<p>现 ip 地址:{1}</p>
"""
html_msg = template.format(oldIp, currentIp)
# 创建一个带附件的实例msg
msg = MIMEMultipart()
msg['From'] = Header('阿蛮博客') # 发送者
msg['To'] = Header('阿蛮博客') # 接收者
subject = 'IP 地址改变提醒'
msg['Subject'] = Header(subject, 'utf-8') # 邮件主题
# 邮件正文内容
msg.attach(MIMEText(html_msg, 'html', 'utf-8'))
try:
smtpobj = smtplib.SMTP_SSL(smtp_server)
smtpobj.connect(smtp_server, smtp_port) # 建立连接--qq邮箱服务和端口号
smtpobj.login(from_addr, password) # 登录--发送者账号和口令
smtpobj.sendmail(from_addr, to_addr, msg.as_string())
print("邮件发送成功")
except smtplib.SMTPException:
print("无法发送邮件")
finally:
# 关闭服务器
smtpobj.quit()
if __name__ == '__main__':
# 初始化变量
env = ENV()
#随意设置原 ip
oldIp = "127.0.0.1"
while True:
currentIp = current_ip(env.api_list)
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + "---oldIp:" + oldIp + ",currentIp:" + currentIp)
if(oldIp != currentIp):
print("Ip 地址发生改变")
sendmail(oldIp, currentIp, env)
oldIp = currentIp
time.sleep(env.interval)
二、制作镜像
dockerfile 内容如下:
FROM python:3.7-alpine
RUN pip install requests
COPY run.py /run.py
ENTRYPOINT ["python3", "-u","/run.py"]
制作出来的镜像比较小,20 M 左右。
三、运行镜像
最简单运行
如果你使用的是 qq 邮箱,且收发邮箱都是一个(否则还需要配置收件邮箱),那么你可以运行如下命令:
docker run -d \
--name checkip \
-e FROM_EMAIL="xxx@qq.com" \
-e FROM_EMAIL_PASSWORD="xxx" \
--restart=always \
hausen1012/checkip
配置全部变量运行
根据自己需要修改环境变量。
docker run -d \
--name checkip \
-e API="https://myip4.ipip.net,ddns.oray.com/checkip,https://ip.3322.net" \
-e FROM_EMAIL="xxx@qq.com" \
-e FROM_EMAIL_PASSWORD="xxx" \
-e TO_EMAIL="xxx@qq.com" \
-e SMTP_SERVER="smtp.qq.com" \
-e SMTP_PORT=465 \
-e INTERVAL=10 \
--restart=always \
hausen1012/checkip
环境变量解释:
变量 | 含义 |
---|---|
FROM_EMAIL | 发送人邮箱(必填) |
FROM_EMAIL_PASSWORD | 发送人邮箱授权码(必填) |
API | 可以返回公网地址的 api,多个地址以半角逗号隔开,默认为 https://myip4.ipip.net, https://ddns.oray.com/checkip, https://ip.3322.net |
TO_EMAIL | 收件人邮箱,默认为发送人邮箱 |
SMTP_SERVER | smtp 服务器地址,默认为 smtp.qq.com |
SMTP_PORT | smtp 端口,默认为 465 |
INTERVAL | 检测间隔,默认为 10s |
了解更多,请访问镜像的 dockerhub 地址
阅读剩余
THE END