检测公网 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 地址

post-577-63305ff179322

阅读剩余
THE END