amouhzi/smtpd

纯PHP编写的SMTP服务器(库)。

1.0.0-alpha1 2020-12-08 20:30 UTC

This package is auto-updated.

Last update: 2024-09-09 04:40:15 UTC


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实现。
  • 此列表是开放的。请随意请求功能。

计划功能

  • 完整的RFC 821实现。
  • 完整的RFC 1651实现。
  • 完整的RFC 1869实现。
  • 用更好的解决方案替换Zend\Mail

安装

首选的安装方法是使用PackagistComposer。运行以下命令安装包并将其添加到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
    • MAIL
    • RCPT
    • DATA
    • NOOP
    • QUIT

RFC 1651 实现

完整实现

  • 4.1.1 首个命令
  • 4.5 扩展服务器错误响应

RFC 3207 实现

RFC 4954 实现

    1. AUTH 命令

相关链接

相关项目

项目链接