[linux]邮箱通知自己,when sh脚本运行

使用自己的邮箱给自己的邮箱。 当天主播直播了(几点),要通知,上传了文件,要通知,没直播要通知,结束直播要通知,如果遇到问题,例如cookie过期,也要通知,其他问题,也通知

 

这个需求非常棒,它能把你的服务器变成一个“会说话”的管家。要实现这个功能,我们需要做两件事:

  1. 在服务器上配置发信环境(这里推荐使用 msmtp,它轻量且稳定)。

  2. 升级脚本逻辑,在关键节点插入“发信”指令。


第一步:安装并发信授权

在服务器上安装 msmtp

Bash
 
apt update && apt install msmtp msmtp-mta -y

接着,你需要获取你邮箱的“授权码”(不是登录密码)。以 QQ 邮箱或网易邮箱为例,在设置里开启 SMTP 即可获得一串 16 位的字母。

创建配置文件:

Bash
 
cat << 'EOF' > ~/.msmtprc
 
defaults
auth           on
tls            on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
logfile        ~/.msmtp.log

account        default
host           smtp.qq.com
port           465
from           你的邮箱@qq.com
user           你的邮箱@qq.com
password       你的授权码
tls_starttls   off


EOF

保存退出并设置 600 权限(必须设置,否则报错):

Bash
chmod 600 ~/.msmtprc

第二步:升级脚本(加入通知逻辑)

我们要重新写一下 upload_baidu.sh。这个版本会识别“正在录制”、“转换成功”、“上传成功”以及“异常错误”。

执行 cat 命令覆盖原脚本:

Bash
 
cat << 'EOF' > /root/DouyinLiveRecorder/upload_baidu.sh
#!/bin/bash

# --- 配置区 ---
MY_EMAIL="你的邮箱@qq.com"
DOWNLOAD_DIR="/root/DouyinLiveRecorder/downloads"
LOG_FILE="/root/DouyinLiveRecorder/upload.log"

# --- 发信函数 ---
send_mail() {
    local subject="$1"
    local body="$2"
    echo -e "Subject: ${subject}\n\n${body}" | msmtp "${MY_EMAIL}"
}

# 1. 防重运行锁
if pidof -x $(basename "$0") -o %PPID >/dev/null; then
    exit 1
fi

cd "$DOWNLOAD_DIR" || exit 1
echo "--- 任务开始: $(date) ---"

# --- 检查直播状态 & Cookie 是否过期 ---
# 检查 Docker 日志里是否有 Cookie 过期关键字
if docker logs --since 1h douyinliverecorder-app-1 2>&1 | grep -q "Cookie已失效"; then
    send_mail "🚨 警告:抖音 Cookie 已过期" "服务器检测到录制器 Cookie 失效,请及时更新 URL_config.ini 或 config.ini 中的 Cookie。"
fi

# --- 逻辑处理 ---
HAS_ACTIVE_LIVE=false
PROCESSED_FILES=""

# 查找所有 .ts 文件
find . -type f -name "*.ts" | while read -r ts_file; do
    if lsof "$ts_file" > /dev/null 2>&1; then
        # 发现正在写入的文件,说明正在直播
        anchor_name=$(basename $(dirname "$ts_file"))
        if [ "$HAS_ACTIVE_LIVE" = false ]; then
            send_mail "🎙️ 主播正在直播中" "检测到主播 [${anchor_name}] 正在直播,服务器已开始抓取并分段..."
            HAS_ACTIVE_LIVE=true
        fi
        continue
    fi

    # 逻辑转换
    dir_name=$(dirname "$ts_file")
    base_name=$(basename "$ts_file" .ts)
    convert_dir="$dir_name/converted"
    mkdir -p "$convert_dir"
    mp3_file="$convert_dir/${base_name}.mp3"

    ffmpeg -i "$ts_file" -vn -acodec libmp3lame -q:a 2 "$mp3_file" -y -loglevel error
    
    if [ $? -eq 0 ]; then
        rm -f "$ts_file"
        PROCESSED_FILES="${PROCESSED_FILES}\n- ${base_name}.mp3"
    fi
done

# --- 上传与最终通知 ---
BYPY_PATH=$(which bypy)
SYNC_OUT=$($BYPY_PATH --retry 5 --timeout 120 -s 500M syncup . /live_audio --on-dup overwrite 2>&1)

if [[ $SYNC_OUT == *"OK"* ]]; then
    if [ ! -z "$PROCESSED_FILES" ]; then
        send_mail "✅ 文件上传成功通知" "以下文件已成功转码并上传至百度网盘:${PROCESSED_FILES}"
    fi
elif [[ $SYNC_OUT == *"Error"* ]]; then
    send_mail "❌ 上传过程遇到异常" "bypy 同步时出错,请查看日志文件 upload.log。错误摘要:\n${SYNC_OUT}"
fi

# 清理空文件夹
find . -type d -empty -delete 2>/dev/null
echo "--- 任务结束: $(date) ---"
EOF

chmod +x /root/DouyinLiveRecorder/upload_baidu.sh

这样修改后的效果:

  1. Cookie 过期:脚本每半小时扫一次 Docker 日志,发现“失效”立刻给你发邮件。

  2. 正在直播:一旦发现有 .ts 文件被占用,邮件通知你“某某主播正在直播,正在抓取”。

  3. 上传完成:只有当有新的 MP3 成功传到网盘后,才会发一封统计邮件,告诉你“某某文件已到账”。

  4. 异常保护:如果网盘上传报错(非 31023 那种小错,而是真正的失败),会把错误片段发给你。

下一步操作:

  1. 请先按照第一步配置好你的 ~/.msmtprc 并填入邮箱和授权码。

  2. 测试发信是否成功:echo "test" | msmtp 你的邮箱@qq.com

  3. 成功收到测试信后,再执行上面的 cat 命令。

你要不要先配置一下 .msmtprc 试试能不能收到测试邮件?

posted @ 2026-03-15 22:13  mememem  阅读(0)  评论(1)    收藏  举报