Linux开机启动发送ipv4内容邮件给指定的邮箱

目录

前言

开启接收邮件邮箱的SMPT

反手贴出代码

设置开机自启动

1.首先,来到这个路径下/etc/systemd/system

2.然后创建一个任务automail.service

3.任务内容,即automail.service文件的内容

4.设置开机自启

重新加载服务配置

启动服务

启动开机自启

重启服务

关闭服务

检测服务状态

​编辑 查看日志

查看配置

注意

前言

Linux开机获得本机ip地址,发送给指定邮箱。一般是为了在一些不方便且没有显示屏连接,采用ssh连接的情况。刚刚好,我也遇到了这种问题,所以这篇文章来了。我们需要干什么去实现它呢?我来告诉你!

下面是本文使用的材料:

  1. 一块或者一台linux系统的板子或者电脑
  2. 一个发送邮件的账号(这里我选择的网易邮箱,要开启SMPT)
  3. 一个接收邮件的邮箱(这里我选择的qq邮箱)
  4. 我提供的shell脚本

开启接收邮件邮箱的SMPT

网易邮箱的SMPT很容易开,进去设置一些就好了。也就一开始接一下手机验证码。

来到网易邮箱,然后注册或者登陆。163网易免费邮-你的专业电子邮局

开启的过程,你会得到一个授权码。这个授权码只会显示一次,你务必记住或者忘记,你下次重开算了。 

反手贴出代码

你唯一需要改的地方就是下面三个地方。

#!/bin/bash
# File: automail.sh

###############################
########### 配置区 ############
###############################

SMTP_HOST="smtp.163.com"
SMTP_PORT="465"
SENDER_EMAIL="你的发送邮箱@163.com"
SENDER_PASSWORD="发送邮箱的授权码"
RECIPIENT_EMAIL="接收邮箱@qq.com"

IPV4_API=("http://ip.3322.net" "http://4.ipw.cn")
IPV6_API=("http://6.ipw.cn" "http://v6.ip.zxinc.org")
CURL_TIMEOUT=3
NETWORK_RETRY=5

###############################
####### 系统初始化模块 ##########
###############################

init_system() {
    echo "[系统初始化] 正在配置环境..."

    # 时间同步
    if ! sudo ntpdate -u ntp.aliyun.com 2>/dev/null; then
        command -v apt &>/dev/null && sudo apt install -y ntpdate
        command -v yum &>/dev/null && sudo yum install -y ntpdate
        sudo ntpdate -u ntp.aliyun.com
    fi

    # 安装依赖
    local deps=("curl" "msmtp" "msmtp-mta" "mailutils" "mutt" "gnutls" "gnutls-utils" "libidn" "libidn-devel" "ncurses-devel" "gcc" "gcc-c++")
    for dep in "${deps[@]}"; do
        if ! command -v "$dep" &>/dev/null; then
            command -v apt &>/dev/null && sudo apt install -y "$dep"
            command -v yum &>/dev/null && sudo yum install -y "$dep"
        fi
    done

    # 生成MSMTP配置
    cat > ~/.msmtprc << EOF
defaults
auth            on
tls             on
logfile         ~/.msmtp.log

account         auto_config
host            ${SMTP_HOST}
port            ${SMTP_PORT}
from            ${SENDER_EMAIL}
user            ${SENDER_EMAIL}
password        ${SENDER_PASSWORD}
tls_starttls    off

account default : auto_config
EOF
    chmod 600 ~/.msmtprc
}

###############################
####### 网络检测模块 ###########
###############################

get_network_info() {
    # 连接类型
    local conn_type="有线连接 (Wired)"
    local ssid=$(iwgetid -r 2>/dev/null)
    [ -n "$ssid" ] && conn_type="WiFi (${ssid})"

    # IPv4检测
    local ipv4_internal=$(ip -4 -o addr show scope global | awk '{print $4}' | cut -d/ -f1 | head -1)
    local ipv4_external=$(curl -4 -s --connect-timeout $CURL_TIMEOUT ${IPV4_API[0]})

    # IPv6检测
    local ipv6_info=""
    if ip -6 addr show scope global &>/dev/null; then
        local ipv6_internal=$(ip -6 addr show scope global | awk '/inet6/{print $2}' | cut -d/ -f1 | head -1)
        local ipv6_external=$(curl -6 -s --connect-timeout $CURL_TIMEOUT ${IPV6_API[0]})
        ipv6_info="内网IPv6: ${ipv6_internal:-未检测到}\n外网IPv6: ${ipv6_external:-未检测到}"
    else
        ipv6_info="IPv6状态: 未启用"
    fi

    # 组装信息
    echo -e "=== 网络检测开始 ==="
    echo -e "连接类型: ${conn_type}"
    echo -e "内网IPv4: ${ipv4_internal:-未检测到}"
    echo -e "外网IPv4: ${ipv4_external:-未检测到}"
    echo -e "${ipv6_info}"
    echo -e "=== 网络检测结束 ==="
}

