在 linux 上,想要让 sendmail 使用外部 smtp 服务发送邮件,需要完成以下两件事情:
- 生成
authinfo 文件,用于存储登录外部 smtp 服务器的用户信息 - 配置
sendmail.mc 文件
1. 生成 authinfo 进入 /etc/mail 目录,创建 /etc/mail/authinfo 文件,并添加如下内容:
AuthInfo:smtp.domain.cn "U:USERNAME" "P:PASSWORD" "M:PLAIN"
创建 hash map 文件
$ makemap hash authinfo < authinfo
执行完上述命令后,可以看到在 /etc/mail 目录下生成了一个名为 authinfo.db 的二进制文件,后面会将其路径配置在 sendmail.mc 文件中。
2. 配置 sendmail.mc 文件 还是在 /etc/mail 目录下,打开 sendmail.mc 文件,进行如下修改:
2.1 取消下面这一行的注释,并配置你自己的外部 smtp 服务器地址: "dnl define(`SMART_HOST', `smtp.your.provider')dnl" 如下所示:
define(`SMART_HOST', `smtp.domain.cn')dnl
在上述配置行下面添加如下几行内容:
define(`RELAY_MAILER_ARGS', `TCP $h 587')dnl
define(`ESMTP_MAILER_ARGS', `TCP $h 587')dnl
FEATURE(`authinfo', `hash -o /etc/mail/authinfo.db')dnl
注意: 上面指定的 smtp 端口是 587 ,如果与实际情况不符,应进行更改,比如,改为 25 或其他。
2.2 取消下面这几行的注释:
define(`confAUTH_OPTIONS', `A p')dnl
TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
2.3 安装 sendmail-cf 工具,用于重新生成配置文件
$ yum install -y sendmail-cf
2.4 重新生成配置文件
$ /etc/mail/make
2.5 重启 sendmail 服务
$ systemctl restart sendmail
3 邮件发送示例
$ sendmail -f"user@domain.cn" -t
Subject: Hello
From: user@domain.cn
To: person@xxx.cn
This is a test.
.
上面指定了 -f 参数,我认为是有必要的,因为从 sendmail 的运行日志来看,如果不指定的话,可能会出现外部 smtp 服务器无响应的情况。
若在执行上述命令发送邮件时出现卡住的感觉,则需查看 sendmail 运行日志来确认问题,如下所示:
$ systemctl status sendmail
● sendmail.service - Sendmail Mail Transport Agent
Loaded: loaded (/usr/lib/systemd/system/sendmail.service; disabled; vendor preset: disabled)
Active: active (running) since Wed 2022-10-26 08:03:45 CST; 6s ago
Process: 16736 ExecStart=/usr/sbin/sendmail -bd $SENDMAIL_OPTS $SENDMAIL_OPTARG (code=exited, status=0/SUCCESS)
Process: 16731 ExecStartPre=/etc/mail/make aliases (code=exited, status=0/SUCCESS)
Process: 16728 ExecStartPre=/etc/mail/make (code=exited, status=0/SUCCESS)
Main PID: 16745 (sendmail)
Tasks: 1 (limit: 832684)
Memory: 8.8M
CGroup: /system.slice/sendmail.service
└─16745 sendmail: accepting connections
10月 26 08:02:45 CentOS-8 systemd[1]: Starting Sendmail Mail Transport Agent...
10月 26 08:02:45 CentOS-8 sendmail[16736]: My unqualified host name (CentOS-8) unknown; sleeping for retry
10月 26 08:03:45 CentOS-8 sendmail[16736]: unable to qualify my own domain name (CentOS-8) -- using short name
...
从上述日志中可以发现,sendmail 有报错信息,即:
10月 26 08:02:45 CentOS-8 sendmail[16736]: My unqualified host name (CentOS-8) unknown; sleeping for retry
10月 26 08:03:45 CentOS-8 sendmail[16736]: unable to qualify my own domain name (CentOS-8) -- using short name
该问题的解决方法是在 /etc/hosts 文件中加入主机名 'CentOS-8' 的解析配置项,即:
127.0.0.1 localhost.localdomain localhost CentOS-8
参考资料
- https://community.webcore.cloud/tutorials/how_to_configure_sendmail_to_use_an_smtp_relay/
- https://help.thorntech.com/docs/sftp-gateway-classic/routing-sendmail-through-external-smtp-relay/
|