Mails per Postfix an PHP
Dieser Artikel erhebt keinen Anspruch auf Vollständigkeit. Eingriffe am Mailserver und bei der Rechtevergabe sind kritische Operationen. Ich übernehme keine Gewähr für die Richtigkeit dieser Aussagen und keine Gewährleistung, wenn etwas nicht funktioniert. Wer an diesen Teilen seines Server arbeitet, muss wissen was er tut.
Update vom 16.05.2007 Obwohl diese Seite konkret am Beispiel einer Confixx-Installation das Verfahren beschreibt, gilt gleiches für praktisch jede Postfix-Installation. Meist ändert sich nur der Pfad zur Aliases-Datei. Wenn jemand mit anderen MTAs hat, nehme ich Hinweise gerne hier auf.
Wozu das ganze
Manche Mails sind dazu geschaffen, automatisch bearbeitet zu werden. Dass kann zum Beispiel das Schreiben von Artikeln für ein CMS per E-Mail, mobiles Blogging oder die Vearbeitung von Supportmails sein. Ich hatte in der Vergangenheit per Cron und POP3 die Mailboxen abgegrast und entsprechende Mails verarbeitet. Das hat den Vorteil, dass man an der Postfix Konfiguration nicht arbeiten muss. Leider ist Reaktionsgeschwindigkeit auf das kleinste per Cron erreichbare Intervall beschränkt und das Script führt auch dann Abfragen durch, wenn keine neuen Daten vorliegen. Da ich eine zeitkritische Anwendung hatte, bei der die potenzielle Wartezeit von 59 Sekunden nach Empfang zu lang war, hab ich versucht die Mails per Pipe in der aliases-Tabelle an PHP weiterzugeben.
Weitergabe der empfangenen Nachricht an PHP
Postfix kann die empfangene Nachricht per Pipe an ein PHP-Scripte weiterleiten. Dazu muss das Script in einem Verzeichnis liegen, dass der User, unter dem Postfix läuft, erreichen kann. Da die Verwaltung von Nutzern, Gruppen und Rechten den Rahmen dieses Artikels sprengen würden, werde ich die Rechtevergabe nicht detaillierter erörtern. Eventuell auftauchende Probleme mit den Permissions kann man sich am besten in /var/log/mail.warn anzeigen lassen.
Durch das Update-Interval wird die aliases.db in /etc/ automatisch überschrieben. Deswegen habe ich die Weiterleitung per Pipe statisch in /root/confixx/safe/aliases_header eingetragen. Grundsätzlich kann man in der main.cf auch mehrere Hashes eintragen. Leider ist es mir nicht gelungen, diese per newaliases in eine binäre aliases.db umzuwandeln. Ich freu mich auf einen Tipp, wenn jemand weiß wie das geht.
-
# Die folgende Zeile wird an das Ende von /root/confixx/safe/aliases_header angehängt
-
web0p1: "|/home/scripts/process_mail.php"
Gestaltung des PHP-Scripts
Als erste Zeile habe ist in dem Script ein Shebang, damit das Script ausführbar ist. Die Nachricht wird per STDIN an das Script weitergegeben. Dabei handelt es sich um einen normalen Stream, der mit den bekannten File-Funktionen gelesen werden kann. Mit der decode-Methode aus der PEAR Mail_mimeDecode-Klasse ist es sehr einfach, eine Nachricht in eine Struktur zu verwandeln, aus der man dann sehr einfach Header-Felder wie den Betreff, den Text-Inhalt oder auch Attachments extrahieren kann.
-
#!/usr/bin/php
-
<?php
-
require_once('Mail/mimeDecode.php');
-
$content = '';
-
}
-
$params['include_bodies'] = true;
-
$params['decode_bodies'] = true;
-
$params['decode_headers'] = true;
-
/**
-
* Instanzierung der PEAR-Klasse und
-
* dekodieren der MIME-Nachricht
-
**/
-
$decoder = new Mail_mimeDecode($message);
-
$structure = $decoder->decode($params);
-
/**
-
* ... was immer man mit der Mail machen möchte
-
**/
-
}
-
-
?>
am 04.02.2012 #
Wo wird denn “web0p1:” definiert. Kann es leider nirgendswo finden. Ich verstehe nämlich leider nicht wie man eine bestimmte mail an einem PHP Script übergibt.
Achja, deine Aliasfile (die daraus resultierende DB-File) kannst du mittels “postmap FILE” erstellen.
Beispiel:
postmap /etc/aliases
erstellt eine aliases.db unter dem /etc/ ordner ;)
am 04.02.2012 #
Wie Du in dem Kommentar zu der Zeile sehen kannst, handelte es sich damals um eine Confixx-Installation. wep0p1 ist der Account, für den die Weiterleitung an das Script definiert wird. Das weicht also je nach Postfix-Konfiguration ab.
Es gibt verschiedene Herangehensweisen. Ich würde das heute mit transport_maps machen, so ähnlich wie es hier beschrieben wird..
Danke für den Hinweis zu der DB.