我正在 Ubuntu Server 12.04 上配置 Postfix 安装,以将少量邮件从服务器上的特定地址转发到另一个域的特定地址。
$ pwd
/etc/postfix
$ cat main.cf
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no
append_dot_mydomain = no
readme_directory = no
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
myhostname = awsBeta
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydestination = awsBeta, localhost.localdomain, , localhost, someDomain.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_mailbox_domains = someDomain.com
virtual_mailbox_base = /var/mail/vhosts
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
virtual_minimum_uid = 100
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_alias_domains = someDomain.com
virtual_alias_maps = hash:/etc/postfix/virtual
$ cat virtual
[email protected] [email protected]
$
当我登录服务器上的 PHP CLI 解释器发送邮件时,邮件被正确传递到[email protected]
. 请注意,这dotancohen.com
是一个 Google Apps 域,MX 记录由 Google 托管。
$ php -a
Interactive shell
php > mail('[email protected]','Subject','tMessage', 'From: <[email protected]>');
我可以看到邮件已经到达[email protected]
收件箱。这告诉我转发器有效。现在我从桌面的 telnet 提示符尝试:
$ telnet mail.someDomain.com 25
Trying x.x.x.x...
Connected to mail.someDomain.com.
Escape character is '^]'.
220 someHostname ESMTP Postfix (Ubuntu)
EHLO dotancohen.com
250-someHostname
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
MAIL FROM: [email protected]
250 2.1.0 Ok
RCPT TO: [email protected]
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
From: [email protected]
SUBJECT: Hi, telnet!
This is a second attempt!
.
250 2.0.0 Ok: queued as 9851E81579
QUIT
221 2.0.0 Bye
Connection closed by foreign host.
$
此邮件未送达,我在 postfix 日志中找到以下内容:
Jul 4 16:02:58 someHostname postfix/smtp[24898]: connect to ASPMX.L.GOOGLE.com[2607:f8b0:400c:c03::1b]:25: Network is unreachable
Jul 4 16:02:58 someHostname postfix/smtp[24898]: 935BC81579: to=<[email protected]>, orig_to=<[email protected]>, relay=ASPMX.L.GOOGLE.com[173.194.75.26]:25, delay=15, delays=15/0.02/0.08/0.15, dsn=2.0.0, status=sent (250 2.0.0 OK 1372953778 d3si1064427vck.0 - gsmtp)
看起来 Google 收到了邮件,但决定(可能是由于 SPF)不发送它。它也不在我的垃圾邮件文件夹中!最后,我尝试简单地从一个不相关的 Hotmail 帐户向该域发送电子邮件。这封电子邮件也未送达,但 Postfix 日志中没有任何内容。
为了完整起见,这里是经过匿名化处理的 MX 记录:
$ dig mx someDomain.com
someDomain.com. 1800 IN MX 10 mail.someDomain.com.
$ dig a mail.someDomain.com
mail.someDomain. 1790 IN A x.x.x.x
我可以确认这x.x.x.x
实际上是服务器的正确 IP 地址,并且与我使用 telnet 访问的地址相同。
为什么来自合法邮箱账户(如hotmail账户)的邮件无法投递到该[email protected]
账户?
这一行:
意味着您通过 telnet 访问的 SMTP 服务器之间存在 ipv6 路由问题
2607:f8b0:400c:c03::1b
。防火墙当然也可以将 ICMP 消息报告为阻止数据包的一种方式,但请尝试 ping 它。例如,您可能正在进行部分或间歇性的 ipv6 路由。如果您发现您有时只能 ping 它或者您根本无法 ping 它并且回复始终告诉您没有路由,则您的上游 ISP(或为您提供 IPv6 路由的任何人)需要解决他们的路由问题。端口 25 阻塞也可能正在进行。这是非常常见的;如果您使用 hurricane Electric 进行 IPv6 连接,除非您特别要求允许,否则它们会阻止端口 25 的传出;大多数 ISP 都是这种情况(因为如果不是这种情况,垃圾邮件发送者就会蜂拥而至,并且不利于他们的限制性政策开始随处出现,因为他们获得了垃圾邮件避风港的声誉)。
此问题不是由 SPF 或 DKIM 或基于内容的垃圾邮件过滤引起的;这是一个网络问题。
问题是端口 25 被防火墙关闭了!我的本地 IP 地址(我所在的位置)为它打开了所有端口,因此我可以远程登录。Hotmail 和其他合法电子邮件提供商没有端口 25 访问权限,因此日志文件中没有任何内容!