lxcl96 发表于 2023-11-7 13:18

定时获取公网ip并发送邮件提醒

0、前言前一段时间路由器刷的老毛子固件“穿透服务”中定时更新阿里DDNS失败了,用了很久第一次遇到。所以需要做个备用的措施用来实时获取公网ip信息。1、基于python实现

[*]开启邮箱的SMTP功能
[*]拿到授权码(不是登录密码)


#!/usr/bin/python
# -*- coding: UTF-8 -*-
import os
import re
import random
import requests
import logging
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from string import Template
from email.utils import parseaddr, formataddr
# 输出日志格式
logging.basicConfig(format='%(asctime)s - %(filename)s - %(levelname)s: %(message)s',
                  level=logging.INFO,
                  filename='sendWANIP.log',
                  filemode='a')


def _format_addr(s):
    """
    美化邮箱地址,用于可显示发/收件人
    :param s: 邮件地址
    :return: 美化后的地址
    """
    addr = parseaddr(s)
    return formataddr(addr)

def get_current_ip():
    """
    获取当前公网ip地址
    :return: 公网ip地址
    """
    ip_reg = re.compile("((2(5|\\d))|?\\d{1,2})(\\.((2(5|\\d))|?\\d{1,2})){3}")
    # 可根据需求增删获取ip网址
    api_tuple = (
      "http://txt.go.sohu.com/ip/soip",
      "https://ident.me/",
      "https://ifconfig.me/ip",
      "https://icanhazip.com/",
      "https://checkip.amazonaws.com/",
      "http://members.3322.org/dyndns/getip"
    )
    url = api_tuple
    # print(url)
    r = requests.get(url)
    ip = re.findall(r'\d+.\d+.\d+.\d+', r.text)
    # ip
    if re.match(ip_reg,ip):
      logging.info("从{}获取地址成功!ip={}".format(url,ip))
      return ip
    else:
      logging.error("从{}获取地址失败!".format(url))
      exit(-1)

def record_ip(params):
    """
    将最新的ip记录在文件中
    :param params: 包含ip的参数
    """
    filename="./lastwanip"
    last_wan_ip=""
    if os.path.exists(filename):
      f=open(filename,'r');
      last_wan_ip=f.readline()
      f.close()
    logging.info("从文件中读到ip地址为:{}".format(last_wan_ip))
    if last_wan_ip!= params['current_ip']:
      f = open(filename, 'w');
      f.write(params['current_ip'])
      f.close()
    else:
      logging.info("ip地址已经是最新的,无需更新")
      exit(0)
