E-Mail Versand via PHP
PHP mail()
Die einfachste Art, eine E-Mail in PHP zu versenden, ist noch immer via nativer PHP-Funktion mail().
ACHTUNG
Beim Versand via mail()
ist Vorsicht geboten!
- Vergewissere dich, dass keinerlei ungefilterte Eingabe-Daten (beispielsweise aus
$_GET
oder$_POST
) dem vierten Parameter$additional_headers
übergeben werden. Dieser kann für Spamming missbraucht werden! - Achte dich darauf, dass stets
From
undReturn-Path
korrekt im Parameter$additional_headers
definiert sind. Ansonsten wird die E-Mails unter Umständen vom Spam-Filter des Empfängers abgeblockt.
Wir empfehlen dir, auch weitere Headers in $additional_headers
zu setzen. Folgendes Beispiel gilt als empfohlene Vorlage:
<?php
$to = 'recipient@example.com';
$from = 'sender@example.com';
$subject = 'Testmail 1';
$message = <<<EOD
Hi there
This is just an example email body from $from
Bye-Bye!
EOD;
$headers = [
'From' => $from,
'Reply-To' => $from,
'X-Mailer' => 'PHP/' . phpversion(),
'Return-Path' => $from,
'MIME-Version' => '1.0',
'Content-Type' => 'text/plain; charset=utf-8',
'Content-Transfer-Encoding' => '8bit',
'X-Priority' => '3',
];
mail($to, $subject, $message, $headers);
Symfony Mailer
Symfony Mailer ist heute (Stand: Nov 2022) die de-facto Standard Library für den Versand von E-Mails via PHP. Auch Laravel framework ist seit Laravel 9 im Dezember 2021 vom ehemaligen SwitftMailer auf Symfony Mailer umgestiegen.
⭐ Empfohlene Methode!
Wir empfehlen dir, Symfony Mailer für den komfortablen und sicheren Versand von E-Mails in jedem PHP-Projekt zu verwenden. Du brauchst dazu nicht zwingend etwas von Symfony oder Laravel zu verstehen. Diese Library lässt sich auch völlig unabhängig von einem PHP-Framework verwenden und ist einfach einzurichten.
Eine gute Anleitung zur Framework-unabhängigen Verwendung von Symfony Mailer findest du hier:
oder beachte einfach unser unten stehendes Beispiel ...
Installiere Symfony Mailer via Composer:
$ composer require symfony/mailer
Eine E-Mail lässt sich nun wie folgt aufbauen und via SendmailTransport
(analog PHP mail()) versenden:
<?php
use Symfony\Component\Mailer\Mailer;
use Symfony\Component\Mailer\Transport\SendmailTransport;
use Symfony\Component\Mime\Address;
use Symfony\Component\Mime\Email;
require __DIR__ . '/vendor/autoload.php';
$to = 'recipient@example.com';
$from = 'sender@example.com';
$fromName = 'Hans Muster';
$subject = 'Testmail 1';
$message = <<<EOD
Hi there
This is just an example email body from $from
Bye-Bye!
EOD;
$email = (new Email())
->from(new Address($from, $fromName))
// ->from($from)
->to($to)
//->cc('cc@example.com')
//->bcc('bcc@example.com')
//->replyTo('fabien@example.com')
//->priority(Email::PRIORITY_HIGH)
->subject($subject)
->text($message);
$transport = new SendmailTransport();
$mailer = new Mailer($transport);
$mailer->send($email);
Wir empfehlen dir jedoch, die E-Mails via unseren SMTP-Server smtp.onlime.ch
zu versenden, da dies die verlässlichere Methode ist und du damit in Zukunft auch einfach auf einen anderen Anbieter wie Mailgun oder SendGrid wechseln kannst.
Beachte dazu die Symfony Mailer Doku Transport Setup. Wir verwenden eine DSN zur Konfiguration. Mache folgende Änderungen an oben stehendem Beispiel, um SMTP als Transport anstatt SendmailTransport
zu verwenden:
-use Symfony\Component\Mailer\Transport\SendmailTransport;
+use Symfony\Component\Mailer\Transport;
// ...
-$transport = new SendmailTransport();
+$transport = Transport::fromDsn('smtp://user:pass@smtp.example.com:port');
Hier das komplette Beispiel:
<?php
use Symfony\Component\Mailer\Mailer;
use Symfony\Component\Mailer\Transport;
use Symfony\Component\Mailer\Transport\SendmailTransport;
use Symfony\Component\Mime\Address;
use Symfony\Component\Mime\Email;
require __DIR__ . '/vendor/autoload.php';
// $dsn = 'smtp://user:pass@smtp.example.com:port';
$dsn = 'smtp://demo@deine-domain.ch:PASSWORD@smtp.onlime.ch:465';
$to = 'recipient@example.com';
$from = 'sender@example.com';
$fromName = 'Hans Muster';
$subject = 'Testmail 1 via SMTP';
$message = <<<EOD
Hi there
This is just an example email body from $from
Bye-Bye!
EOD;
$email = (new Email())
->from(new Address($from, $fromName))
->to($to)
->subject($subject)
->text($message);
$transport = Transport::fromDsn($dsn);
$mailer = new Mailer($transport);
$mailer->send($email);
👏 That's it! Du kannst nun ganz einfach E-Mails via SMTP versenden und den Transport jederzeit durch eine andere Implementierung ersetzen.