我正在尝试第一次配置 Postfix。我不需要邮箱,我只想要虚拟别名,转发[email protected] --> [email protected]
我的 Postfix 在 Digital Ocean 液滴上的 Docker 容器中运行。
我已经做到了:
$ postalias -q [email protected]
[email protected]
...从容器内部,即我的/etc/postfix/virtual
文件正在工作。
此外,从液滴上的容器外部:
telnet example.com 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 example.com ESMTP Postfix (Ubuntu)
但在我自己的电脑上:
$ telnet example.com 25
Trying <droplet IP>...
telnet: connect to address <droplet IP>: Operation timed out
telnet: Unable to connect to remote host
我认为这是由 Digital Ocean 推荐mynetworks
的配置设置(见下文)所导致的预期和正确的- 我不想托管“开放”SMTP 中继。
我有一个要example.com.
设置的 MX 记录,我可以ping example.com
很好地访问上面的网站。另外(从我的电脑):
$ host -t mx example.com
example.com mail is handled by 1 example.com.
所以看起来是对的。
但是,如果我发送一条测试消息[email protected]
没有通过,并且我在 Postfix 日志中也看不到任何内容……我不知道它在什么时候失败了。
我不确定问题出在我的 Postfix 配置中还是在路由到容器中。
容器暴露端口 25(仅)并通过 Fig 运行
ports:
- "25:25"
从液滴中的外壳:
$ netstat -tulpn | grep 25
tcp6 0 0 :::25 :::* LISTEN 10680/docker-proxy
我/etc/postfix/main.cf
的里面有这个:
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no
# appending .domain is the MUA's job.
append_dot_mydomain = no
# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h
readme_directory = no
# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
myhostname = example.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydestination = /etc/mailname, <container id>, localhost.localdomain, localhost, example.com
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
virtual_alias_domains = example.com
virtual_alias_maps = hash:/etc/postfix/virtual
inet_protocols = ipv4
我不太清楚myhostname
(最初设置为<container id>
)mydestination
和virtual_alias_domains
更新
来自http://mxtoolbox.com/SuperTool.aspx的输出
Connecting to <server IP>
220 example.com ESMTP Postfix (Ubuntu) [733 ms]
EHLO MXTB-PWS3.mxtoolbox.com
250-example.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN [714 ms]
MAIL FROM: <[email protected]>
250 2.1.0 Ok [722 ms]
RCPT TO: <[email protected]>
454 4.7.1 <[email protected]>: Relay access denied [715 ms]
MXTB-PWS3v2 4006ms
更新
正如@masegaloeh 帮助我发现的那样,我的后缀服务器基本上可以正常工作。我有两个问题使事情变得混乱:
由于我的 Dockerfile 中的错误,我
/var/log/mail.log
由 root 用户拥有......这就是它保持空白的原因。我没有看到任何关于它的错误,但基本上 rsyslog 无法写入它。一个chown syslog:adm /var/log/mail.log
步骤解决了这个问题,我可以看到确实 postfix 正在处理邮件并将邮件转发到别名。我错误地认为我能够从我的笔记本电脑远程登录到端口 25 上的其他服务器,只是因为我认为我过去做过一些需要它才能工作的事情。但实际上我做不到。但是,我可以
telnet example.com 25
从另一台服务器上进行操作,因此,东西实际上正在工作。从另一台服务器向别名发送邮件可以正常工作,并通过我的 Gmail 目标地址发送。
看来我的问题实际上与Gmail有关......当我
[email protected]
从我的Gmail帐户发送消息时,它没有显示出来。从那以后,我尝试使用我在另一个主机上设置的别名......有些工作,有些没有......导致:
结论:
Gmail 似乎只接受在...下配置的别名的邮件Settings > Accounts and Import > Send mail as
......不幸的是,Gmail 现在要求您在设置新服务器时为其指定第 3 方 SMTP 服务器,所以看起来我必须掌握在我的后缀安装中使用 TLS 等。
此 Telnet 日志消息
不是由
mynetworks
后缀中的配置引起的!该错误表明您的 telnet 数据包未到达 docker IP 地址或docker 中的后缀未响应您的 telnet。正如您提到的,您从自己的计算机上 telnet,那么您的 ISP 可能正在阻止端口 25。但是,因为您提到来自外部的电子邮件无法通过,甚至 postfix 日志是空的,所以可能 postfix 容器根本没有响应。也许您无法将 DO droplet 端口绑定到后缀 docker 端口。尝试
netstat -tulpn | grep 25
从 DO 液滴运行,以确认可以从外部访问后缀。由于我不熟悉 docker,所以我不能在这里提供确切的解决方案。然而,一些谷歌搜索结果表明您已将 IPtables 设置为像官方文档一样进行伪装:Binding container ports to the host
编辑
无论如何,您的 netstat 输出看起来不错。表明它仅在 IPv6 中侦听。但是这篇文章和这篇文章表明 Ubuntu/Debian 使用 IPv4 映射的 IPv6 地址方法来提供连接,所以也许它也可以从外部 IPv4 访问。
为了进一步排除故障,我在这里给出了发送电子邮件的最低要求
netstat
某些 MTA(postfix、exim、IIS)在端口 25 上侦听。您可以通过运行和 telnet 到 localhost来确认这一点因为您在堆栈中引入了 docker 代理,所以您必须确认
tcpdump port 25
在您发送电子邮件时运行以确认您的主机收到了数据包。