检测公网 ip 变化后发送邮箱(三)- 制作方便使用的 docker 镜像

234次阅读
没有评论

共计 3622 个字符,预计需要花费 10 分钟才能阅读完成。

一、修改脚本

之前用 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 地址

检测公网 ip 变化后发送邮箱(三)- 制作方便使用的 docker 镜像

提醒:本文发布于669天前,文中所关联的信息可能已发生改变,请知悉!

AD:【腾讯云服务器大降价】2核4G 222元/3年 1核2G 38元/年
正文完
 
阿蛮君
版权声明:本站原创文章,由 阿蛮君 2022-09-25发表,共计3622字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
Copyright © 2022-2024 阿蛮君博客 湘ICP备2023001393号
本网站由 亿信互联 提供云计算服务 | 蓝易云CDN 提供安全防护和加速服务
Powered by Wordpress  Theme by Puock