跨域名邮件发送场景下Sendmail与主机名配置问题问询
先帮你梳理下当前的核心场景:你用外部邮件服务商mailservice.com发送邮件,公网DNS记录my.server.com指向你的服务器,发件地址是myserver@yetanotherdomain.com,目前发送邮件能成功但会延迟60秒,日志里显示本地立即接收,但smtp.mailservice.com一分钟后才返回发送成功,怀疑是主机名相关配置导致的,下面针对你的三个问题逐一解答:
一、/etc/hosts里127.0.0.1和127.0.1.1该怎么配置?
首先,127.0.0.1是标准的本地回环地址,应该只绑定localhost和你的**FQDN(完全限定域名)**也就是my.server.com,不需要加那个无TLD的随机主机名。而127.0.1.1通常用于绑定你的服务器的短主机名(不带域名的部分,比如对应FQDNmy.server.com的短主机名就是my)。
修正后的/etc/hosts应该类似这样:
127.0.0.1 localhost my.server.com 127.0.1.1 my
你当前的配置里把随机主机名和FQDN都绑到127.0.0.1,可能导致Sendmail在解析本地主机名时出现歧义,这很可能是邮件延迟的核心原因——Sendmail在尝试确认本地身份时,因为主机名解析混乱,花费了大量时间重试或等待。
二、/etc/hostname的内容应该是什么?有没有特定要求?如果用非FQDN的话,/etc/hosts能不能弥补?
/etc/hostname推荐设置为你的短主机名(比如my,对应FQDNmy.server.com),当然也可以直接设置为FQDNmy.server.com,两种方式都可行,但短主机名更简洁。
如果/etc/hostname用的是非FQDN,只要/etc/hosts里正确将短主机名映射到127.0.1.1,并且把FQDN映射到127.0.0.1(或服务器的公网IP),就可以弥补,系统依然能正确解析出完整的FQDN。不过要注意,Sendmail非常依赖正确的FQDN解析,所以无论/etc/hostname是什么,确保执行hostname -f命令能返回正确的my.server.com是关键。
你当前用的无TLD随机主机名,会导致hostname -f无法返回合法的FQDN,Sendmail在初始化或发送邮件时会因为找不到有效的本地域名而卡顿,这也是延迟的重要诱因之一。
三、/etc/mail/sendmail.mc里需要配置特殊主机吗?还是用use_cw_file就足够?
在你的场景下,use_cw_file是足够的,但前提是/etc/mail/local-host-names文件里要包含你的服务器的FQDNmy.server.com(这个文件用来定义哪些域名Sendmail会当作本地域名处理)。
另外,建议在sendmail.mc里明确设置发件人域名伪装,确保发件地址统一为myserver@yetanotherdomain.com,避免Sendmail因为发件人域名不匹配做额外校验,减少潜在延迟。添加如下配置:
MASQUERADE_AS(`yetanotherdomain.com')dnl FEATURE(`masquerade_envelope')dnl FEATURE(`masquerade_entire_domain')dnl
最后,修改完所有配置后,记得重启Sendmail服务,并且用sendmail -bt命令测试主机名解析是否正常——比如输入$=w查看Sendmail识别的本地主机名列表,确认my.server.com在列表里。
备注:内容来源于stack exchange,提问作者Kalsan

