Georg: eMail piping per PHP-Script simulieren

Hallo,

es ist soweit - selbst am WE verfolgt mich meine Arbeit…

Ein (eingekauftes) Script erhält Informationen indem es selbige aus E-Mail übernimmt. Dieses funktioniert so indem eine eingehende E-Mail direkt an dieses Script gesendet wird. Dieses widerrum erfolgt in der Regel per eMail-Piping (wunderbar einfach unter cPanel einstellbar) - nur leider gibt es unter der bei uns eingesetzen Administrationsoberfläche (Plesk) diese Funktionalität (eingehende E-Mails an Script senden) nicht.

Mein Versuch dieses via .qmail-File manuell einzurichten und so Plesk (zumindest für ein Postfach) zu umgegehen schlagen fehl, da es hier zu einem Rechtekonfikt kommt.

Also bin ich folgende Alternativlösung angegangen: PHP-Script wird per Cron aufgerufen und liesst die Mails aus und übergibt selbige an das eigentliche "Einlesescript".

Nun bin ich soweit das ich eine Konnektion zum Postfach aufbaue… Und hier verließen sie mich 😟:

1.) Muss ich wirklich erst alle Header-Elemente und dann den Body der Mail seperat einlesen oder gibt es eine Möglichkeit eine Nachricht "on-Block" komplett in einen String zu lesen?

2.) Wie übergebe ich die Daten an das "Einlesescript"? Da dieses die Daten per php://stdin einliesst, wäre doch eingentlich richtig einen Stream in der Art php://stdout zu senden, aber wie an die Datei??? (kann auch sein das ich zu viel oder zu wenig Kaffee gerade habe...)

Ich hoffe irgendwer versteht meine Denk- und Schreibweise…

LG Georg

  1. 2.) Wie übergebe ich die Daten an das "Einlesescript"? Da dieses die Daten per php://stdin einliesst, wäre doch eingentlich richtig einen Stream in der Art php://stdout zu senden, aber wie an die Datei??? (kann auch sein das ich zu viel oder zu wenig Kaffee gerade habe...)

    Mit der Funktion popen kannst du schreibenden Zugriff auf den stdin-Stream des anderen Skripts erlangen.

    1.) Muss ich wirklich erst alle Header-Elemente und dann den Body der Mail seperat einlesen oder gibt es eine Möglichkeit eine Nachricht "on-Block" komplett in einen String zu lesen?

    Und mit stream_copy_to_stream kannst du zwei Streams direkt miteinander verknüpfen.

    1. Hallo nochmal,

      zuerst vielen Dank für die hilfreiche Antwort.

      Aber jetzt stehe ich leider (trotz lesen der Doku) noch ein wenig mehr auf dem Schlauch… Ich öffne per imap_open die Verbindung zur Mailbox (POP3), lese dann die Anzahl der Nachrichten aus und laufe dann per Schleife über die einzelnen Nachrichten.

      Wenn ich dich und die Doku richtig verstehe müsste ich ja jetzt imap_header und imap_body verbinden:

      $a = imap_header($imap, $index + 1); $b = imap_body($imap, $index + 1); stream_copy_to_stream($a,$b);

      Damit hätte ich in $b die jw. komplette Mail. Dann müsste ich ja mit popen die Zieldatei öffnen:

      $ziel = popen("pfad/zur/zieldatei.php", "r"); print $b; (<- wäre das korrekt?) pclose($ziel);

      Wäre das so korrekt? (Kann das erst morgen live testen und wollte schon mal vorfühlen ob ich wenigens grob die richtige Richtung habe...)

      Viele Grüße Georg