thefox / smtpd
纯PHP编写的SMTP服务器(库)。
v0.7.0
2018-01-13 15:16 UTC
Requires
- php: ^7.0
- psr/log: ^1.0
- symfony/options-resolver: ^3.3
- thefox/network: ^1.0
- zendframework/zend-mail: ^2.3
Requires (Dev)
- monolog/monolog: ^1.22
- phpmailer/phpmailer: ^5.2
- phpstan/phpstan: ^0.7
- phpunit/phpunit: ^6.2
- squizlabs/php_codesniffer: ^3.0
README
SMTP服务器(库)用于接收电子邮件,纯PHP编写。此库提供与SMTP服务器端协议的接口,并为每封到达的电子邮件创建一个\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
对象($server->eventAdd($event)
)添加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命令