实验室新添加的服务器需要一个基本的邮件通知功能,也就是在某些事件发生时能够向外发送电子邮件进行通知。众所周知,配置电子邮件的基础设施通常会很麻烦。因此,我在寻找解决方案时有以下三点考虑:
- 服务器程序发送电子邮件的接口应该通用。因此,我优先考虑使用提供了兼容
/usr/sbin/sendmail
命令的软件。 - 避免额外注册邮箱账号的麻烦。因此我选择重复利用我已有的 GMail 账号。
- 考虑 GMail 的特有限制。由于使用 Google 主密码进行 SMTP 发信身份认证的操作已经被 GMail 认为不安全而禁用了,所以这次必须变相使用用户名和密码完成 SMTP 配置。Google 提供了一个名为
App passwords
的特别功能,能够根据需要创建一个起替代作用的纯文本密码。
我最后选择的解决方案是 msmtp
配合 msmtp-mta
以及 GMail SMTP + App Passwords
组合。整个过程基本是遵循Gmail with an App Password这篇英文博客文章来部署的。
本文的配置在2024年10月有效,但无法保证永远生效。请在进行配置之前先行验证方法的有效性。
基本流程
- 第零步:为自己的 Google 账号启用两步验证功能。
- 第一步:访问App passwords管理页面创建一个新的
App password
。完成整个步骤,得到的应当是16位固定长度的密码。 - 第二步:在服务器上安装
msmtp
和msmtp-mta
软件包。前者是核心组件,后者提供了sendmail
命令的兼容接口。 - 第三步:在服务器上按照正常方式配置 msmtp GMail SMTP 发信。用户名仍然使用 GMail 电子邮箱地址,密码部分直接填入16位
App password
即可。 - 第四步:测试发信。
msmtp
配置文件/etc/msmtprc
示例(Debian/Ubuntu 系统)
defaults auth on tls on tls_trust_file /etc/ssl/certs/ca-certificates.crt account gmail host smtp.gmail.com port 465 tls_starttls off from XXXXXX@gmail.com user XXXXXX@gmail.com password 1111222233334444 port 465 tls on tls_starttls off syslog LOG_MAIL account default: gmail
对于基于 Debian 和 Ubuntu 的服务器,在写入配置之后,考虑按照/usr/share/doc/msmtp/README.Debian
的建议执行下列命令以确保配置文件并非所有人可读:
chmod 0640 /etc/msmtprc chgrp msmtp /etc/msmtprc