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()open in new window.

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 und Return-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 Maileropen in new window ist heute (Stand: Nov 2022) die de-facto Standard Library für den Versand von E-Mails via PHP. Auch Laravel frameworkopen in new window ist seit Laravel 9 im Dezember 2021 vom ehemaligen SwitftMaileropen in new window auf Symfony Mailer umgestiegen.

⭐ Empfohlene Methode!

Wir empfehlen dir, Symfony Maileropen in new window für den komfortablen und sicheren Versand von E-Mails in jedem PHP-Projekt zu verwenden. Du brauchst dazu nicht zwingend etwas von Symfonyopen in new window oder Laravelopen in new window 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 Composeropen in new window:

$ 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 Mailgunopen in new window oder SendGridopen in new window wechseln kannst.

Beachte dazu die Symfony Mailer Doku Transport Setupopen in new window. Wir verwenden eine DSNopen in new window 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.

Zuletzt aktualisiert: