Auswertung von Mailinhalten

Moin Moin,
aktuell suche ich nach einer Herangehensweise, um Mail-Betreffs und Inhalte von eingehenden Mails auswerten zu können.

Auswertung:

  • Betreff

  • Wertigkeit Prüfen
    -> Nicht eingegangen - 0
    -> Error - 1
    -> Success - 2

  • Mit der Auswertung sollen die entsprechenden Daten in einem Array hinterlegt werden, um anschließend die ausgewerteten Mails an Ordner A oder Ordner B zuschicken. Falls keine Mail eingegangen ist(wo an dieser stelle, die Information aus dem Array greifen soll), sollte eine Mail mit dem entsprechenden Inhalt an eine bestimmte Person geschickt werden.

Das Ganze soll nun über IP-SymCon/PHP realisiert werden.
Bisherige Ansätze sind:

  • via POP3 die Mails abfangen und anschließend in einem Skript die Mails auszuwerten.

Meine Hauptanliegen aktuell:

  • Wie schaffe ich es, Mails über ein PHP Skript aus der „E-Mail, Receive (POP3)“ auszuwerten.
  • Wie kann ich die ausgewerteten Mails weiterschicken
  • Wie kann ich bei nicht eintreten einer Mail aus dem Skript heraus eine Info an eine Person schicken.

In der Hoffnung, dass ich hier den richtigen Platz für meine Frage gefunden habe, danke ich schon mal für jeden Support.

//Grundkenntnisse in PHP und noch keine Erfahrungen im Umgang mit IPS [eine andere Umsetzung als IPS ist keine Option]
Ich bin mir unsicher, ob dies Schaltbefehle per E-Mail an IP-Symcon schicken bereits eine Grundlage liefert oder ob ich da eine andere Herangehensweise braucht.

Hallo,

ich habe zwar keinen Abruf via POP3 sonder IMAP, aber das dürfte ähnlich sein.

Unsere Abfallentsorger schickt am Tag vor der Entsorgung eine Mail, die ich dann auswerte und in eine von drei Variablen (graue/gelbe/blaue Tonne) das angekündigte Datum einsetze.

Er geht alle Nachrichten durch und in jeder Nachricht alle Zeilen um da ein bestimmtes Muster zu erkennen („xx.xx.xxxx Abfuhr graue Tonne“).

Nach erfolgreicher Verarbeitung dieser Nachricht wird diese gelöscht.

Getriggert wird das Script bei einer Änderung der Variable „ungelesenen Nachricht“ der Instanz „IMAP-Abruf“.


<?php

declare(strict_types=1);

$scriptName = IPS_GetName($_IPS['SELF']) . '(' . $_IPS['SELF'] . ')';
$scriptInfo = IPS_GetName(IPS_GetParent($_IPS['SELF'])) . '\\' . IPS_GetName($_IPS['SELF']);