wait_network() {
    echo "等待网络连接..."
    for ((i=1; i<=$NETWORK_RETRY; i++)); do
        ping -c1 -W2 223.5.5.5 &>/dev/null && return 0
        sleep 2
    done
    echo "警告:网络连接超时"
    return 0
}

###############################
######## 邮件发送模块 ##########
###############################

send_mail() {
    # 获取网络信息
    local ipv4_internal=$(ip -4 -o addr show scope global | awk '{print $4}' | cut -d/ -f1 | head -1)
    local ipv4_external=$(curl -4 -s --connect-timeout $CURL_TIMEOUT ${IPV4_API[0]})
    
    # IPv6检测
    local ipv6_internal=$(ip -6 addr show scope global 2>/dev/null | awk '/inet6/{print $2}' | cut -d/ -f1 | head -1)
    local ipv6_external=$(curl -6 -s --connect-timeout $CURL_TIMEOUT ${IPV6_API[0]} 2>/dev/null)
    
    # 连接类型处理
    local ssid=$(iwgetid -r 2>/dev/null)
    if [ -n "$ssid" ]; then
        en_conn_type="WiFi (${ssid})"
        zh_conn_type="WiFi (${ssid})"
    else
        en_conn_type="Wired"
        zh_conn_type="有线连接"
    fi

    # 构建邮件内容
    local en_content="System Boot Notification\n$(date +"%Y-%m-%d %H:%M:%S %Z")\nHostname: $(hostname)\nConnection Type: ${en_conn_type}\nInternal IPv4: ${ipv4_internal:-Not detected}\nExternal IPv4: ${ipv4_external:-Not detected}\nInternal IPv6: ${ipv6_internal:-Not detected}\nExternal IPv6: ${ipv6_external:-Not detected}"
    
    local zh_content="系统启动通知\n$(date +"%Y-%m-%d %H:%M:%S %Z")\n主机名称: $(hostname)\n连接类型: ${zh_conn_type}\n内网IPv4: ${ipv4_internal:-未检测到}\n外网IPv4: ${ipv4_external:-未检测到}\n内网IPv6: ${ipv6_internal:-未检测到}\n外网IPv6: ${ipv6_external:-未检测到}"
    
    local full_content="To: ${RECIPIENT_EMAIL}\nSubject: 【$(hostname) Boot Alert】系统启动通知\n\n${en_content}\n\n----------------\n\n${zh_content}"

    echo -e "=== 正在发送邮件 ==="
    echo -e "$full_content" | msmtp --from="${SENDER_EMAIL}" "${RECIPIENT_EMAIL}"
    echo -e "=== 发送邮件成功 ==="
}

###############################
######## 主执行流程 ###########
###############################

[ -f ~/.msmtprc ] || init_system
wait_network
get_network_info
send_mail

设置开机自启动

这个脚本的作用就是发邮件,邮件内容就是运行机器联网时的ipv4地址,内网地址与外网地址都会发送。运行一次,发一次。但是我们要实现的是开机自动发邮件,所以我们要设置开机只后,自动执行一次这个脚本。

我假设你把shell脚本的名字设置为automail.sh.下面操作我都会以这个标准命名。

我们要设置开机自动运行这个脚本,这样就可以做到开机自动发送邮件的作用。

1.首先,来到这个路径下/etc/systemd/system

cd /etc/systemd/system/

2.然后创建一个任务automail.service

vim automail.service

或者直接

sudo nano /etc/systemd/system/automail.service

sudo vim /etc/systemd/system/automail.service

3.任务内容,即automail.service文件的内容

[Unit]
Description=Automail Service - Send network info on boot
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=orangepi
ExecStart=/home/orangepi/automail/automail.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target

        注意

        这里的ExecStart里面的内容是你脚本文件放在linux系统中的绝对路径。比如,这里我就是把文件放在/home/orangepi/automail/automail.sh

        还有User这里的内容是linux的真实用户名,比如我这里就是orangepi。你要是喜欢,你也可以填root。

你需要根据你的情况进行修改,对了。你最好自己给文件加上可执行权限,不然可能会设置失败。

chmod +x /home/orangepi/automail.sh

4.设置开机自启

重新加载服务配置
sudo systemctl daemon-reload
启动服务
sudo systemctl start automail.service
启动开机自启
sudo systemctl enable automail.service
重启服务
sudo systemctl restart automail.service
关闭服务
sudo systemctl stop automail.service
检测服务状态
sudo systemctl status automail.service

如果提示如下,则设置成功! 

 查看日志

下面都可以查看

sudo journalctl -u automail.service -b
sudo journalctl -u automail.service -b --no-pager
sudo journalctl -u automail.service -f
cat ~/.msmtp.log
tail -f ~/.msmtp.log
查看配置
cat ~/.msmtprc

注意

这里脚本其实利用了下面的环境才实现的,不过脚本会在一开始去检测机器有没有安装这些环境。如果没有则去安装,如果有就跳过安装!

sudo apt update
sudo apt install msmtp mailutils msmtp-mta curl

好了!愉快的去部署吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值