【详细教程】Openwrt公网IP地址变动自动邮件通知（IPv4、IPv6都可）【转载重新整理】

原文章地址：
【详细教程】Openwrt 公网 IP 地址变动自动邮件通知（IPv4、IPv6 都可）
(出处：恩山无线论坛)

1. 准备工作
确保 OpenWRT 已安装了以下软件包：

msmtp：用于发送邮件
curl：用于获取 IP 地址
bash：支持运行脚本

进入你使用的邮箱桌面端网页，在设置里找到 “POP3/SMTP/IMAP” 的设置，这个网页一般会在某个地方提示你的邮箱服务商的 SMTP 服务器地址，比如 163 邮箱是 smtp.163.com，待会要用。

（可选操作：在 “POP3/SMTP/IMAP” 的设置网页里，将 SMTP 服务开启，开启后你会获得一个授权密码，复制并保存这个密码，待会也要用。）

2. 配置 msmtp 发送邮件
创建或编辑 msmtp 配置文件，这里可以直接用 WinSCP 工具编辑不用敲代码
WinSCP 工具提取码 9tsm

接下来就需要用到我上面说的 WinSCP 了，我们打开软件，它会弹出一个新建站点的框。

文件协议：scp
主机名：192.168.2.1 端口号：22 #路由器管理地址
用户名：root 密码：123456 #你路由器的账号跟密码
然后点击保存，跳出一个框勾选保存密码
之后点击登录就行，这样就可以看到路由器里的所有文件了。

用工具打开这个 /etc/ 目录，右键编辑 msmtprc

以 163 邮箱为例，如果以前没有配置过 /etc/msmtprc 那么可以把里面的内容全删了，输入以下内容：

Copy
defaults
auth on
tls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
logfile /var/log/msmtp.log
account default
host smtp.163.com #不是163邮箱的自行替换成你邮箱的SMTP服务器地址和端口
port 465 #163邮箱的SMTP服务器地址是:smtp.163.com，端口是:465
from 123456@163.com
user 123456@163.com
password **************** #这里填写你的邮箱密码或者SMTP授权密码
tls_starttls off
echo "Subject: OpenWRT" | msmtp -a default receive@qq.com #试邮件送功能，你可以通过这个命令测试是否可以成功发送邮件

如果没有成功发送邮件，也可使用下面命令查看日志，以便定位问题：
cat /var/log/msmtp.log

3. 编写检测 WAN 口 IP 地址变化的脚本
创建 IP 检测脚本，在 /root 目录下创建脚本 /root/ip.sh，该脚本将用于检查 WAN 口 IP 地址并在变化时发送邮件：

将以下代码复制到脚本文件中：

Copy
#!/bin/bash

current_ipv4=$(ip -4 addr show devpppoe-wan | grep -oE 'inet [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | awk '{print $2}') #获取当前的 WAN IPv4 地址，如果只需要获取WAN口的IPv4地址，就把获取WAN口IPv6地址的相关命令删掉

current_ipv6=$(ip -6 addr show devpppoe-wan | grep -oE 'inet6 [0-9a-fA-F:]+(/[0-9]+)?' | awk '{print $2}') #获取当前的 WAN IPv6 地址，如果只需要获取WAN口的IPv6地址，就把获取WAN口IPv4地址的相关命令删掉

if [ ! -f /root/wan_ip.txt ]; then
echo "$current_ipv4 $current_ipv6" > /root/wan_ip.txt #检查 wan_ip.txt 文件是否存在，如果不存在则创建文件并发送初始邮件

echo -e "Subject: OpenWRT WAN IP\n\n首次运行脚本，WAN IPv4 地址为: $current_ipv4\nWAN IPv6 地址为: $current_ipv6" | msmtp -a default receive@qq.com # 发送初始邮件通知

fi

saved_ip=$(cat /root/wan_ip.txt) #读取已保存的 IP 地址

if [ "$current_ipv4 $current_ipv6" != "$saved_ip" ]; then #如果当前的 IPv4 或 IPv6 地址与保存的不一致，发送邮件通知并更新记录
echo -e "Subject: OpenWRT WAN IP Changed\n\nWAN IPv4 已更改为: $current_ipv4\nWAN IPv6 已更改为: $current_ipv6\n之前的 IP 地址为: $saved_ip" | msmtp -a default receive@qq.com

echo "$current_ipv4 $current_ipv6" > /root/wan_ip.txt #更新 IP 记录

fi

设置脚本的执行权限： chmod +x /root/ip.sh
这里我们直接用软件操作，右键更改权限把右边的 3 个 X 都勾上就行。

4. 配置系统启动时自动运行脚本
编辑 /etc/rc.local 文件，使系统在启动或重启时执行该脚本：

软件打开 /etc/rc.local 右键编辑
在 exit 0 之前添加脚本运行命令：

开机后等 10 秒再运行脚本，避免因脚本运行在 PPPOE 拨号获取到公网 IP 地址之前，而错认为两次 IP 相同不发送邮件或者发送 IP 地址为空白的邮件

sleep 10 && /bin/bash/root/ip.sh

5. 设置定时任务检测 IP 变化
编辑 cron 配置，使用 crontab 设置定时任务，以每 5 分钟检查一次 IP 地址：

打开路由器 - 系统 - 计划任务
添加以下行，每 5 分钟运行一次脚本：

*/5 * * * * /bin/bash /root/ip.sh

7. 手动运行脚本测试
通过以下命令手动运行脚本，确保其工作正常：

/bin/bash /root/ip.sh

如果不是第一次运行该脚本，但是想测试该脚本时候正常运行。此时直接运行脚本不会收到任何邮件。跟随接下来的操作，先将 /root/wan_ip.txt 删除：

rm /root/ip.txt

再使用命令运行该脚本：

/bin/bash /root/ip.sh
也可以通过在脚本中添加日志记录或者在路由器启动后查看脚本的执行情况。例如，在脚本中添加如下内容（别添加在 “if” 到 “fi” 之间）来记录脚本是否被执行：

echo "Script executed at $(date)">> /root/check_wan_ip.log

查看日志记录：

cat /root/check_wan_ip.log

如果跟随本篇教程配置一切顺利的话，只需在脚本运行后稍等几秒查看邮件日志，就能收到一封带有当前 WAN 口 IP 地址的邮件通知。
这样， OpenWRT 系统就会在 WAN 口 IP 地址变化或系统启动时自动发送通知。