$inbox = IMAP_GetCachedMails(17633);
foreach ($inbox as $item) {
    $subject = $item['Subject'];
    $uid = $item['UID'];
    $date = date('d.m.Y H:i:s', $item['Date']);
    IPS_LogMessage($scriptName, $scriptInfo . ': Mail #' . $uid . ' von ' . $date . ': "' . $subject . '"');

    $msg = IMAP_GetMailEx(17633, $uid);
    $text = $msg['Text'];
    $lines = explode("
", $text);

    $n = 0;
    $goodcount = 0;
    $failcount = 0;
    foreach ($lines as $line) {
        $r = preg_replace('/^- [^,]*, ([0-9\.]*) Abfuhr ([A-Za-z]*).*$/', '$1;$2', $line);
        if ($r != $line) {
            $vals = explode(';', $r);
            switch (strtolower($vals[1])) {
                case 'grau':
                    $oid = 25592;
                    break;
                case 'gelb':
                    $oid = 39213;
                    break;
                case 'blau':
                    $oid = 39628;
                    break;
                default:
                    $oid = '';
                    break;
            }
            if ($oid) {
                $ts = intval(strtotime($vals[0]));
                SetValueInteger($oid, $ts);
                IPS_LogMessage($scriptName, $scriptInfo . ':  ... decoded line #' . $n . ' "' . $line . '"');
                $goodcount++;
            } else {
                echo 'unable to decoded line #' . $n . ' "' . $line . '"' . "
";
                $failcount++;
            }
        }
        $n++;
    }

    if ($goodcount && !$failcount) {
        Imap_DeleteMessage(17633, $uid);
    }
}

demel

Hallo demel,
ich bin bei der Suche nach Mails für die Müllabfuhr auswerten über deinen Beitrag gestolpert und versuche nun dieses Skript für mich anzupassen.
Einiges habe ich schon enträtseln können, nur der „case-Abschnitt“ mit den 3 Variablen ist mir nicht klar: Welchen Datentyp müssen diese Variablen haben? String? Und was ich auch nicht ganz verstehe: Die Variable „$oid“ bekommt den Wert aus der selbst angelegten Variable zugeteilt - sollte nicht die angelegte Variable den Wert aus „$oid“ erhalten?

Kannst du mit bitte ein bisschen auf die Sprünge helfen, wäre dir sehr dankbar.

LG. Werner

„oid“ steht für Objekt ID.
Also ein Objekt aus dem Symcon Objektbaum.
Das sind hier Integer Variablen, welche mit dem Zeitstempel aus der Email befüllt werden.
Die drei möglichen Werte von oid sind somit die drei Objekt IDs der drei Integer Variablen für graue, gelbe und blaue Tonne.
Michael

Der Antwort von @Nall-chan ist wie immer nichts hinzuzufügen :slight_smile:

Der Datentyp dieser Variablen ist ein ~UnixTimestamp, der mit dem Codefragment
$ts = intval(strtotime($vals[0]));
aus dem Mailtext gelesen wird.
Ich habe also ein Datum für jede der 3 Leerungen (wir haben grau=Restmüll, gelb=Wertstoff, blau=Papier).

Leider habe ich keine Mail zur Hand, da die nach Abruf gelöscht wird und nur alle 14 Tage kommt.

Wenn Du Problem mit der Dekodierung deines Mailtextes hat, kannst Du mir ein Beispiel auch gerne schicken, dann kann ich sehen, was sich machen lässt.

Nachtrag: ich habe Logeinträge gefunden, aus denen ein Fragment der Mail erkennbar ist

14.05.2024 07:54:49 | 00000 | CUSTOM  | Mail von USB (Müllabfuhr) auswerten(42058) | administrative Aktivitäten\Mail von USB (Müllabfuhr) auswerten: Mail #150 von 14.05.2024 07:51:09: "USB Abfuhrtermin"
14.05.2024 07:54:49 | 00000 | CUSTOM  | Mail von USB (Müllabfuhr) auswerten(42058) | administrative Aktivitäten\Mail von USB (Müllabfuhr) auswerten:  ... decoded line #5 "- Mittwoch, 15.05.2024 Abfuhr Grau - Restmüll"
14.05.2024 07:54:49 | 00000 | CUSTOM  | Mail von USB (Müllabfuhr) auswerten(42058) | administrative Aktivitäten\Mail von USB (Müllabfuhr) auswerten:  ... decoded line #6 "- Mittwoch, 15.05.2024 Abfuhr Gelb - kombinierte Wertstofftonne"

Danke ihr zwei - dann werde ich mal weiterbasteln…

LG. Werner

Hallo demel42,

danke für deine Erläuterungen, aber leider ist PHP nicht so das meine und ich habe wahrscheinlich einen oder mehrere große Denkfehler.

Was habe ich gemacht:

Dein Skript kopiert und eingefügt (danke für die Bereitstellung)
Die IDs von IMAP_GetCachedMails / IMAP_GetMailEx / Imap_DeleteMessage auf die ID von meiner IMAP-Instanz geändert
3 Integer-Variablen angelegt und denen das Profil "Unix Timestamp" gegeben (die Variablen sind logischweise leer, bzw 0)
hinter den "case" die Namen auf den Text wie er in meinem Mail steht umgeändert (ich habe auch die Variablen gleich benannt, wie der Text im Mail von meinem Müllentsorger)
Statt dem Wort "Abfuhr" ein fixes Wort aus dem Mail meines Müllentsorgers genommen (Schönblickweg)
Den Cache meiner IMAP-Instanz manuell aufgefrischt (ich habe gerade gestern ein Müllmail bekommen, welches noch im Posteingang meines Accounts ist)
Das Skript manuell ausgeführt

Was ist passiert:

Das Skript läuft ewig (ca. 10 Sekunden) - ich glaube, dass das schon nicht sein darf
Es hört dann ohne Fehlermeldung auf, aber es füllt auch keine Variablen oder sonstiges

So schaut der Text der Mail von meinem Müllentsorger aus:

Abholtermin 16.05.2024, Schönblickweg 8, Restabfall, Kunststoff. Ihre IKB

Zur Erklärung des Textes: bei uns wird jede Woche der Restabfall abgeholt und dann die Woche darauf einmal Kunststoff und ein anderesmal Altpapier.

Wäre total froh, wenn du mir noch ein bisschen unter die Arme greifen könntest…

LG. Werner

PS. Was ich gerade gesehen habe: Der Betreff (Subject) der Mails für die Müllabholung ist schlicht und einfach „Müllabholung“
Wahrscheinlich liegt da schon mein erster Fehler, da dies ja auch in einer Skriptzeile berücksichtigt werden muss.

mach ich gerne.
Die Laufzeit an sich dürfte nur wenige Millisekunden dauern, will aber nicht ausschliessen, das der darin enthaltene IMAP-Abruf eventuell dauert.
Vermutlich stimmt das Suchmuster (in preg_replace()) nicht, das die eigentlichen relevanten Datenzeilen erkennt - und damit gibt es keinen Inhalt.

Um sicher zu sein, das der Mailtext 100% dem Original entspricht (zB Kodierung des Umlauts), könntest du mir die Müllmail einfach auf demel42@web.de weiterleiten. Dann kann ich mir die zur Brust nehmen