Mail Versand per SMTP auf 1&1 Linux Root Server einrichten

Ich bin auf einen neues Problem mit dem Standard-Setup der 1&1 Linux Root Server getoßen. Vor dem Umzug auf den Root Server wurde ein 1&1 Managed Homepage Server genutzt. Dieser hat keinen eigenen Mailserver installiert. Der Root Server hingegen verschickt die Mails direkt an den Empfänger und nicht wie der Managed Server über den 1&1 SMTP Server. Doch wieso ist das ein Problem?

Nun, durch das zunehmende Problem von SPAM werden bei den meisten Mailanbeitern alle Mails von Severn abgelehnt, die nicht als vertrauerswürdiger Mailserver in einer Whitelist eingetragen sind. Der eigene Root-Server ist in diesen Listen allerdings fast nie gelistet. Beim Versuch eine Mail an einen Freemailer wie z.B. GMX zu senden resultiert dann in einer Ablehnung seitens GMX. Diese sehen in der Regel wie folgt aus:

Hi. This is the qmail-send program at sXXXXXXXX.
I'm afraid I wasn't able to deliver your message to the following addresses.
This is a permanent error; I've given up. Sorry it didn't work out.

<user@gmx.de>:
XXX.XXX.XX.XXX does not like recipient.
Remote host said: 550-5.7.1 {mx087} Sorry, your helo has been denied.
550 5.7.1 ( http://portal.gmx.net/serverrules ) Giving up on XXX.XXX.XX.XXX.

Die Lösung des Problems ist die Versendung der Mail über den SMTP-Server von 1&1. Hierbei gibt es allerdings ein kleines Problem. Damit der 1&1 Mailserver nicht als SPAM-Verteiler missbraucht werden kann, muss sich das sendende Skript an diesem Server authentifizieren. Dazu ist eine beliebiege E-Mail Adresse eures Servers notwendig. Ich würde euch empfehlen dazu eine spezielle Adresse wie z.B. „websitesend@example.com“ anzulegen.

Das wäre soweit auch kein Problem, allerdings unterstützen einigen Skriptsprachen nicht von Hause aus die SMTP-Authentifizierung an einem Server. Auch PHP bietet leider keinerlei Einstellungen für die Authentifizierung. Lediglich der Mailserver kann angegeben werden, über den die Mail versendet werden soll. Die mail() Funktion von 1&1 könnt ihr also nicht verwenden.

Abhilfe schafft hier eine Mail-Klasse, die auch eine SMTP-Authentifizierung anbieten. Ich nutze schon seit längerem in allen Projekte die PHP-Klasse PHPMailer. Diese bietet auch eine SMTP-Authentifizierung. Einfache Beispiele zur Verwendung der SMTP-Authentifizierung mit PHPMailer findest ihr auch auf der Website von PHPMailer. Ein Beispiel für den Versand einer Mail über den SMTP von 1&1 könnte wie folgt aussehen:

require_once('class.phpmailer.php');
$mail = new PHPMailer();
$mail->CharSet = 'utf-8';
$mail->IsSMTP();
$mail->SMTPAuth = true;
$mail->Host = "smtp.1und1.de";
$mail->Username = "websitesend@example.com";
$mail->Password = "password_for_websitesend";
$mail->AddReplyTo('your_mail_address@example.com');
$mail->Subject = 'Subject of the mail';
$mail->AltBody = 'Text for users without a HTML mail viewer';
$mail->MsgHTML('Text for users with a HTML ready mail viewer');
$mail->AddAddress('user@gmx.de');
if(!$mail->Send()) {
	echo "Fehler beim Senden der Mail: " . $mail->ErrorInfo;
} else {
	echo "Mail wurde erfolgreich versandt!";
}

Zugegebenermaßen sind das sehr vielke Zeilen für den Mailversand einer einzelnen Mail. Aber leider ist es nicht sehr viel kürzen möglich. Damit ihr aber nicht in jedem Skript, in dem ihr eine Mail versenden möchtet, alles von neuem schreiben und bei Änderungen in jedem Skript anpassen müsst, empfiehlt es sich die Zeilen 1.8 in eine PHP-Datei zu exporieren und diese per „require“ in das Skript zu importieren, in der ihr die Mail verschicken wollt.

Die Verwendung der PHPMailer Klasse bietet aber auch ein paar Vorteile gegenüber der mail() Funktion von PHP. Ihr könnt nämlich sehr einfach weitere Empfänger hinzufügen, indem ihr die „$mail->AddAddress()“ mehrfach anwendet. Es gibt auch eine Funktion für Kopien: „$mail->AddCC()“ und blinde Kopien: „$mail->AddBCC()“ oder auch Anhänge: „$mail->AddAttachment()“. Seht euch dazu einfach mal die Liste der Methoden an.

Ich hoffe, dass euch die kleine Anleitung helfen konnte. Wenn ihr noch Anmerkungen oder Fragen habt, oder auch eine andere gute PHP-Klasse oder eine entsprechende Funktion für andere Skrtipsprachen kennt, würde ich mich über einen Kommentar sehr freuen.

Veröffentlicht von

Bernhard ist fest angestellter Webentwickler, entwickelt in seiner Freizeit Plugins, schreibt in seinem Blog über WordPress und andere Themen, treibt sich gerne bei den WP Meetups in Berlin und Potsdam herum und läuft nach Feierabend den ein oder anderen Halbmarathon.

16 Kommentare » Schreibe einen Kommentar

  1. Hallo,

    das Whitelist Problem habe ich auch. Ich habe ein Projekt mit mehreren Newsletter Empfängern, da kommt dann pro woche auch mal ein Peak mit 4000 ausgehenden Mails zustande. Ich habe meinen Server leider nicht bei 1&1, sondern bei Hosteurope. Würde mich interessieren, ob es dort auch eine solche Möglichkeit gibt über einen authentifizierten Server die Mails zu leiten.

    Lg
    Marc

    • Hallo Marc,

      soweit ich das aus den FAQ von Hosteurope sehen kann, bieten sie für die ROOT Server keinen zentralen Mailserver an. Hier muss die Mail immer über den eigenen Server verschickt werden. Eine möglichkeit wäre es, die Mails über einen eventuell vorhanden anderen Server zu verschicken. Es ist bei den meisten Mail-Servern nur notwendig, sich für den Versand zu authentifizieren. Mit welcher Adresse dann verschickt wird, ist eigentlich egal. Es wäre also z.B: möglich einen Webhosting-Account von 1&1, Strato und Co. zum Versand zu verwenden und in der PHPMailer Funktion bei $mail->AddReplyTo() und $mail->SetFrom() einfach eine Adresse des Hosteurope Servers zui nehmen. Für den Empfänger sieht es dann so aus, als würde die Mail von der Domain des Hosteurope-Servers kommen und die Antworten darauf laden auch bei der richtigen Adresse.

      Ich hoffe der Tipp konnte dir weiterhelfen.

      Gruß
      Bernhard

  2. Ich hab ein Managed Server l Packet bei 1&1.
    Und benutze ebenfalls PHPmailer. Die Sache ist egal welchen Code ich benutze ich bekomme immer ähnliche Fehlermeldungen :

    Warning: require_once(class.phpmailer.php) [function.require-once]: failed to open stream: No such file or directory in /homepages/29/d109817456/htdocs/Formulare/reck/core.php on line 74

    Fatal error: require_once() [function.require]: Failed opening required ‚class.phpmailer.php‘ (include_path=‘.:/usr/lib/php5′) in /homepages/29/d109817456/htdocs/Formulare/reck/core.php on line 74

    Die Fehlermeldung habe ich jetzt mit deinem Code bekommen.

    Warning: require(…/phpmailer/class.phpmailer.php) [function.require]: failed to open stream: No such file or directory in /homepages/29/d109817456/htdocs/Formulare/reck/core.php on line 75

    Fatal error: require() [function.require]: Failed opening required ‚…/phpmailer/class.phpmailer.php‘ (include_path=‘.:/usr/lib/php5′) in /homepages/29/d109817456/htdocs/Formulare/reck/core.php on line 75

    die fehlermeldung mit meinem Code.

    ICh schließe mal daraus, Dass das Script nicht auf class.phpmailer.php zugreifen kann.

    kannst du mir vlt ein Tipp geben wie ich den PHPmailer richtig installiere?

    • Wenn du einen Managed Server hast, denn solltest du PHPMailer auch ohne SMTP einsetzen können. Zumindest habe ich das zuvor auf unserem 1&1 Managed Servr so tun können.

      Der Fehler bei dir liegt daran, dass er die Datei class.phpmailer.php nicht finden kann. Um den PHPMailer nutzen zu können, musst du das Paket runterladen und in einen Ordner entpacken. Anschließend musst du relativ oder absolut den Speicherort der Datei class.phpmailer.php angeben.

      Wie ich anhand deiner Fehlermeldungen sehen kann, versuchst du die Datei per require_once() innerhalb des Ordners Formulare/reck einzubinden. Ist die Datei class.phpmailer.php auch in diesem Verzeichnis vorhanden? Wenn nicht, dann gibt einfach den korrekten Pfad an. Ich nutze in der Regel die „PHP-Variable“ $_SERVER[‚DOCUMENT_ROOT‘], die auf das ROOT-Verzeichnis des Webauftritts verweist. In deinem Fall also auf „/homepages/29/d109817456/htdocs/“.

      Ich würde dir also vorschlagen, alle Dateien des PHPMailer z.B. in ein Verzeichnis „phpmailer“ auf dieser höchsten Ebene zu entpacken. Anschließend kannst du die Datei mit dem Befehl

      require_once($_SERVER['DOCUMENT_ROOT']
      .'/phpmailer/class.phpmailer.php');

      in dein Skript core.php einbinden.

  3. Hallo,

    ich habe einen Webhosting-Paket bei 1und1 „1&1 Home 5.0“. Ich nutze ebenfalls die neuste Version vom PHPMailer und bin deiner obigen Anleitung gefolgt. Jedoch gibt er mir folgenden Fehler zurück:
    >>
    SMTP Error: Could not connect to SMTP host. Message could not be sent.

    Mailer Error: SMTP Error: Could not connect to SMTP host.
    <<
    Ich habe eine E-Mail Adresse bei 1&1 im Paket angelegt und die entsprechenden Daten ins Skript eingefügt.

    Hast du eine Idee, das Problem zu lösen?
    Vielen Dank im Voraus!

    • Ich vermute, dass etwas mit den Daten, die du im PHPMailer eingetragen hast nicht stimmt. Versuche mal die Daten in einem E-Mail-Programm wie z.B: Outlook oder Thunderbird zu testen. Dabei stellst du dann vermutlich fest, woran es liegen könnte.

      Bei einem einfachen Hosting-Paket solltest du die Mails aber direkt verschicken können, ohne explizit den SMTP-Server zu konfigurieren. Verusche einfach mal, die Parameter für den STMP-Versand weg zu lassen.

  4. Das ist mein Code – habe gerade das Postfach bei Outlook eingerichtet! Es funktioniert!

    require("class.phpmailer.php");

    $mail = new PHPMailer();
    $mail->CharSet = 'utf-8';
    $mail->IsSMTP();
    $mail->SMTPAuth = true; // set mailer to use SMTP
    $mail->Host = "smtp.1und1.de"; // specify main and backup server
    // turn on SMTP authentication
    $mail->Username = "kostenvoranschlag@barth-umzuege.de"; // SMTP username
    $mail->Password = "*******"; // SMTP password
    $mail->AddReplyTo('mail@marcoberndt.de');
    $mail->From = "kostenvoranschlag@barth-umzuege.de";
    $mail->FromName = "Barth Umzuege";
    $mail->AddAddress("mail@marcoberndt.de");

    $mail->IsHTML(true); // set email format to HTML

    $mail->Subject = "Kostenvoranschlag";
    $mail->AltBody = 'Text for users without a HTML mail viewer';
    //$mail->Body = $_SESSION['post_content'];
    $mail->MsgHTML($_SESSION['post_content']);
    //$mail->AltBody = "This is the body in plain text for non-HTML mail clients";

    if(!$mail->Send())
    {
    echo "Message could not be sent. ";
    echo "Mailer Error: " . $mail->ErrorInfo;
    exit;
    }

    echo "Message has been sent";

    • Versuche mal die Mail nicht per STMP sondern direkt zu verschicken. Kommentiere dazu einfach alles von Zeile 5 („$mail->IsSMTP();“) bis Zeile 10 („$mail->Password…“) aus. Das sollte bei einem einfachen 1&1 Hosting Paket funktionieren.

  5. Habe ich gerade so gemacht!

    Folgender Fehler wird ausgegeben:
    Mail Funktion konnte nicht initialisiert werden. Message could not be sent.

    Mailer Error: Mail Funktion konnte nicht initialisiert werden.

  6. Mhh … jetzt bin ich bei folgender Fehlermeldung:

    Could not execute: /usr/sbin/sendmail Message could not be sent.Mailer Error: Could not execute: /usr/sbin/sendmail

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert