我正在使用 Raspbian,并且 Postfix(版本 2.9.6)服务似乎在我启动时自动运行,但如果我想发送邮件,电子邮件就会停留在队列中:
$ mailq
26CB72201F 443 Sat Sep 19 19:44:17 [email protected]
(Host or domain name not found. Name service error for name=smtp.gmail.com type=A: Host not found, try again)
[email protected]
如果我重新启动服务(sudo service postfix restart
),那么电子邮件将一直有效,直到下次启动。
为什么?有什么区别?
在 Postfix 安装期间,我选择了“带有智能主机的 Internet”配置,但随后我按照“...Internet 站点”教程完成了配置,所以这可能是问题所在(?)我只想发送电子邮件。
更新:问题可能是在连接 Wi-Fi 之前运行了 Postfix。
答案1
简短的回答。
如果出现“主机未找到,请重试。”,则可能意味着您的服务器存在 DNS 解析问题,或者 Postfix 本身存在 DNS 解析问题。但这正是需要清理的核心。
至于如何解决,您的问题没有提供足够的有关您的基本操作系统或设置的详细信息,因此无法给出简洁的答案。如果您正在运行,则您似乎正在运行 Ubuntu/Debian sudo service postfix restart
,但您还能提供哪些其他详细信息?
较长的答案。
resolv.conf
可能与神秘失踪有关。
根据错误:
未找到主机或域名。name=smtp.gmail.com 的名称服务错误类型=A:未找到主机,请重试。
看起来你正在使用 Gmail 的 SMTP 服务器来发送邮件。不确定你的操作系统是什么,但基于Ubuntu 论坛上的这个答案resolv.conf
这似乎是重启时缺失的问题;粗体强调是我的:
我在 Ubuntu 14.04 LTS 上遇到了同样的问题。安装 postfix 后,它会复制
/etc/resolv.conf
到/var/spool/postfix/etc/resolve.conf
。但由于某种原因,在重新启动后,文件不会被复制,你得到的是只有标题的空白文件。
建议的临时解决方案是将主操作系统复制resolv.conf
到 Postfix 的目录:
sudo cp /etc/resolv.conf /var/spool/postfix/etc/resolv.conf
看起来这不是一个永久性的解决办法但至少值得检查一下。
可能与设置有关inet_protocols
。
还Server Fault 上的这个答案解释了一个类似的情况,重点是 IPv6 支持。很确定您的问题与 IPv6 无关,因为错误与 IPv4 的“type=A”记录有关,而对于 IPv6,它将是“type=AAAA”。但话虽如此,可能值得尝试调整inet_protocols
Postfix 配置文件中的设置。以下是 Postfix 官方文档的解释:
当通过 inet_protocols 参数启用 IPv4 支持时,Postfix 将查找 DNS 类型 A 记录,并将 IPv4-in-IPv6 客户端 IP 地址 (::ffff:1.2.3.4) 转换为其原始 IPv4 形式 (1.2.3.4)。后者在 IPV6_V6ONLY 支持 (RFC 3493) 之前的主机上是必需的。
当通过 inet_protocols 参数启用 IPv6 支持时,Postfix 将执行 DNS 类型 AAAA 记录查找。
当同时启用 IPv4 和 IPv6 支持时,Postfix SMTP 客户端将选择 smtp_address_preference 参数指定的协议。2.8 之前的 Postfix 版本会先尝试通过 IPv6 进行连接,然后再尝试使用 IPv4。
例子:
- inet_protocols = ipv4
- inet_protocols = all (默认)
- inet_protocols = ipv6
- inet_protocols = ipv4, ipv6
假设您使用的是 Ubuntu/Debian 设置,请在此处打开配置:
sudo nano /etc/postfix/main.cf
并查找或设置该行的值inet_protocols
:
inet_protocols = ipv4
或者是这样的:
inet_protocols = all
然后重新启动 Postfix 服务(或整个服务器),看看是否可以解决问题:
sudo service postfix restart
答案2
问题在于 Postfix/etc/resolv.conf
在连接 WiFi 前会进行检查,因此/var/spool/etc/postfix/resolv.conf
启动后一直为空,无法发送邮件。
为了解决这个问题,我禁用了 postfix 服务:
sudo update-rc.d postfix disable
…我编写了这个脚本来等待 Wi-Fi 连接结束后再启动 Postfix(保存在/usr/local/bin/postfix_wifi.sh
):
#!/usr/bin/sh
host="smtp.gmail.com"
port=587
until nc $host $port -w 5
do
sleep 10
done
sudo service postfix start
exit 0
...我添加了此行/etc/rc.local
以便脚本在启动时运行:
/usr/local/bin/postfix_wifi.sh &
答案3
对我来说这是 AWS SES 的错误:
未找到主机或域名。name=email-smtp.us-west-2.amazonaws.com 的名称服务错误,类型=AAAA:未找到主机,请重试
我可以通过在安装 postfix 后立即告诉 Postfix 使用 Google DNS 来解决此问题:
echo 'nameserver 8.8.8.8' >> /var/spool/postfix/etc/resolv.conf