我们在 CentOS 6 机器上使用 Postfix,配置如下。我们使用 PHP 的mail()
功能发送基本的密码重置电子邮件,但存在一个问题。
正如您所看到的,据我所知,mydomain 和 myhostname 已正确设置。
alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
command_directory = /usr/sbin
config_directory = /etc/postfix
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
debug_peer_level = 2
html_directory = no
inet_interfaces = localhost
inet_protocols = all
mail_owner = postfix
mailq_path = /usr/bin/mailq.postfix
manpage_directory = /usr/share/man
mydestination = $myhostname, localhost.$mydomain, localhost
mydomain = ***.ch
myhostname = test.***.ch
newaliases_path = /usr/bin/newaliases.postfix
queue_directory = /var/spool/postfix
readme_directory = /usr/share/doc/postfix-2.6.6/README_FILES
sample_directory = /usr/share/doc/postfix-2.6.6/samples
sendmail_path = /usr/sbin/sendmail.postfix
setgid_group = postdrop
unknown_local_recipient_reject_code = 550
/var/log/maillog
现在,这是在向发送电子邮件时 Postfix中的内容***.***@***.ch
,并且与***.ch
我们的发送服务器位于同一域test.***.ch
上:
Dec 13 16:55:06 R12X0210 postfix/pickup[6831]: E6D6311406AB: uid=48 from=<apache>
Dec 13 16:55:06 R12X0210 postfix/cleanup[6839]: E6D6311406AB: message-id=<20121213155506.E6D6311406AB@test.***.ch>
Dec 13 16:55:07 R12X0210 postfix/qmgr[6832]: E6D6311406AB: from=<apache@test.***.ch>, size=1276, nrcpt=1 (queue active)
Dec 13 16:55:52 R12X0210 postfix/smtp[6841]: E6D6311406AB: to=<***.***@***.ch>, relay=mail.***.ch[**.**.249.3]:25, delay=46, delays=0.18/0/21/24, dsn=5.0.0, status=bounced (host mail.***.ch[**.**.249.3] said: 550 Sender Rejected (in reply to RCPT TO command))
Dec 13 16:55:52 R12X0210 postfix/cleanup[6839]: 8562C11406AC: message-id=<20121213155552.8562C11406AC@test.***.ch>
Dec 13 16:55:52 R12X0210 postfix/bounce[6848]: E6D6311406AB: sender non-delivery notification: 8562C11406AC
Dec 13 16:55:52 R12X0210 postfix/qmgr[6832]: 8562C11406AC: from=<>, size=3065, nrcpt=1 (queue active)
Dec 13 16:55:52 R12X0210 postfix/qmgr[6832]: E6D6311406AB: removed
Dec 13 16:55:52 R12X0210 postfix/local[6850]: 8562C11406AC: to=<root@test.***.ch>, orig_to=<apache@test.***.ch>, relay=local, delay=0.13, delays=0.07/0/0/0.05, dsn=2.0.0, status=sent (delivered to mailbox)
Dec 13 16:55:52 R12X0210 postfix/qmgr[6832]: 8562C11406AC: removed
因此接收服务器拒绝了发送者(日志输出的第 4 行)。我们已经用另一个接收者测试过,并且成功了,所以这个问题可能与我们的设置完全无关,但与接收者有关。
尽管如此,对于这个问题,我想确保我们没有犯明显的配置错误。
答案1
首先,您应该告知 PHP mail() 函数谁是邮件的发件人,如果您不这样做,它将获取运行 PHP 的用户的名称并在其中添加 @test.*****.ch ,而我猜 test.****.ch 没有 MX 记录,不用于接收邮件。
现在给出一般性建议:
当处理仅发送邮件的卫星邮箱时,这是我的方法(当您没有 test.***.ch 作为单独的邮件域时)。
在主邮件服务器上,我为每台服务器创建了一个用于发送邮件的帐户,我使用此帐户信息将所有邮件转发到主邮件服务器,以便他可以处理进一步的投递。要进行设置,请查看 smtp_sasl 选项。
之后创建一个文件 /etc/postfix/generic,内容如下:
@test.*****.ch server.test@*****.ch
并运行:
postmap hash:/etc/postfix/generic
现在添加到您的 main.cf 文件:
smtp_generic_maps = hash:/etc/postfix/generic
并且为了更好的措施,请转发 root 的邮件(通过 /etc/aliases 或 /root/.forward)将所有 root 的邮件重定向到系统管理员的电子邮件地址。
当然,完成所有操作后您需要重新启动 Postfix。
所有这些都解决了几个问题:
- 来自系统的所有邮件都以 test.*****.ch 作为域名,通过创建通用映射,我们告诉 Postfix 将 test.*****.ch 替换为 *****.ch,这是一个具有 MX 的有效电子邮件域名
- 由于我们正在向远程邮件服务器进行身份验证,因此我们可能可以跳过许多未经身份验证的用户无法进行的检查
- 发给 root 的邮件被重定向到正确的邮箱
答案2
据我所知,目标服务器不喜欢发件人 apache@test.***.ch
您可以尝试添加myorigin = $mydomain
到 Postfixmain.cf
配置文件
答案3
接收方域是否在进行发送方验证?如果是,test.xxxxx.ch 是否有正确的 DNS 和/或 MX 记录。接收主机上的日志会显示什么,因为它们将提供更多信息。我会确保 test.xxxx.ch 具有正确的 dns/mx,并接受将响应 RCPT TO 的传入连接[电子邮件保护],这样当接收主机尝试进行发送方验证时它将通过。