为什么PHP mail()需要sendmail/postfix/etc之类的邮件程序来发送邮件?

nhn9ugyo  于 2023-03-11  发布在  PHP
关注(0)|答案(6)|浏览(192)

**想要改进此帖子吗?**请提供此问题的详细答案,包括引文和对答案正确性的解释。未提供足够详细信息的答案可能会被编辑或删除。

为什么PHP的mail()函数需要一个邮件程序,比如sendmail/postfix/etc来发送邮件?
我这样问是因为发送电子邮件是客户端操作,而不是需要运行服务器的操作。
创建一个原生PHP邮件函数而不需要安装sendmail/postfix/等程序有什么复杂之处?这些程序作为服务器具有过多的功能,可以接收请求,而不仅仅是作为客户端发送电子邮件。

jslywgbw

jslywgbw1#

最有可能:sendmail早于PHP的mail(),因此在 *nix的真正精神下:

CLI上已经存在功能,为什么还要重新创建?

ny6fqffe

ny6fqffe2#

你想把邮件交给其他东西的原因是,邮件是一个复杂的野兽,最好是推迟到一些更好的设计来处理。
一个简单的例子是当你把邮件发送到一个离线的服务器上。邮件服务器离线是“可以的”,在邮件服务器的操作中有一个内置的逻辑来重试邮件发送。但是如果你简单地打开一个SMTP套接字并启动barking协议,它失败了,那么你就失去了邮件服务器“免费”提供的排队功能。
邮件只是最好委托给那些古老系统的东西之一,这些系统经过多年痛苦的互操作性测试和实现,将所有的知识和细节编码到其中。

lokaqttq

lokaqttq3#

PHP本身并不发送邮件,而是委托另一个程序为它发送邮件。
您可以通过使用PEAR Mail包来绕过此限制,该包支持SMTP。

plicqrtu

plicqrtu4#

原因是mail()函数不是MTA,只是实际MTA的“编码器”。
为什么不呢?我认为单独使用PHP实现一个体面而安全的MTA设置是不切实际的。

编辑:What exactly does an MTA do?

rekjcdws

rekjcdws5#

当邮件服务器将电子邮件转发(路由)到另一个服务器时,它就像客户端一样使用SMTP转发电子邮件。客户端部分称为邮件传递代理(MDA),通常是一个独立的软件。

x7rlezfr

x7rlezfr6#

它被称为“sendmail”是有原因的。几十年来,网络一直使用它来进行相互通信。不管你知道与否,这就是邮件的发送方式。--通过一个限制在RFC协议中的程序,它被设计成格式化、打包和发送数据到......其他服务器。它可以作为一个守护进程运行,位于一个端口上,也可以从命令行调用的示例运行。它是一个简单的工具,而且是高效的。
尝试用邮件发送程序以外的东西(比如网络浏览器客户端或PHP语言模块)发送电子邮件就像用枪切东西一样。那里有很多东西在运行,太多冲突的条件可能会把它挂起来。它不是为它设计的,不会有效地工作。

相关问题