def send_mail(params):
    """
    给指定用户发送邮件
    :param params: 发送邮件信息
    :return: 0: 发送成功,>0 发送失败
    """
    # 第三方 SMTP 服务
    mail_host = "smtp.163.com"# 设置服务器
    mail_user = "xxxx"# 用户名
    mail_pass = "xxxxxxxx"# 口令,即授权码不是账户密码
    receivers = sender = 'xxxx@163.com'
    # 邮件内容支持html格式,仿照的腾讯云模板
    mail_text="""
    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <title>IP地址</title>
    </head>
    <body>
    <div>
      <includetail>
            <div align="center">
                <div class="open_email" style="margin-left: 8px; margin-top: 8px; margin-bottom: 8px; margin-right: 8px;">
                  <div>
                        <br>
                        <span class="genEmailContent">
                            <div id="cTMail-Wrap"
                                 style="word-break: break-all;box-sizing:border-box;text-align:center;min-width:320px; max-width:660px; border:1px solid #f6f6f6; background-color:#f7f8fa; margin:auto; padding:20px 0 30px; font-family:'helvetica neue',PingFangSC-Light,arial,'hiragino sans gb','microsoft yahei ui','microsoft yahei',simsun,sans-serif">
                              <div class="main-content" style="">
                                    <table style="width:100%;font-weight:300;margin-bottom:10px;border-collapse:collapse">
                                        <tbody>
                                        <tr style="font-weight:300">
                                          <td style="width:3%;max-width:30px;"></td>
                                          <td style="max-width:600px;">
                                                <div id="cTMail-logo" style="width:92px; height:25px;">
                                                    <a href="#">
                                                      <img id="logo" border="0" src="data:image/png;base64,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"
                                                             style="width:183px; height:66px;display:block">
                                                    </a>
                                                </div>
                                                <br/>
                                                <p style="height:2px;background-color: #00a4ff;border: 0;font-size:0;padding:0;width:100%;margin-top:20px;"></p>
                                                <div id="cTMail-inner" style="background-color:#fff; padding:23px 0 20px;box-shadow: 0px 1px 1px 0px rgba(122, 55, 55, 0.2);text-align:left;">
                                                    <table style="width:100%;font-weight:300;margin-bottom:10px;border-collapse:collapse;text-align:left;">
                                                      <tbody>
                                                      <tr style="font-weight:300">
                                                            <td style="width:3.2%;max-width:30px;"></td>
                                                            <td style="max-width:480px;text-align:left;">
                                                                <h1 id="cTMail-title" style="font-size: 20px; line-height: 36px; margin: 0px 0px 22px;">
                                                                  
                                                                </h1>
   
                                                                <p id="cTMail-userName" style="font-size:14px;color:#333; line-height:24px; margin:0;">
                                                                  <span>
                                                                        Your current public ip address is :
                                                                        <strong>${current_ip}</strong>
                                                                        .
                                                                  </span>
                                                                </p>
   
                                                                <dl style="font-size: 14px; color: rgb(51, 51, 51); line-height: 18px;">
                                                                  <dd style="margin: 0px 0px 6px; padding: 0px; font-size: 12px; line-height: 22px;">
                                                                        <p id="cTMail-sender" style="font-size: 14px; line-height: 26px; word-wrap: break-word; word-break: break-all; margin-top: 32px;">
                                                                            Sincerely,
                                                                            <br>
                                                                            <strong>${device}</strong>
                                                                        </p>
                                                                  </dd>
                                                                </dl>
                                                            </td>
                                                            <td style="width:3.2%;max-width:30px;"></td>
                                                      </tr>
                                                      </tbody>
                                                    </table>
                                                </div>
   
                                                <div id="cTMail-copy" style="text-align:center; font-size:12px; line-height:18px; color:#999">
                                                    <table style="width:100%;font-weight:300;margin-bottom:10px;border-collapse:collapse">
                                                      <tbody>
                                                      <tr style="font-weight:300">
                                                            <td style="width:3.2%;max-width:30px;"></td>
                                                            <td style="max-width:540px;">
                                                                <p style="text-align:center; margin:20px auto 14px auto;font-size:12px;color:#999;">
                                                                  如非本人邮件,请忽略!
                                                                </p>
                                                            <td style="width:3.2%;max-width:30px;"></td>
                                                      </tr>
                                                      </tbody>
                                                    </table>
                                                </div>
                                          </td>
                                          <td style="width:3%;max-width:30px;"></td>
                                        </tr>
                                        </tbody>
                                    </table>
                              </div>
                            </div>
                        </span>
                  </div>
                </div>
            </div>
      </includetail>
    </div>
   
    </body>
    </html>
    """
    mail = MIMEText(Template(mail_text).substitute(params), 'html', 'utf-8')
    # 显示发件人
    mail['From'] = _format_addr(sender)
    mail['To'] = _format_addr(receivers)
    # 设置邮件主题
    subject = ' {}'.format(params['current_ip'])
    mail['Subject'] = Header(subject, 'utf-8')

    try:
      smtpObj = smtplib.SMTP()
      smtpObj.connect(mail_host, 25)# 25 为 SMTP 端口号
      smtpObj.login(mail_user, mail_pass)
      smtpObj.sendmail(sender, receivers, mail.as_string())
      logging.info("邮件发送成功,最新ip为{}".format(params['current_ip']))
      return 0
    except smtplib.SMTPException as ex:
      logging.error("邮件发送失败{},".format(ex))
      return 1

if __name__=='__main__':
    device = os.environ['COMPUTERNAME']
    params = {"current_ip": get_current_ip(), "device": device}
    record_ip(params)
    send_mail(params)

2、创建bat文件启动脚本
"D:\Program Files\Python310\python.exe" D:\Code\Code\sendWANIP\sendWANIP.py
3、Windows任务计划
添加windows任务计划,每隔10分钟执行bat文件获取公网ip
注意:

