通过联系表单实现 Web 服务器仅发送邮件功能

通过联系表单实现 Web 服务器仅发送邮件功能

我是陷入困境再次。

由于邮件由第三方应用处理,我将网络服务器和邮件服务器分开。在网站上,我有一个联系表单,它使用 mail() 函数。所有服务都位于 cloudflare 的 DNS 后面。我可以通过该应用发送和接收邮件。但我无奈地收到了收件人 MTA 的错误回复,内容是:“550-Sender 没有 A、AAAA 或 MX DNS 记录。”我敢打赌我配置错了什么,或者忘记向 cloudflare 添加记录了。请帮我指出,非常感谢

以下是错误消息:

最后一封测试邮件

From MAILER-DAEMON Tue Aug 02 16:56:47 2016
Return-path: <>
Envelope-to: root@kati
Delivery-date: Tue, 02 Aug 2016 16:56:47 +0000
Received: from Debian-exim by Kati.<azure's provided FQDN> with local (Exim 4.84_2)
        id 1bUczn-000EE3-He
        for root@kati; Tue, 02 Aug 2016 16:56:47 +0000
X-Failed-Recipients: <recipient mail>
Auto-Submitted: auto-replied
From: Mail Delivery System <Mailer-Daemon@kati>
To: root@kati
Subject: Mail delivery failed: returning message to sender
Message-Id: <E1bUczn-000EE3-He@Kati.<azure's provided FQDN>>
Date: Tue, 02 Aug 2016 16:56:47 +0000

This message was created automatically by mail delivery software.

A message that you sent could not be delivered to one or more of its
recipients. This is a permanent error. The following address(es) failed:

  <recipient mail>
    SMTP error from remote mail server after RCPT TO:<recipient mail>:
    host mx1.privateemail.com [<recipient IP>]: 550-Sender has no A, AAAA, or MX DNS records.
    550 Kati.<azure's provided FQDN> kati

------ This is a copy of the message, including all the headers. ------

Return-path: <root@kati>
Received: from root by <azure's provided FQDN> with local (Exim 4.84_2)
        (envelope-from <root@kati>)
        id 1bUczl-000EDy-OE
        for <recipient mail>; Tue, 02 Aug 2016 16:56:45 +0000
To: <recipient mail>
Subject: Test
From:<sender mail>
Message-Id: <E1bUczl-000EDy-OE@Kati.<azure's provided FQDN>>
Date: Tue, 02 Aug 2016 16:56:45 +0000

Testing Exim

和配置:

进出口会议

dc_eximconfig_configtype='internet'
dc_other_hostnames='Kati; localhost'
dc_local_interfaces='127.0.0.1 ; ::1'
dc_readhost=''
dc_relay_domains=''
dc_minimaldns='false'
dc_relay_nets=''
dc_smarthost=''
CFILEMODE='644'
dc_use_split_config='false'
dc_hide_mailname=''
dc_mailname_in_oh='true'
dc_localdelivery='mail_spool'

答案1

首先,由于你的原帖缺少细节,我假设当你说:“...联系表,使用 mail() 函数...“你指的是 PHP邮件()功能。

在这种情况下,您应该注意邮件()函数将简单地启动本地“sendmail”二进制应用程序,如发送邮件路径配置指令(...不,“sendmail”二进制文件与“sendmail”邮件服务器没有严格的关系)。“sendmail”的执行将以向其传递多个参数(“to”、“headers”等)的方式进行。请注意,我假设您在 Linux 下运行 PHP,就像在 Windows 环境中一样,mail() 函数在非常不同的方式

基于以上几点,你很容易猜到,通过 PHP 的 mail() 函数发送的出站电子邮件的传递,完全依赖于底层邮件服务器的正确配置

不幸的是,新安装的 Linux 机器上部署了配置不正确的邮件服务器,这种情况很常见:错误的主机名、错误的域/FQDN、主机的 DNS 配置不匹配(A 记录)和反向 DNS(PTR 记录)——根据我的经验——很常见

在你的原帖中,我清楚地认识到上述一些“症状”,如下表所示:

Envelope-to: root@kati
[...]
To: root@kati
[...]
550-Sender has no A, AAAA, or MX DNS records

因此,换句话说,远程邮件服务器(...接收来自本地邮件服务器的电子邮件...接收通过 sendmail 二进制文件提交的 PHP 电子邮件)正在抱怨,因为您的邮件服务器配置不正确。他们是对的。:-)

如何解决你的问题?

您可能会猜到唯一的选择是:

  1. 清理/修复您的邮件服务器配置;

这是事实……但也是非常复杂。正确配置功能齐全的邮件服务器是一项非常复杂的任务,如果操作不正确,可能很快导致进一步(和更大)的问题。

但是……嘿!我们错过了起点!毕竟,您只想发送由联系表单生成的电子邮件!因此,真正的问题是:我们真的需要一个完全配置的邮件服务器来发送这样一封非常简单的电子邮件吗?这个问题将我们引向了第二个选项:

  1. 重构我们的 PHP 代码不是使用 mail() 函数,但实际上,它充当的是面向外部(...并由其他人正确配置)邮件服务器的“普通”SMTP 客户端 :-)。基本上,您想“绕过”本地 sendmail 二进制文件,并通过 SMTP 发送电子邮件。

这是我的建议:只需避免使用 mail() 函数,而使用一些现成的 SMTP 类。一个很好的候选者是PEAR Mail 接口的 SMTP 实现有了这样的模块,就可以很容易地指向现有的 SMTP 服务器,甚至经过身份验证... 并完全忘记本地邮件服务器。

我把重构代码的努力留给你......我真的认为这很容易,不需要进一步的解释:-)

相关内容