amouhzi / smtpd
纯PHP编写的SMTP服务器(库)。
1.0.0-alpha1
2020-12-08 20:30 UTC
Requires
- php: ^7.0 | ^8.0
- psr/log: ^1.0
- symfony/options-resolver: ^3.3 | ^4.0 | ^5.0
- thefox/network: ^1.0
- zendframework/zend-mail: ^2.3
Requires (Dev)
- monolog/monolog: ^1.23
- phpmailer/phpmailer: ^5.2
- phpstan/phpstan: ^0.9
- phpunit/phpunit: ^6.2
- squizlabs/php_codesniffer: ^3.3
README
纯PHP编写的用于接收电子邮件的SMTP服务器(库)。此库提供了与SMTP服务器端协议的PHP接口。为每封收到的电子邮件创建一个\Zend\Mail\Message
类对象,并将其传递给自定义的PHP函数进行进一步处理。该项目处于Beta状态,因此不建议在生产环境中使用。
SMTPd
中的d
代表守护进程。此脚本可以像任何其他守护进程一样在后台运行。它不适用于作为Web应用程序运行。
为什么选择这个项目?
信不信由你,电子邮件仍然是互联网的杀手级功能。有许多像PHPMailer这样的项目:使用PHP程序发送电子邮件。但是,用于从SMTP接收电子邮件的项目却不多。
使用此接口,您可以为您的应用程序用户执行以下操作
+------+ +------------------------+ +-------+ +--------------+
| User +---> | MUA (like Thunderbird) +---> | SMTPd +---> | Your PHP App |
+------+ +------------------------+ +-------+ +--------------+
当您有一个用PHP编写的消息应用程序但没有图形用户界面时,这很有用。因此,您的图形用户界面可以是任何电子邮件客户端。例如,Thunderbird。
项目概述
项目概述如我在开源软件协作的博客文章中所述。
- 此软件的主要目的是为PHP脚本提供服务器端SMTP API。
- 尽管RFC实现尚未完成,但它们必须是严格的。
- 未来可能会实现更多功能。从协议的角度来看,功能必须是RFC实现。
- 此列表是开放的。请随意请求功能。
计划功能
安装
首选的安装方法是使用Packagist和Composer。运行以下命令安装包并将其添加到composer.json中
composer require thefox/smtpd
交付
目前,服务器接受所有收到的电子邮件。您可以通过向Server
对象添加Event
来决定对收到的电子邮件的处理($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服务器
$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
- DATA
- NOOP
- QUIT
RFC 1651 实现
完整实现
- 4.1.1 首个命令
- 4.5 扩展服务器错误响应
RFC 3207 实现
RFC 4954 实现
-
- AUTH 命令