在 linux
上,想要让 sendmail
使用外部 smtp
服务发送邮件,需要完成以下两件事情:
- 生成
authinfo
文件,用于存储登录外部smtp
服务器的用户信息 - 配置
sendmail.mc
文件
1. 生成 authinfo
1)进入 /etc/mail
目录,创建 /etc/mail/authinfo
文件,并添加如下内容:
AuthInfo:smtp.domain.cn "U:USERNAME" "P:PASSWORD" "M:PLAIN"
或者是:
AuthInfo:mail.domain.cn "U:USERNAME" "P:PASSWORD" "M:PLAIN"
下面有讲 smtp.domain.cn
和mail.domain.cn
区别。
2)创建 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(`SMART_HOST', `mail.domain.cn')dnl
到底是 smtp.domain.cn
,还是mail.domain.cn
,这个需要和你的邮件服务提供商进行确认。我之前遇到一个问题是,一开始配置为 smtp.domain.cn
,可以正常使用。但过了几个月之后,突然不可用了,发不出去邮件了,日志显示SMART_HOST
这个配置有问题,导致邮件发送失败,最后和邮件服务提供商确认,他们说应该是mail.domain.cn
,不知道为啥变了,但是改过来就好了,所以说最好还是确认一下。
在上述配置行下面添加如下几行内容:
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
参考资料