我有一个网站,其中有一些基于 PHP 的 CMS,我是该网站的唯一用户。该网站有一个简单的联系表格(姓名、电子邮件、电话和正文),我可以通过该表格收到来自非注册用户的邮件。
一方面,我想将电子邮件从该表单直接转移到我的电子邮件帐户。
另一方面,我宁愿不设置任何 DNS 记录,因为我至少一次对垃圾邮件目录没有问题,因为我会将站点计算机的 IP 放入良好列表中。
据我所知,在任何 Linux 系统上使用 SMTP 协议基本上有三种方法(通过 PHPmail()
函数):
- 安装和配置邮件传输代理(如
postfix
)。 - 安装和配置电子邮件代理利用程序(如
ssmtp
),其中还包括向可能的黑客展示配置文件中的代理电子邮件帐户的地址和密码ssmtp
,因此程序可以使用该帐户作为代理。 - 根据这个答案,第三种方式,可能被命名为发送邮件二进制文件。
有没有这样一个概念发送邮件二进制文件如果是这样,它与前两个选项有何不同?
答案1
可以通过三种方式从 php 中获取邮件。
mail()
与人交谈/usr/lib/sendmail
或类似mail()
与 MTA 进行 SMTP 对话(主要用于 Windows)- phpmailer 这是一个直接使用 SMTP 的 PHP 对象,以及类似的支持 TCP 的 PHP 代码
您列出的 3 个选项都是选项 1 的变体。
Postfix 和 ssmtp 都提供了一个 sendmail 二进制文件,php 在您调用后调用该二进制文件mail()
。
访问 sendmail 的第四种方法是使用popen()
,如果您采用该方法,请务必shellescape()
对所有参数使用,几年前,由于未能转义 args,存在一个主要的 WordPress 漏洞。这导致功能被从mail()
.
在所有情况下,对您的服务器的成功攻击都会暴露您的 SMTP 凭据,因此不应与其他系统共享它们。或者应该是不可移植的类型(例如:如果服务器的 SMTP 帐户与服务器的 IP 地址相关)。切勿使用您的 IMAP 密码,如果密码泄露,您的身份(域名等)可能会被盗。
答案2
这不是第三条路。
这是两种方法中的第一种:
- 运行一个众所周知的程序并将信封和消息作为输入,或者
- 与远程/本地 SMTP 提交服务器建立 TCP 连接并使用 SMTP 提交协议。
(第三种方法是说老式邮件注入协议到本地/远程服务器,但我认为世界上二十年来已经接受了正确的 SMTP 提交,与 SMTP 中继不同。)
20 世纪 80 年代的旧 BSD Sendmail 程序曾经但不再是一个非常流行的邮件子系统,它允许邮件用户代理(当时的邮件阅读器和新闻阅读器)以及通过邮件报告内容的各种子系统,通过运行来提交邮件该程序与消息信封作为命令行参数和留言内容(标题和正文)作为程序的标准输入。 BerkeleyMail
和 AT&T等 MUAmailx
并没有像它们的前身那样直接将邮件注入用户邮箱。相反,他们使用相关的命令行参数分叉了一个运行 Sendmail 的子进程,并通过管道将消息内容发送到该子进程。
该程序通常不在 shell 的命令搜索路径上,而是具有一个完整用于运行它的众所周知的路径名。 MUA 通常具有可配置选项,允许用户覆盖编译的路径名,但在没有该选项的情况下,MUA 将在名为/usr/ucb/sendmail
(或/usr/libexec/sendmail
、或/usr/lib/sendmail
、或/usr/sbin/sendmail
、或其他类似文件名的文件中运行程序,随操作系统的不同而不同)操作系统)。
这二进制程序映像文件包括发送邮件程序成为事实上的邮件提交方案。取代 BSD Sendmail 的替代邮件传输系统最终提供了一个自己的程序,该程序仍然被称为,sendmail
因为这是硬连线到 MUA 中的名称,它将与各种不同的系统进行互操作。
最初的程序当然是 BSD Sendmail 本身,它是一个单一程序,徒劳地同时担任所有职务,完成 MTS 的所有工作。这可以在各种不同的模式下操作,可以通过多个选项进行选择。提交只是其中一种模式,而这恰好是默认模式。-bx
-bm
许多替代 MTS 根本不是这样工作的,并且它们的替代sendmail
程序的功能仅限于只是邮件提交。
- qmail 的情况尤其如此。
- 最值得注意的是它不是以 Exim 为例,它仍然在一个庞大的程序中完成所有操作,甚至还添加了一大堆更远
-bx
Sendmail 中的一些模式也是在这些年中不断积累的,包括通过标准 I/O 进行 SMTP 提交的额外模式。 - Zmailer
sendmail
也支持一大堆模式,但在幕后将工作分配给多个本机程序。 - MMDF 是少数不提供
sendmail
填充程序的程序之一,但要求用户使用上述 MUA 配置设置来指向其submit
程序。 MMDF doco 给出了如何配置 Mutt 的示例:设置 sendmail='/usr/mmdf/bin/submit -mlnre'
Windows NT 从来没有真正有过类似的东西,这就是为什么您会发现跨平台软件普遍谈论不同的行为。它还缺乏简单地期望每个主机都具有某种形式的邮件功能的传统。 (例如,直到今天,FreeBSD 的各个部分都希望能够例行公事地向用户和系统管理员发送邮件。)
(OS/2 也没有这个传统,甚至不是多用户的。但是,它也带有 BSD Sendmail 的端口。我曾经为 OS/2 编写了一个替代 MTS,其中包含 IBM 提供的sendmail.exe
.与 Zmailer 类似sendmail
,它在幕后将东西外包给本机程序。)
然而,在 Unices 上,邮件系统的存在被视为已读。此外,在服务器侦听 TCP 套接字的想法广泛传播之前,这种机制已成为常态,不仅仅适用于邮件。其中一个运行 set-GID/set-UID 程序,并为其提供命令行参数和标准输入数据来提交打印作业、调度 UUCP 作业以及调度at
作业。
替换sendmail
程序通常不像 BSD Sendmail 程序那样设置 UID/设置 GID。 (有时,就像 mini-qmail 和其他系统将所有邮件推送到另一台主机上的队列一样,根本不需要任何 set-ID 程序。其他时候,set-ID 程序是 MTS 的本机程序程序包装的程序sendmail
。)并且它们一般只支持提交。但这仍然是迄今为止提交邮件的两种方式之一。
进一步阅读
答案3
从前,有一个名为 的 SMTP 服务器sendmail
。 (事实上,SMTP 服务器仍然存在。)它充满了 root 漏洞 - 很长一段时间以来,一个又一个。其他 SMTP 服务器的出现取代了有问题的 SMTP 服务器 - 例如 postfix、qmail 等。在某一时刻,它sendmail
是如此糟糕,以至于人们可以将任何命令放入~/.forward
文件中,将邮件发送到包含该文件的帐户~/.forward
,并执行所有命令~/.forward
以用户身份在文件中执行命令root
。还有很多很多更简单的漏洞利用。在sendmail
SMTP 服务器变得如此不安全之前,它一直无处不在。因此,许多软件开始依赖于sendmail
.
如今,SMTP 服务器提供了sendmail
自己制作的二进制文件,以便与依赖于其存在的其他程序一起运行。例如,安装Postfix SMTP服务器后,手册的第一个声明如下:“sendmail - Postfix到Sendmail的兼容性接口”。就您的问题而言,这意味着人们可以简单地利用sendmail
PHP 中的二进制文件来简化 PHP 代码并利用现有的配置良好的 SMTP 服务器。对于您的问题,sendmail
是指一个二进制程序,其作用类似于现有 SMTP 服务器安装(而不是sendmail
SMTP 服务器)的包装器。换句话说,您仍然需要 SMTP 服务器来使用sendmail
二进制文件。
DNS 部分很简单:只需要一条MX
记录和一条TXT
带有 SPF 的记录。记录MX
是中号艾尔X变更记录。它不是官方的,但每个人都在使用它。如果域中存在多个 SMTP 服务器,它会指定一个编号优先级。这是下面的值10
。最小的数字具有最高的优先级。
SPF 是S安德磷奥利西F框架。此记录发布授权代表域发送邮件的地址或子网列表。这使得恶意发件人更难掩饰其身份,从而减少垃圾邮件和欺诈。几乎所有其他 SMTP 服务器都不会通过 SMTP 与未实施 SPF 记录的域进行通信。
Type Host Value
MX @ 10 full.host.name
TXT @ v=spf1 mx a -all
事实上,正如一篇文章中所指出的评论,@RubberStamp,DMARC 记录现在也在使用中。因此,应该积极主动地实施这项技术。也就是说,当正确的做法是保持服务平稳运行时,为什么要等待中断呢?我没有这样的记录示例,因为我刚刚意识到我错过了火车,显然,任何地方都没有报告 SMTP 问题。但我稍后会回来发帖。
这些记录存在后,人们可能会继续安装和配置 SMTP 服务器,例如 Postfix、qmail、exim 等。配置完成后,使用开放中继测试工具来确保垃圾邮件发送者无法滥用您的新 SMTP 服务器。
该程序ssmtp
是一个只发送程序。它不是邮件服务器。它在发送邮件之前使用凭据连接到邮件服务器进行身份验证。在任何人都可以从存储ssmtp
.