E-Mail

Die E-Mail1 ist zum einen ein System zur computerbasierten Verwaltung von briefähnlichen Nachrichten und deren Übertragung über Computernetzwerke, insbesondere über das Internet. Zum anderen werden auch die auf diesem elektronischen Weg übertragenen Nachrichten selbst als E-Mails bezeichnet.

Mail-Klasse

Mit Hilfe der Mailklasse \Alvine\Net\Mail\Mail lässt sich eine E-Mail zusammenstellen und per SMTP-Client versenden. Alternativ kann die Hilfsmethode \Alvine\Net\Mail\Mail::send() direkt verwendet werden. Diese erstellt einen SMTP-Client und versendet sich selber mit diesem Client.

// Neue Mail erstellen
$mail=new \Alvine\Net\Mail\Mail();

$to=$to??'[email protected]';
$from=$from??'[email protected]';
$mailserver=$mailserver??'smtp.example.com';
$client=$client??'me.example.com'; // Name des clients
$port=$port??25;

/**
 * Mailparameter übergeben und mit dem 
 * Standard SMTP-Client versenden
 */
try {

    $mail->addTo($to)
        ->setFrom($from)
        ->setSubject('Testmail')
        ->addAlternativeParts('<html>', 'plain')
        ->send($mailserver, $port, $client);
} catch(\Alvine\Net\Mail\SMTPClientException $e) {
    echo "Exception: ".$e->getMessage();
}

Will man ein Log der Serverkommunikation, so kann man diese mit einem Logger mitschneiden.

// Neue Mail erstellen
$mail=new \Alvine\Net\Mail\Mail();

$to=$to??'[email protected]';
$from=$from??'[email protected]';
$mailserver=$mailserver??'smtp.example.com';
$client=$client??'me.example.com';
$port=$port??25;
// TESTWERTE NICHT FÜR DOKU

/**
 * Mailparameter übergeben und mit dem 
 * Standard SMTP-Client versenden
 */
try {

    // Handler
    $handler=new \Alvine\Util\Logging\Handler\Memory();

    // Logger
    $logger=\Alvine\Util\Logging\Logger::getInstance(\Alvine\Util\Logging\LoggerDefaultName::MESSAGE);
    $logger->addHandler($handler);
    $handler->setThreshold(\Alvine\Util\Logging\Level::ALL);

    $mail->addTo($to)
        ->setFrom($from)
        ->setSubject('Testmail')
        ->addAlternativeParts('<html>', 'plain')
        ->send($mailserver, $port, $client);

    // Ausgabe der Logdaten
    echo $handler->getBuffer();
    // Ergebnis -> Dies ist ein Log-Trace und eine Log-Debug Zeile!
} catch(\Alvine\Net\Mail\SMTPClientException $e) {
    echo "Exception: ".$e->getMessage();
}

Das Ergebnis aus dem Logger ist dann in etwa so:

220 mailhog.example ESMTP MailHog
EHLO mailhog
250-Hello mailhog
250-PIPELINING
250 AUTH PLAIN
MAIL FROM:<[email protected]>
250 Sender [email protected] ok
RCPT TO:<[email protected]>
250 Recipient [email protected] ok
DATA
354 End data with <CR><LF>.<CR><LF>
Date: 11 Sep 2019 18:00:37 +0000
From: [email protected]
Reply-To: [email protected]
Subject: Testmail
To: [email protected]
Message-ID: <ca24d237-518d-4cd7-acd1-007ca4d72ada@1f4cd243>
MIME-Version: 1.0
Content-Type: MULTIPART/alternative; BOUNDARY="8323329-704665374-1568224837=:1889"

--8323329-704665374-1568224837=:1889
Content-Type: TEXT/plain; CHARSET=UTF-8
Content-Transfer-Encoding: QUOTED-PRINTABLE

plain
--8323329-704665374-1568224837=:1889
Content-Type: TEXT/html; CHARSET=UTF-8
Content-Transfer-Encoding: QUOTED-PRINTABLE

<html>
--8323329-704665374-1568224837=:1889--

.
250 Ok: queued as psjB0TUNhB61XKXQtlVmh4oBCiRZX9CZ-II9oTIBjCY=@example
QUIT
221 Bye

SMTP

SMTP2 ist ein Protokoll der Internetprotokollfamilie, das zum Austausch von E-Mails1 in Computernetzen dient. Es wird dabei vorrangig zum Einspeisen und zum Weiterleiten von E-Mails verwendet. Zum Abholen von Nachrichten kommen andere, spezialisierte Protokolle wie POP3 oder IMAP zum Einsatz.

SMTP-Server nehmen traditionell Verbindungen auf Port 25/TCP (Standard-MTA) entgegen. Auf Port 465/TCP nur mit SSL/TLS und auf Port 587/TCP nur als MSA/für Mail-Clients, häufig mit STARTTLS.

SMTP-Client

Mit Hilfe des SMTP-Clients lassen sich E-Mails über das SMTP Protokoll versenden.

// Neue Mail erstellen
$mail=new \Alvine\Net\Mail\Mail();
/**
 * mail initialisieren
 */
$mailserver=$mailserver??'smtp.example.com';
$client=$client??'me.example.com'; // Name des clients
$port=$port??25;



$smtp=new \Alvine\Net\Mail\SMTPClient($mailserver, $port);
/** Absendender Host */
$smtp->setHostname($client);

try {
    $smtp->enableLogging()
        ->sendMail($mail);
} catch(\Exception $e) {
    // Fehlerbehandlung
}

echo $smtp->getLog();

Beim Versand einer E-Mail, muss in der EHLO/HELO Begrüßung ein gültiger Hostname stehen. Aus der Spezifikation RFC5321:

In the EHLO command, the host sending the command identifies itself; the command may be interpreted as saying "Hello, I am " (and, in the case of EHLO, "and I support service extension requests").

The domain name given in the EHLO command MUST be either a primary host name (a domain name that resolves to an address RR) or, if the host has no name, an address literal, as described in Section 4.1.3 and discussed further in the EHLO discussion of Section 4.1.4.*

Im Standard wird die PHP-Methode gethostname() verwendet. In Containern oder lokalen Installationen wird hier oft ein nicht im DNS auflösbarer Name wie localhost zurückgegeben. In diesen Fällen muss man mit der Methode \Alvine\Net\Mail\SMTPClient::setHostname(string $name) einen gültiger Domainname setzen.


  1. kurz Mail; engl. electronic mail für „elektronische Post“ oder E-Post 

  2. Das Simple Mail Transfer Protocol