28 lines
1.2 KiB
PHP
28 lines
1.2 KiB
PHP
<?php
|
|
// Minimaler SMTP-Server für Tests: php smtp_server.php <port> <logdatei>. Nimmt jede Mail an und schreibt "MAIL <empfänger>" ins Log.
|
|
$port = (int) ($argv[1] ?? 0);
|
|
$log = (string) ($argv[2] ?? '');
|
|
$srv = stream_socket_server("tcp://127.0.0.1:$port", $errno, $errstr);
|
|
if (!$srv) { fwrite(STDERR, "Server nicht gestartet: $errstr\n"); exit(1); }
|
|
file_put_contents($log, "READY\n", FILE_APPEND);
|
|
while ($c = @stream_socket_accept($srv, 120)) {
|
|
stream_set_timeout($c, 10);
|
|
fwrite($c, "220 test ESMTP\r\n");
|
|
$to = '';
|
|
$data = false;
|
|
while (($line = fgets($c)) !== false) {
|
|
$l = rtrim($line, "\r\n");
|
|
if ($data) {
|
|
if ($l === '.') { $data = false; file_put_contents($log, "MAIL $to\n", FILE_APPEND); fwrite($c, "250 queued\r\n"); }
|
|
continue;
|
|
}
|
|
$u = strtoupper($l);
|
|
if (str_starts_with($u, 'EHLO')) fwrite($c, "250 test\r\n");
|
|
elseif (str_starts_with($u, 'RCPT TO:')) { $to = trim(substr($l, 8), ' <>'); fwrite($c, "250 ok\r\n"); }
|
|
elseif ($u === 'DATA') { $data = true; fwrite($c, "354 go\r\n"); }
|
|
elseif ($u === 'QUIT') { fwrite($c, "221 bye\r\n"); break; }
|
|
else fwrite($c, "250 ok\r\n");
|
|
}
|
|
fclose($c);
|
|
}
|