Ubuntu 配置邮件发送功能(msmtp + mailutils)

:check_mark: 卸掉 ssmtp,改用 msmtp + mailutils,轻量、兼容性好又稳定。

:one: 安装邮件工具

清理旧组件:

sudo apt remove ssmtp -y
sudo apt purge mailutils -y
sudo rm -f /etc/mail.rc

安装 msmtp + mailutils:

sudo apt install msmtp msmtp-mta mailutils ca-certificates -y

手动设置 sendmail 路由到 msmtp:

sudo ln -sf /usr/bin/msmtp /etc/alternatives/mta
sudo ln -sf /etc/alternatives/mta /usr/sbin/sendmail

此步骤会安装 mail 命令与默认配置路径。


:two: 配置 msmtp(以 Gmail 为例)

编辑配置文件:

sudo nano /root/.msmtprc

配置示例:

defaults
auth           on
tls            on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
logfile        /root/.msmtp.log

account        gmail
host           smtp.gmail.com
port           587
from           admin@gmail.com
user           admin@gmail.com
password       你的16位应用专用密码(不是 Gmail 登录密码)

account default : gmail

权限设置:

chmod 600 /root/.msmtprc

日志文件:

touch /root/.msmtp.log
chmod 600 /root/.msmtp.log
chown root:root /root/.msmtp.log

:pushpin: 注意:

  • Gmail 不接受真实登录密码,请使用 应用专用密码
  • 路径:Google 账户 → 安全性 → 应用专用密码(例如 “Ubuntu Mail”)

:three: 使用方式 1:脚本直接调用

echo "邮件正文内容" | mail -s "邮件标题" 收件人邮箱

示例:

echo "Immich 备份失败,请检查服务状态。" \
  | mail -s "【Immich 告警】PostgreSQL 备份失败" admin@gmail.com

:four: 使用方式 2:发送多行正文(HereDoc)

mail -s "Immich 备份成功 ✅" admin@gmail.com <<EOF
Hi,

Immich PostgreSQL 已于 $(date "+%F %T") 备份成功。
文件保存在:/mnt/immich/sql-backup

-- 自动备份系统
EOF

:five: 使用方式 3:封装成通用发送脚本

创建脚本 /usr/local/bin/send_mail.sh

#!/bin/bash
# 用法:send_mail.sh "标题" "内容"

SUBJECT="$1"
BODY="$2"
TO="admin@gmail.com"

echo "$BODY" | mail -s "$SUBJECT" "$TO"

赋予执行权限:

chmod +x /usr/local/bin/send_mail.sh

调用方式:

send_mail.sh "Immich 异常告警" "数据库导出失败,请检查 PostgreSQL 容器状态!"

:six: 使用方式 4:发送带附件(可选)

uuencode /path/to/immich.sql immich.sql | mail -s "Immich 手动备份" admin@gmail.com

:seven: 实际脚本示例(结合备份逻辑)

#!/bin/bash

BACKUP_DIR="/mnt/immich/sql-backup"
FILENAME="immich_pg_backup_$(date +%F).sql"

if ! docker exec -t immich-db pg_dump -U postgres -d immich > "$BACKUP_DIR/$FILENAME"; then
  echo "Immich PostgreSQL 备份失败,时间:$(date)" \
    | mail -s "❌ Immich 备份失败告警" admin@gmail.com
  exit 1
else
  echo "Immich PostgreSQL 已成功备份于 $(date)" \
    | mail -s "✅ Immich 备份成功" admin@gmail.com
fi