E-Mails mit WordPress versenden

Wenn man mit PHP eine E-Mail versenden möchte kann man natürlich auf die interne mail-Funktion zurückgreifen. Diese Funktion ist allerdings sehr grundlegend und häufig fehlen die nötigen Voraussetzungen auf dem System.

Einen Ausweg bieten PHP-Frameworks wie z.B. Zend, CodeIgniter oder Symfony, die eine bequeme API anbieten.

WordPress ist zwar kein allgemeines PHP-Framework wie die oben genannten Beispiele, aber es enthält eine Fülle von Funktionen, die bei der Programmierung von Plugins von Hilfe sein können. So gibt es natürlich auch eine Funktion, die das Versenden von E-Mails ermöglicht.


Diese Funktion trägt den Namen wp_mail() und ist in der Datei .../wp-includes/pluggable.php definiert.

Die Funktion wp_mail

Im Codex ist die formale Definition von wp_mail() beschrieben:

 < ?php wp_mail( $to, $subject, $message, $headers, $attachments ); ?>

Die Parameter haben dabei folgende Bedeutung:

$to

Empfänger der Mail. Es kann mehr als ein Empfänger angegeben werden, indem man ein Array oder ein Liste mit komma-getrennten Namen angibt.

$subject

Ein String, der das Betreff der Mail enthält.

$message

Dieser String enthält den Inhalt der Mail.

$headers

Header, die mit der Mail mitversand werden sollen (optional).

$attachments
Anhänge, die mit der Mail versand werden sollen (optional).

Hello world!

Die einfachste Möglichkeit eine Mail zu versenden sieht dementsprechend folgendermaßen aus:

 wp_mail('ich@beispiel.net', 'Hallo Welt', 'Hört mich jemand?');

Eine Mail per WordPress-API ist also ganz einfach. Auf den ersten Blick fällt allerdings auf, dass es keinen Parameter für die Mailadresse des Absenders gibt. Auf den zweiten Blick, dass kein SMTP-Host für den Versand der Mail angegeben werden kann.
Als Absendername wird “WordPress” und Absenderadresse wordpress@servername als Vorgabe genommen und ein evtl. “www” entfernt:

$from_name = 'WordPress';

$sitename = strtolower( $_SERVER['SERVER_NAME'] );
if ( substr( $sitename, 0, 4 ) == 'www.' ) {
    $sitename = substr( $sitename, 4 );
}

Die Angaben des SMTP-Hosts und des Ports werden aus der php.ini übernommen. Diese sollten auf dem WordPress-System also korrekt gesetzt sein.

Anpassen der Vorgaben

Wie eben beschrieben werden alle Mails mit vorgegebenen Werten für den Absendernamen und die Absenderadresse verschickt. Will man diese Angaben ändern, müssen entsprechende Filterfunktionen benutzt werden.

Ändern des Absendernamens:

add_filter('wp_mail_from_name', 'my_name');

function my_name() {
  return 'Latz';
}
Ändern der Absenderadresse:

add_filter('wp_mail_from', 'my_address');

function my_name() {
  return 'Latz@wp.de';
}
Eine weitere Möglichkeit Absendernamen und -adresse zu ändern ist die direkte Modifizierung des Mailheaders:

$headers = 'From: Latz ' . "rn";
wp_mail('ich@beispiel.net', 'Hallo Welt', 'Hört mich jemand?', $headers);

Des weiteren gibt es noch die Filter wp_mail_charset und wp_mail_content_type, die genau wie oben benutzt werden.

Als letztes existiert noch ein Filter (wp_mail_original_content), mit dem man den Inhalt der Email verändern kann, die erstellt wird, wenn man einen Artikel per Email sendet.

Anhänge

Natürlich ist es auch möglich auf einfache Weise eine oder mehrere Anhänge zu verschicken. Dazu muss an die wp_mail-Funktion ein Array mit Dateinamen übergeben werden:

$anhang = array(WP_CONTENT_DIR . '/uploads/anhang.zip');
wp_mail('ich@beispiel.net', 'Hallo Welt', 'Hört mich jemand?', $anhang);

Rückgabewert

Die Funktion gibt als Rückgabe einen Bool-Wert zurück. Das bedeutet allerdings nicht, dass beim Rückgabewert “TRUE” die Mail versandt und insbesondere nicht, dass sie empfangen wurde. Er bedeutet lediglich, dass sie korrekt an den SMTP-Host übergeben wurde, was danach mit der Mail passiert kann vom Skript nicht mehr kontrolliert werden.


Comments

2 responses to “E-Mails mit WordPress versenden”

  1. danke suche schon längere zeit eine möglichkeit mit WordPress mails zu versenden

  2. Danke für den Artikel.
    Damit ist es nun recht einfach möglich, einen Newsletterversand für mein AVZ anzubieten. Denn ich könnte zwar auch ein Mailtool nutzen, aber für manche Dinge möchte ich einfach ein internes Tool.

Leave a Reply

Your email address will not be published. Required fields are marked *