RSS Feed

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

Veröffentlich am Donnerstag, 5. Nov 2009 in Webserver

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.

  • Twitter
  • email
  • RSS
  • Facebook
  • MySpace
  • Google Bookmarks
  • MisterWong.DE
  • del.icio.us
  • LinkArena
  • Digg
  • Sphinn
  • Mixx
  • Reddit
  • Slashdot
  • Yigg
  • Technorati

Hinterlasse einen Kommentar

  1. Marc sagt:

    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

    • Bernhard sagt:

      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. Pettajam sagt:

    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?

    • Bernhard sagt:

      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.

Hinterlasse einen Kommentieren

Impressum