后缀错误:找不到主机或域名

cle*_*toy 6 email services postfix

我正在使用 Raspbian,并且 Postfix(版本 2.9.6)服务在我启动时似乎会自动运行,但是如果我想发送邮件,电子邮件会保留在队列中:

$ mailq
26CB72201F    443 Sat Sep 19 19:44:17   user@mail.example.com
(Host or domain name not found. Name service error for name=smtp.gmail.com type=A: Host not found, try again)
                                        someone@gmail.com
Run Code Online (Sandbox Code Playgroud)

如果我重新启动服务 ( sudo service postfix restart),则电子邮件会一直工作到下次启动。

为什么?有什么不同?

在 Postfix 安装过程中,我选择了配置“Internet with smarthost”,但随后我按照…Internet Site 的教程完成了配置,所以这可能是问题(?)我只想发送电子邮件。

更新:问题可能是在连接 Wi-Fi 之前运行 Postfix。

Gia*_*968 16

简短的回答。

出现“找不到主机,请重试”。这可能意味着您的服务器存在 DNS 解析问题,或者 Postfix 本身存在 DNS 解析问题。但这是必须清理的核心。

至于如何清除它,您的问题没有提供有关基本操作系统或设置的足够详细信息,无法给出简洁的答案。如果您正在运行sudo service postfix restart,您似乎正在运行 Ubuntu/Debian ,但您还能提供哪些其他详细信息?

更长的答案。

可能与resolv.conf神秘消失有关。

基于错误:

找不到主机或域名。name=smtp.gmail.com type=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
Run Code Online (Sandbox Code Playgroud)

这似乎不是永久性修复,但至少它值得一试。

可能与inet_protocols设置有关。

这个关于服务器故障的答案也解释了一个类似的情况,它侧重于 IPv6 支持。很确定您的问题与 IPv6 无关,因为错误是关于 IPv4 的“type=A”记录,而对于 IPv6,它将是“type=AAAA”。但这就是说,可能值得尝试调整inet_protocolsPostfix 配置文件中的设置。以下是 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 版本在尝试使用 IPv4 之前尝试通过 IPv6 进行连接。

例子:

  • inet_protocols = ipv4
  • inet_protocols = 全部(默认)
  • inet_protocols = ipv6
  • inet_protocols = ipv4, ipv6

假设您使用的是 Ubuntu/Debian 设置,请在此处打开配置:

sudo nano /etc/postfix/main.cf
Run Code Online (Sandbox Code Playgroud)

并找到(或将值)设置为该inet_protocols行:

inet_protocols = ipv4
Run Code Online (Sandbox Code Playgroud)

或者是这样的:

inet_protocols = all
Run Code Online (Sandbox Code Playgroud)

然后重新启动 Postfix 服务——或整个服务器——看看是否能解决问题:

sudo service postfix restart
Run Code Online (Sandbox Code Playgroud)


cle*_*toy 4

问题在于 Postfix/etc/resolv.conf在连接 WiFi 之前进行检查。因此,/var/spool/etc/postfix/resolv.conf开机后一直为空,无法发送邮件。

\n\n

为了解决这个问题,我禁用了 postfix 服务:

\n\n
sudo update-rc.d postfix disable\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe2\x80\xa6,我编写了这个脚本来等待 Wi-Fi 连接结束,然后再启动 Postfix(保存在 中/usr/local/bin/postfix_wifi.sh):

\n\n
#!/usr/bin/sh\n\nhost="smtp.gmail.com"\nport=587\n\nuntil nc $host $port -w 5\ndo\n    sleep 10\ndone\n\nsudo service postfix start\nexit 0\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe2\x80\xa6and 我添加了这一行,/etc/rc.local以便脚本在启动时运行:

\n\n
/usr/local/bin/postfix_wifi.sh &\n
Run Code Online (Sandbox Code Playgroud)\n