在脚本和控制台中发送电子邮件

2024-10-21, 星期一, 19:13

System Administration

用 Bash 脚本在 Git 服务器上简单实现了一个 Git Commit Tracker,定期将追踪的指标整理成 CSV 报表。不过要获取这份报表,还需通过 RDP 访问主机,接入 VPN,登录网页堡垒机,唤起 WinSCP,把这份文件下载下来。

如果能通过邮件自动发送到工作邮箱就好了。

这种事情一般用 sendmailmailx 完成。我的测试机安装了 AlmaLinux 9.4,提供了一个功能丰富的 mailx 实现 —— s-nail

sudo dnf install s-nail -y

不用理会 /etc/mail.rc 下的全局配置,在 $HOME/.mailrc 中添加公司企业邮箱的 SMTP 配置和机器人账号(其实就是专门创建的用于发送公共邮件的电子邮箱账号)。之前在企业邮箱的帮助文档中查询过配置参数,这里大部分照填即可,仅需注意:

  • 连接地址中的协议为 smtps://(可以理解成 SMTP over TLS),如果 SMTP 服务器使用 587 端口,则可能是使用了 STARTTLS,配置会有一些差别
  • 电子邮件服务提供商应该会分配专门的客户端密码,和 HTTP Basic Auth 一样,用户名和密码需要进行 URI 编码
set v15-compat
set mta=smtps://<encodeURIComponent(USERNAME)>:<encodeURIComponent(PASSWORD)>@smtp.exmail.qq.com:465
set smtp-auth=login
set from=<ACCOUNT_TO_SEND_EMAIL>

如果目标机器的 s-nail 版本较旧,也可以写成如下格式(在 Ubuntu 18.04 LTS 上进行了测试):

set smtp=smtps://smtp.exmail.qq.com:465
set from=<ACCOUNT_TO_SEND_EMAIL>
set smtp-auth-user=<USERNAME>
set smtp-auth-password=<PASSWORD>
set smtp-auth=login

AlmaLinux 9(RHEL 9)上的 mailx 指向 s-nail,以如下命令发送邮件:

echo 'Message body' | mailx --subject='Send from my server' yufanonsoftware@ddrpa.cc

# 当然,也许你会想通过 dry-run 模式调试一下
echo 'Message body' | mailx --debug --subject='Send from my server' yufanonsoftware@ddrpa.cc

在安装多个邮件客户端的系统上直接使用 s-nail

echo 'Message body' | s-nail -s 'Send from my server' yufanonsoftware@ddrpa.cc

要将文本文件作为邮件附件,使用 -a(ttachment) 参数:

echo 'Report generated.' | s-nail -s 'Git Commit Tracker' -a '/opt/gct/report-latest.csv' yufanonsoftware@ddrpa.cc

将这些命令提交到 Cron(可以写 Service Unit 和 Timer Unit 的,但是我懒)。