Linux 默认使用 mail 命令发送邮件,如果不存在可以尝试安装 mailx 包,一般都会默认安装。但是直接使用 mail 发送邮件会默认发送到本地的/var/spool/mail/[user] 中,如果要发送到网络邮箱,则要另外进行配置。

我首先想到的是直接用服务器搭建邮件发送服务,但是云服务器厂家出于安全考虑,通常会默认屏蔽 25 端口,这是邮件服务的默认端口,如腾讯云在文档中明确声明禁止直接通过云服务器使用 SMTP 协议发送邮件,而如果要使用 465 端口实现 SSL 加密发送邮件需要使用到其他的软件和配置,如果只是需要实现在服务器发送邮件,则可以使用更简单的方案——找一个第三方的邮件发送服务来帮助我们发送邮件,如 QQ 邮箱、网易邮箱等。

通常邮件发送的服务是 SMTP,接收是IMAP或者 POP3,根据你选择的邮件厂商不同可能需要进行手动开启 SMTP 服务以及授权码配置,可以查看163邮箱的介绍


如果你的服务器中添加了 sendmail 或者其他发送邮件服务,需要先关闭:

service sendmail stop
systemctl disable sendmail

接下来配置mail使用第三方服务发送邮件,mail命令的配置文件为/etc/mail.rc,打开文件在最后一行添加:

set from=xxx@163.com(YourNickName)
set smtp="smtps://smtp.163.com:465"
set smtp-auth-user=xxx@163.com
set smtp-auth-password=xxx
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb
  1. form就是发送人邮箱,括号中是发送者的昵称
  2. smtp是邮件的发送地址,如果使用 465 端口需要加上 smtps:// ,如果这里不加端口号会默认发送到 25 端口,可能会导致发送失败
  3. smtp-auth-user 邮箱账号
  4. smtp-auth-password 邮箱密码,一般是授权码
  5. smtp-auth 验证方式默认
  6. ssl-verify 此处选择忽略证书警告
  7. nss-config-dir 证书所在的目录,这个是系统默认的证书

完成上面的配置后,可以使用下面的命令发送邮件:

echo "content" | mail -s "Title" xxx@xx.com

可能会发现Error in certificate: Peer's certificate issuer is not recognized.的警告,但是邮件发送其实已经成功了,这个警告代表服务器无法信任此 SSL 证书,如果需要关闭这个警告,需要获取到发送邮件地址的 SSL 证书,然后添加到受信任列表中。


使用下面的命令获取 SSL 证书并添加到受信任列表:

# 创建目录
mkdir -p /etc/.cert/163
# 获取证书
echo -n | openssl s_client -connect smtp.163.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /etc/.certs/163/163.crt
cd /etc/.cert/163
# 添加到受信任列表
certutil -A -n "GeoTrust SSL CA" -t "C,," -d . -i 163.crt
certutil -A -n "GeoTrust Global CA" -t "C,," -d . -i 163.crt
certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d . -i 163.crt

输出Notice: Trust flag u is set automatically if the private key is present. 表示已经完成,然后将/etc/mail.rc中的nss-config-dir 改为证书所在的目录,我在这里用的是/etc/.cert/163 。请注意此处证书所在目录和文件的权限,需要让非 root 用户可访问,否则会返回错误Error initializing NSS: Unknown error -8015

可以考虑使用命令chmod -R 755 /etc/.cert/163 修改证书目录的权限。

然后可以再次发送邮件测试,这时警告应该已经消失了。


Ref