在 Linux 环境中,邮件的使用场景非常广泛,涉及到系统管理、监控报警、批量邮件、用户通知、错误报告等多种场景。通过灵活配置邮件传输代理(如 Postfix)、邮件客户端(如 S-nail)以及脚本工具,管理员和开发者可以实现高效的邮件通信和通知功能,确保系统的可靠运行和用户的实时沟通。

本篇主要介绍如何配置邮件客户端(以s-nail为例)

安装第三方邮件客户端(s-nail)

dnf install s-nail -y

S-nail的简单介绍

  • s-nailmailx 的增强版本之一。它在传统 mailx 的基础上加入了更多现代化的功能,使其更加适合复杂的电子邮件需求。
  • s-nail 的主要目的是增强 mailx 的功能,以支持现代电子邮件技术,如 IMAP、SMTP 身份验证、SSL/TLS 加密等。

重要的特性差异

  • IMAP 支持:传统的 mailx 主要处理本地邮件,而 s-nail 提供了对 IMAP 协议的支持,可以远程管理邮件。
  • SMTP 身份验证s-nail 支持直接通过 SMTP 服务器发送邮件,而不依赖本地 MTA。这对于需要通过外部邮件服务器(如 Gmail、Outlook)发送邮件的场景非常有用。
  • 加密支持s-nail 支持 SSL/TLS 连接,确保与邮件服务器之间的通信是加密的,传统的 mailx 在这方面支持有限。

配置邮件服务

配置文件 (以QQ邮箱为例)

vim /etc/s-nail.rc
#在该文件的末尾添加以下内容set from=xxxxxxxx@qq.com #指定邮件的发件人地址set smtp=smtps://smtp.qq.com:465 #设置 SMTP 服务器的地址和端口,根据情况选择正确的端口set smtp-auth-user=xxxxxxxx@qq.com #用于通过 QQ 邮箱的 SMTP 服务器发送邮件时进行身份验证set smtp-auth-password=XXXXXXXXXXXX #SMTP 认证的密码,注意这是QQ邮箱的授权码,而不是登陆密码,下文介绍如何获取QQ授权码set smtp-auth=login #指定 SMTP 的认证方式#以下内容时情况使用,部分邮箱(如163)不需要使用证书认证set ssl-verify=ignore #忽略 SSL/TLS 证书验证(不推荐长时间使用)set nss-config-dir=/root/.certs #指定 NSS(Network Security Services)证书数据库的路径

获取QQ邮箱授权码

在qq客户端程序(如浏览器中进入邮箱登录QQ邮箱->设置->账户)中通过设置开启imap/smtp服务,提供第三方程序账号的授权码

在这里插入图片描述

获取QQ服务器证书

使用 OpenSSL 获取 QQ 邮箱服务器的证书

安装OpenSSL

dnf install openssl

连接到 QQ 邮箱的 SMTP 服务器并下载证书

openssl s_client -connect smtp.qq.com:465 (可选-showcerts)#通常操作系统已经内置了根证书的信任库

保存证书

运行上述命令后,你会看到一段证书内容输出,类似于以下内容:

-----BEGIN CERTIFICATE-----
MII...
...
-----END CERTIFICATE-----

将从 -----BEGIN CERTIFICATE----------END CERTIFICATE----- 之间的部分复制并保存到一个文件中,(带上-showcerts后会返回完整的证书链,涉及到 SSL/TLS 通信的安全性依赖于分层的信任模型,本篇不做解释)通常操作系统已经内置了根证书的信任库,因此大多数情况只要保存第一段即可,或者不添加-showcerts

mkdir -p /root/.certs/
vim ~/.certs/qq_mail_cert.crt #将上述证书主体保存至文件中,如遇无法写入,请先确保所写路径的目录存在

验证证书

openssl x509 -in qq_mail_cert.crt -text -noout#如果保存正常,将会输出类似如下信息:Certificate:    Data:        Version: 3 (0x2)        Serial Number:
            08:73:88:0b:a8:11:ee:72:45:26:ab:43:91:16:f8:d3        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = US, O = DigiCert Inc, CN = DigiCert Secure Site CN CA G3
        Validity            Not Before: Jul  2 00:00:00 2024 GMT
            Not After : Jul  2 23:59:59 2025 GMT
        Subject: C = CN, ST = Guangdong Province, L = Shenzhen, O = Shenzhen Tencent Computer Systems Company Limited, CN = *.mail.qq.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)                Modulus:··· ···

配置s-nail使用获取到的证书

#创建一个专门的目录来存放证书,如 /root/.certs (根据系统的实际情况调整路径)mkdir -p /root/.certs
#将存放证书的文件移动到 /root/.certs 目录中mv qq_mail_cert.crt /root/.certs/

让我们回到配置文件的步骤,更新NSS路径

set nss-config-dir=/root/.certs #指定 NSS(Network Security Services)证书数据库的路径

测试发送

echo '邮件内容' | mail -s '邮件主题' xxxxxxxx@qq.com(收件人地址)

自动化获取证书命令

mkdir -p /root/.certs/
echo -n | openssl s_client -connect smtp.qq.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/.certs/qq_mail_cert.crt #获取证书并自动保存至~/.certs/qq_mail_cert.crt

certutil 证书管理工具的简单介绍

上文我们只讲了如何获取证书并保存为 .crt 文件,之后直接让 s-nail 或其他客户端使用这些证书路径,未涉及证书的进一步管理。

接下来我将简单介绍 certutil 工具:用于管理 NSS 证书库(处理 SSL/TLS 证书和加密操作),使用certutil将证书导入 NSS 证书库,应用程序(如 s-nail 或其他基于 NSS 的程序)可以在调用 NSS 库时自动使用这些证书进行加密通信,而不必直接指定 crt 文件的路径。从而够简化多个应用程序对这些证书的使用,增强管理灵活性。

#导入证书到 NSS 证书库:
certutil -A -n "GeoTrust SSL CA" -t "C,," -d ~/.certs -i ~/.certs/qq_mail_cert.crt
certutil -A -n "GeoTrust Global CA" -t "C,," -d ~/.certs -i ~/.certs/qq_mail_cert.crt
#这两条命令将 GeoTrust SSL CA 和 GeoTrust Global CA 证书导入 NSS 证书库中,并为其设置信任级别("C,," 表示用于 SSL 客户端认证)。-d 选项指定证书库的路径,-i 选项指定导入的证书文件。

#查看 NSS 证书库中的证书:
certutil -L -d /root/.certs #列出 /root/.certs 目录下 NSS 证书库中的所有证书。

#进一步导入特定的证书:
certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d ./ -i qq_mail_cert.crt
#这行命令将 GeoTrust SSL CA - G3 证书导入 NSS 证书库,并设置信任级别为 Pu,Pu,Pu(表示对 SSL 客户端和服务器均完全信任)。