[*]“程序或脚本”中写的可执行文件不要被引号包裹
[*]起始位置必填,为可执行文件所在的目录否则无法执行


4、shell脚本
路由器上跑的shell脚本,百度得来的出处忘记了,有需要的可以参考
#!/bin/bash

#SMTP配置   #(例子)
#SMTP服务器#smtpserver=smtp.126.com
#邮箱账号#fromaddress=xxxxxx@126.com
#邮箱密码fromaddresspwd=xxxxxxxxxxxxx
#收件人信息#toaddress=xxxxxx@qq.com 英文逗号分隔



#SMTP配置
smtpserver=smtp.163.com
fromaddress=xxxx@163.com
fromaddresspwd=xxxxxxxxxxxxx
toaddress=xxxxx@163.com



#文件路径,最新ip写入lastwanip.txt
iptxt="/etc/storage/lastwanip.txt"
#文件路径,邮件正文,写入mail文件
mailtxtpath="/etc/storage/mail.txt"




#获取WANIP接口
newwanip=`wget http://members.3322.org/dyndns/getip -q -O -`




#如接口获取不到ip,本次取消发送
echo $newwanip

if [ x"$newwanip" = "x" ]; then
newwanip=`wget https://ifconfig.me/ip -q -O -`
echo $newwanip
if [ x"$newwanip" = "x" ]; then
    exit
fi
fi

if [ -f $iptxt ]; then
oldwanip=`cat $iptxt`
else
oldwanip="0.0.0.0"
fi





#对比上次IP,如相同则不发邮件,否则发送
echo $oldwanip

if [ "$newwanip" = "$oldwanip" ]; then
exit
fi
if [ -f $mailtxtpath ]; then
rm -f $mailtxtpath
fi





#配置邮件标题,修改“wanip”和在${newwanip} 后面加参数
#不能修改代码格式,行与行之间必须空格!
cat<<EOF >>$mailtxtpath
Subject: WANIP:[ ${newwanip} ]

路由器型号 = RedMi AC2100

IP=    ${newwanip}

ok

To: $toaddress
From: $fromaddress
EOF





#调用系统邮件服务
sendmail -f $fromaddress -t $toaddress -S $smtpserver -au$fromaddress -ap$fromaddresspwd < $mailtxtpath




#缓存最新ip地址,写入/etc/storage/lastwanip.txt"
echo $newwanip > $iptxt




#打印系统日志,调用logger接口
logger 发现WANIP变化,外网IP= $newwanip
logger ($fromaddress)已邮件通知($toaddress)

wululu0922 发表于 2023-11-7 23:50

这个太麻烦了!!看看这个:https://github.com/jeessy2/ddns-go

three 发表于 2023-11-7 18:18

set CARR_date=%date:~0,4%%date:~5,2%%date:~8,2%
curl http://members.3322.org/dyndns/getip/>>getip.txt
echo ^<br^> %CARR_date% ^<br^>   > getip.txt
blat getip.txt -html -to 接收邮箱 -attach "getip.txt" -s "标题" -r -d

批处理cmd命令,4行代码解决问题,最短可能只需2行。
发邮件软件我用的 blat, 其他一样做成 任务计划,
批处理还可以 更改一下,不写时间,大约5~6行,对比上一次获取ip文件 是否和当前ip文件 不同,针对不同,发不同邮件!

发邮件可以能会用的组件:
stunnel    https://www.stunnel.org/downloads.html
Blat       https://sourceforge.net/projects/blat/
网上有使用方法。       

wm517 发表于 2023-11-7 15:53

感谢 很实用

mngzs 发表于 2023-11-7 15:55

没公网,但有ipv6

不知道改成啥 发表于 2023-11-7 16:24

获取ip的端口收下了

Kls673M 发表于 2023-11-7 16:42

ip6有什么办法穿

四哥! 发表于 2023-11-7 16:48

获取ip的端口收下了

G_F1019 发表于 2023-11-7 17:24

感谢分享

DaRuiDd 发表于 2023-11-7 17:39

这可以用来做什么,可以说一下么{:1_904:}

zxsbk 发表于 2023-11-7 17:53

我的树莓派可以用上了。

ytfrdfiw 发表于 2023-11-7 17:58

感谢分享。
页: [1] 2 3 4 5
查看完整版本: 定时获取公网ip并发送邮件提醒