我在 Docker 19.03.5 中的 Debian 10 (buster) 上运行 Postfix 3.4.8。Postfix 配置为智能主机。它将电子邮件转发到我们 ISP 的 SMTP 服务器。
如果我relayhost
使用以下设置进行配置域名就我的情况而言,SMTP 服务器的[mail.level27.be]:587
发送邮件时会出现以下错误:
Host or domain name not found. Name service error for name=mail.level27.be type=A: Host not found, try again
如果我relayhost
使用以下设置进行配置知识产权SMTP 服务器,就我而言[185.3.216.85]:587
,它有效!
我猜这是一个 DNS 问题。我怎样才能让它使用域名而不是 IP 来工作?
使用以下命令构建 Docker 映像:
docker build --pull -t mypostfix .
以下是 Dockerfile:
FROM debian:10
EXPOSE 25
RUN apt-get update
RUN apt-get -y install libsasl2-modules postfix
RUN postconf -X 'mynetworks' \
&& postconf -e 'mynetworks_style = subnet' \
&& postconf -X 'mydestination' \
&& postconf -e 'remote_header_rewrite_domain =' \
&& postconf -e 'inet_protocols = ipv4' \
&& postconf -e 'relayhost = [mail.level27.be]:587' \
&& postconf -e 'smtp_use_tls = yes' \
&& postconf -e 'smtp_sasl_auth_enable = yes' \
&& postconf -e 'smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd' \
&& postconf -e 'smtp_sasl_security_options = noanonymous' \
&& postconf -e 'maillog_file = /dev/stdout' \
&& echo "mail.level27.be username:password" > /etc/postfix/sasl_passwd \
&& chown root:root /etc/postfix/sasl_passwd \
&& chmod 600 /etc/postfix/sasl_passwd \
&& postmap /etc/postfix/sasl_passwd
CMD postfix start-fg
Docker 容器通过以下命令启动:
docker run --rm -d -p 25:25 mypostfix
使用以下命令在 Docker 主机上发送电子邮件curl
:
echo "This is some mail content." > /tmp/email.txt
curl --url 'smtp://localhost:25' --mail-from '[email protected]' --mail-rcpt '[email protected]' --upload-file /tmp/email.txt
postqueue -p
在容器中运行可以看到错误:
root@mypostfix:/# postqueue -p
-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
DBB26A05886 256 Wed Feb 19 14:45:42 [email protected]
(Host or domain name not found. Name service error for name=mail.level27.be type=A: Host not found, try again)
[email protected]
-- 0 Kbytes in 1 Request.
答案1
Postfix 运行多个带有 到chroot
的进程/var/spool/postfix
。这意味着系统文件(如/etc/resolv.conf
DNS 解析)应该位于/var/spool/postfix/etc/resolv.conf
。
为了使其正常工作,我必须在启动期间将此文件复制到正确的位置:
CMD cp /etc/resolv.conf /var/spool/postfix/etc/resolv.conf && postfix start-fg
警告:不要在构建期间复制它,因为您最终可能会得到resolv.conf
构建服务器而不是resolv.conf
生产服务器。
答案2
看起来您在容器内解析 DNS 时遇到了问题。好博客文章,其中描述了您的问题,请查看。