smtpd

其他类别 2025-08-18

smtpd

SMTP服务器(库),用于接收用纯PHP编写的电子邮件。该库提供了带有PHP的SMTP服务器端协议的接口。它为每个传入的电子邮件创建一个ZendMailMessage类对象,并将此对象交给自定义PHP函数以进行进一步处理。该项目处于Beta状态,因此不建议用于生产使用。

smtpd中的d代表守护程序。该脚本可以像其他任何守护程序过程一样在后台运行。这并不是要作为网络应用程序运行。

为什么这个项目?

信不信由你,电子邮件仍然是互联网的杀手级功能。有很多项目,例如phpmailer:以编程方式发送电子邮件(带有PHP)。但是,收到SMTP的电子邮件并不多。

使用此界面,您可以为您的应用程序用户做这样的事情:

smtpd +---> | Your PHP App | +------+ +------------------------+ +-------+ +--------------+">
 +------+     +------------------------+     +-------+     +--------------+
| User +---> | MUA (like Thunderbird) +---> | smtpd +---> | Your PHP App |
+------+     +------------------------+     +-------+     +--------------+

当您使用PHP编写消息传递应用程序,但没有图形用户界面时,这很有用。因此,您的图形用户界面可以是任何电子邮件客户端。例如,雷鸟。

项目大纲

该项目概述了我关于开源软件协作的博客文章中所述。

  • 该软件的主要目的是为PHP脚本提供服务器端SMTP API。
  • 尽管RFC实施尚未完成,但必须严格。
  • 将来可能会有更多功能。从协议的角度来看,功能必须是RFC实现。
  • 此列表开放。随意请求功能。

计划的功能

  • 完整的RFC 821实施。
  • 完整的RFC 1651实施。
  • 完整的RFC 1869实施。
  • 用更好的解决方案替换ZendMail

安装

首选的安装方法是通过Packagist和Composer。运行以下命令安装软件包并将其添加为Composer.json的要求:

composer require thefox/ smtpd 

送货

目前,服务器接受所有传入的电子邮件。您可以通过将Event S添加到Server对象( $server->eventAdd($event) )来确定传入的电子邮件会发生什么。服务器可以处理某些事件。每个事件将在某个触发器上执行。即使您不向服务器添加任何事件,它也会接受所有传入的电子邮件。

事件

目前有两个事件触发器。

  • TRIGGER_NEW_MAIL :当客户端完成发送新电子邮件时,将触发。
  • TRIGGER_AUTH_ATTEMPT :当客户端想要身份验证时,将触发。无论身份验证是否成功,从回调函数中返回布尔值。

例子

另请参见example.php文件以获取完整示例。

触发新邮件示例

 $ server = new Server (...);

$ event = new Event (Event:: TRIGGER_NEW_MAIL , null , function ( Event $ event , $ from , $ rcpts , $ mail ){
	// Do stuff: handle email, ...
});
$ server -> addEvent ( $ event );
$ server -> loop ();

触发验证示例

 $ server = new Server (...);

$ event = new Event (Event:: TRIGGER_AUTH_ATTEMPT , null , function ( Event $ event , $ type , $ credentials ): bool {
	// Do stuff: Check credentials against database, ...
	return true ;
});
$ server -> addEvent ( $ event );
$ server -> loop ();

使用带有循环的SMTP服务器

smtpd loop, once. $server->run(); usleep(10000); // Never run a main thread loop without sleep. Never! }">
 $ server = new Server (...);

// Set up server here.
// Add Events, etc, ...

while ( myApplicationRuns ()){
	// Do stuff your application needs.
	// ...
	
	// Run main smtpd loop, once.
	$ server -> run ();
	usleep ( 10000 ); // Never run a main thread loop without sleep. Never!
}

RFC 821实施

完整实施

  • 3.5开放和关闭

不完整的实现

  • 3.1邮件
  • 4.1.1命令语义
    • Helo
    • 邮件
    • rcpt
    • 数据
    • 辞职

RFC 1651实施

完整实施

  • 4.1.1第一个命令
  • 4.5来自扩展服务器的错误响应

RFC 3207实施

RFC 4954实施

    1. auth命令

相关链接

  • RFC 821
  • RFC 1425
  • RFC 1651
  • RFC 1869
  • RFC 2821
  • RFC 3207
  • RFC 4954

相关项目

  • IMAPD

项目链接

  • Packagist软件包
下载源码

通过命令行克隆项目:

git clone https://github.com/TheFox/smtpd.git