TheFox / smtpd

SMTP server (library) for receiving emails, written in pure PHP.
https://fox21.at
MIT License
121 stars 30 forks source link
mit-license php php-library smtp smtp-library smtp-server smtpd

SMTPd

SMTP server (library) for receiving emails, written in pure PHP. This library provides an interface to the SMTP server-side protocol with PHP. It creates a \Zend\Mail\Message Class object for every incoming email and hands this object to a custom PHP function for further processing. The project is in Beta status, so it's not recommended for production use.

The d in SMTPd stands for Daemon. This script can run in background like any other daemon process. It's not meant for running as a webapplication.

Why this project?

Believe it or not, email is still the killer feature of the Internet. There are tons of projects like PHPMailer: to send emails programmatically (with PHP). But there are not so many to receive emails from SMTP.

With this interface you can do something like this for your app users:

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

This is useful when you have a messaging application written in PHP but no graphical user interface for it. So your graphical user interface can be any email client. Thunderbird for instance.

Project Outlines

The project outlines as described in my blog post about Open Source Software Collaboration.

Planned Features

Installation

The preferred method of installation is via Packagist and Composer. Run the following command to install the package and add it as a requirement to composer.json:

composer require thefox/smtpd

Delivery

At the moment the server accepts all incoming emails. You decide what happens with incoming emails by adding Events to the Server object ($server->eventAdd($event)). The server can handle certain events. Each event will be executed on a certain trigger. Even if you don't add any Events to the Server it accepts all incoming emails.

Events

At the moment there are two Event Triggers.

Examples

See also example.php file for full examples.

Trigger New Mail Example

$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();

Trigger Auth Example

$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();

Use SMTP Server with own loop

$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 Implementation

Complete implementation

Incomplete implementation

RFC 1651 Implementation

Complete implementation

RFC 3207 Implementation

RFC 4954 Implementation

Related Links

Related Projects

Project Links