• Stars
    star
    121
  • Rank 293,924 (Top 6 %)
  • Language
    PHP
  • License
    MIT License
  • Created over 10 years ago
  • Updated over 4 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

SMTP server (library) for receiving emails, written in pure PHP.

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.

  • The main purpose of this software is to provide a server-side SMTP API for PHP scripts.
  • Although the RFC implementations are not completed yet, they must be strict.
  • More features can be possible in the future. In perspective of the protocols the features must be a RFC implementation.
  • This list is open. Feel free to request features.

Planned Features

  • Full RFC 821 implementation.
  • Full RFC 1651 implementation.
  • Full RFC 1869 implementation.
  • Replace Zend\Mail with a better solution.

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.

  • TRIGGER_NEW_MAIL: will be triggered when a Client has finished transmitting a new email.
  • TRIGGER_AUTH_ATTEMPT: will be triggered when a Client wants to authenticate. Return a boolean from the callback function whether the authentication was successful or not.

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

  • 3.5 OPENING AND CLOSING

Incomplete implementation

  • 3.1 MAIL
  • 4.1.1 COMMAND SEMANTICS
    • HELO
    • MAIL
    • RCPT
    • DATA
    • NOOP
    • QUIT

RFC 1651 Implementation

Complete implementation

  • 4.1.1 First command
  • 4.5 Error responses from extended servers

RFC 3207 Implementation

RFC 4954 Implementation

    1. The AUTH Command

Related Links

Related Projects

Project Links

More Repositories

1

keylogger

Keylogger for Windows.
C++
214
star
2

gnuplot-examples

GNUPlot Examples
Gnuplot
68
star
3

cmus-control

Control cmus with Media Keys ⏪ ▶️ ⏩ under OS X.
CMake
52
star
4

imapd

IMAP server (library) to serve emails to an email client, written in pure PHP.
PHP
51
star
5

synflood

Start a SYN flood attack to an ip address.
C
34
star
6

GPLv3.md

GPLv3 in Markdown.
28
star
7

i8086emu

An Intel 8086 CPU Emulator written in pure PHP.
PHP
26
star
8

flickr-cli

A command-line interface to Flickr. Upload and download photos, photo sets, directories via shell.
PHP
25
star
9

phpchat

A decentralized, peer-to-peer, encrypted chat in PHP.
PHP
24
star
10

hashcash

Pure PHP implementation of Hashcash 1.
PHP
19
star
11

tumblr-parser

A Tumblr Theme parser in PHP.
PHP
11
star
12

assembly

Assemble x86, i386, x86_64 instructions using PHP.
PHP
9
star
13

pastebin

Just another Pastebin.com CLI script, but you can even login with your user account.
Ruby
8
star
14

JaPHPh

Just another PHP hacker.
PHP
8
star
15

utilities

Collection of useful PHP utilities.
PHP
6
star
16

blackbox

Create and manage AES256 encrypted loop devices (.img files) under Linux.
Perl
6
star
17

html5-offline-example

Example of HTML5 Application Cache and Local Storage.
HTML
6
star
18

httpflood

Tool for flooding HTTP servers under Linux.
C
4
star
19

tumblr-exporter

Backup all your Tumblr posts.
PHP
4
star
20

homebrew-brewery

Homebrew Tap
Ruby
4
star
21

docs

Public Tutorials and How-To's.
Shell
4
star
22

phpdl

A web based download manager for Linux.
PHP
4
star
23

network

Networking Library for PHP.
PHP
3
star
24

osp

Password Manager: One Shall Pass for Command-line.
Ruby
3
star
25

mpcat

Pretty Print For msgpack: Convert MessagePack'ed files to YAML.
Ruby
3
star
26

mbrew

A Package Manager for Music.
Ruby
3
star
27

wallet-cpp

A C++17 program to track your finances.
C++
3
star
28

wallet

A Ruby program to track your finances.
Ruby
2
star
29

id3dit

ID3 tags editor for the command line written in Ruby.
Ruby
2
star
30

jekyll-bigfootnotes

This plugin enables Big Footnotes for kramdown.
Ruby
2
star
31

dotfiles

[UNMAINTAINED] My dotfiles.
Shell
2
star
32

flickr-storage

Store any file at Flickr.
PHP
1
star
33

macho

PHP script for modifying Mach-O executable i386 and x86_64 files.
PHP
1
star
34

persons

A Person database using Laravel 5.4.
PHP
1
star
35

jmpdoodle

iPhone Doodle Jump hack.
Perl
1
star
36

rvm

Educational Virtual Machine written in Rust.
Rust
1
star
37

roro

Simple CLI tool for tracking work hours written in Rust.
Rust
1
star
38

storage

PHP Storage Systems
PHP
1
star
39

uninstallers

macOS Uninstallers
Shell
1
star
40

wallet-rust

A spreadsheet likewise Rust program to track your finances.
Rust
1
star
41

asm-examples

Hello World Example in GNU Assembler Syntax (GAS) under OS X 10.10 (x86_64 & i386)
Assembly
1
star
42

nagios-plugins

A collection of Nagios Plugins.
Ruby
1
star
43

dkvs

Distributed Key-Value Storage written in Rust.
Rust
1
star
44

mbdb.php

Read .mbdb files using PHP.
PHP
1
star