jens4ever
Goto Top

Linux: Automatisiert Posteingang checken und Skript ausführen

Moin zusammen,

könnt ihr mir einen Tooltipp geben?
Ich suche ein Tool für meinen Raspberry PI.

Grob skizziert: Er soll per Cron-Job alle 5 min per IMAP ein Postfach überwachen und ggf. - basierend auf den Mails - Skripts anwenden.

Bsp: Wenn eine Mail mit dem Betreff "x" da ist, erstelle eine Datei in der "X" steht.


Danke für eure Tipps.
Grüße Jensen

Content-ID: 273941

Url: https://administrator.de/contentid/273941

Ausgedruckt am: 21.11.2024 um 14:11 Uhr

114757
114757 06.06.2015 um 16:22:28 Uhr
Goto Top
Lochkartenstanzer
Lochkartenstanzer 06.06.2015, aktualisiert am 18.12.2018 um 15:04:37 Uhr
Goto Top
Moin,

Läuft der imap-server lokal auf dem RasPi oder extern?

Sofern die Mail lokal eingeliefert wird, könntest du auch einfach ein delivery-skript erstellen, daß diese Aufgabe übernimmt.

lks

Edit: Typo
colinardo
Lösung colinardo 07.06.2015, aktualisiert am 15.06.2015 um 11:48:16 Uhr
Goto Top
Hallo zusammen,
um @114757 's Vorschlag mal etwas Gestallt zu verleihen, hier ein Beispiel mit Python:
Es checkt den Posteingang eines Accounts auf ungelesene Mails mit einem bestimmten Betreff, erstellt dann eine Datei mit beliebigem Inhalt und löscht diese Mail dann anschließend.
#!/usr/bin/python
import imaplib
import email 
# ----------------------------
SERVER = "imap.domain.de"  
USERNAME = "MaxMuster"  
PASSWORD = "Geheim"  
# -----------------------------
conn = imaplib.IMAP4_SSL(SERVER)
conn.login(USERNAME,PASSWORD)
# Inbox selektieren 
typ, data = conn.select('INBOX')  
# Nur ungelesene Mails mit einem bestimmten Betreff filtern und in einer Liste speichern 
typ, [msg_ids] = conn.uid('search',None,'(UNSEEN SUBJECT "testmail")')  

if msg_ids:
  for id in msg_ids.split():
    #print id
    typ,mail = conn.uid('fetch',id,'(RFC822)')  
    msg = email.message_from_string(mail[1])
    subject = msg['subject']  
    # neue Datei erstellen
    file = open('datei.txt','w')  
    file.write("Testinhalt")  
    file.close()
    # Mail loeschen
    print "Loesche Mail mit ID '" + id + "' und Betreff: '" + subject + "'"   
    conn.uid('store',id,'+FLAGS','(\\Deleted)')  
    conn.expunge()
else:
  print "Keine neuen Nachrichten im Posteingang"  
conn.close()
conn.logout()
Grüße Uwe
Jens4ever
Jens4ever 19.06.2015 um 22:34:53 Uhr
Goto Top
Hallo Uwe,

habe es ausprobiert und es funktioniert super. Vielen Dank! Habe es noch ein klein wenig angepasst. Hast du vielleicht noch einen Tipp, wie ich erreichen kann, dass ich einen Platzhalter verwenden kann?

Ich habe es versucht mit
typ, [msg_ids] = conn.uid('search',None,'(UNSEEN SUBJECT "testmail *")')  
Also *, dann findet er aber nichts, wenn der Betreff bspw. "testmai lalalala" ist.

Danke nochmal für die bisherige Hilfe, auch an alle anderen.
Jensen
114757
114757 19.06.2015 aktualisiert um 22:43:25 Uhr
Goto Top
Platzhalter braucht es bei IMAP Searches nicht, denn laut RFC Doku sind das keine exakten Matches sondern es wird immer nur nach vorkommen des Strings im Subject Caseinsensitive gesucht. Geht also Out of the Box ohne Wildcards.

In all search keys that use strings, a message matches the key if the string is a substring of the field. The matching is case-insensitive.


Gruß jodel32
colinardo
colinardo 19.06.2015 aktualisiert um 22:48:33 Uhr
Goto Top
Da kann ich @114757 nur zustimmen.

Wenn man es noch weiter einschränken will kann man ja noch zusätzlich eine if Abfrage in die Schleife einbauen die dann die Substrings des Subjects zusätzlich prüft.

Grüße Uwe
novregen
novregen 18.12.2018 um 14:59:43 Uhr
Goto Top
Hallo Uwe,

kannst du mir nochmal helfen und es so ändern das es prüft ob mail von absender x oder y oder z, anhang abspeichert auf nas und dann die Email löscht ?

Das ganze dann auf dem pi als cron laufen lassen ß
137846
137846 18.12.2018 aktualisiert um 15:14:07 Uhr
Goto Top
novregen
novregen 18.12.2018 um 15:44:21 Uhr
Goto Top
ok, und dann das script auf dem pi per cron ausführen oder muss dort noch mehr installiert werden ?
137846
137846 18.12.2018 aktualisiert um 15:46:19 Uhr
Goto Top
Zitat von @novregen:

ok, und dann das script auf dem pi per cron ausführen oder muss dort noch mehr installiert werden ?
Python natürlich.
https://www.raspberrypi.org/forums/viewtopic.php?t=181480
novregen
novregen 18.12.2018 um 15:46:21 Uhr
Goto Top
oder kann man das auch auf der synology zum laufen bekommen ? dort gibt es ja auch python paket.
137846
137846 18.12.2018 aktualisiert um 15:48:34 Uhr
Goto Top
Zitat von @novregen:

oder kann man das auch auf der synology zum laufen bekommen ?
Google schon wieder kaputt?
https://www.synology.com/de-de/dsm/packages/py3k

Synology ist auch nur ein Linux-Unterbau, also ja.
colinardo
colinardo 19.12.2018 aktualisiert um 19:19:41 Uhr
Goto Top
Zitat von @novregen:

Hallo Uwe,

kannst du mir nochmal helfen und es so ändern das es prüft ob mail von absender x oder y oder z, anhang abspeichert auf nas und dann die Email löscht ?

Das ganze dann auf dem pi als cron laufen lassen ß

Servus @novregen .
Ausnahmsweise hier mal eine Anpassung außer der Reihe, da das ja nicht Thema dieses Threads ist (s. Foren-Richtlinien).
Für das nächste mal bitte einen neuen Thread erstellen! Merci.

Back to topic:
Im jetzigen Zustand verarbeitet das Skript alle ungelesenen Mails. Wenn man auf ungelesene Mails von "bestimmten" Absendern ausfiltern möchte, dann ändere man in dieser Zeile
(ret, messages) = conn.search(None,'UNSEEN')
den SEARCH-Filter auf
UNSEEN FROM user@domain.tld
Mit der Standard IMAP SEARCH-Sytax nach RFC3501 lässt sich damit flexibel auf die Nachrichten filtern die man verarbeiten möchte. Bei Fragen dazu also erst mal die RFC lesen.

Weitere Hinweise, z.B. zum Attachment-Handling für den Fall das bereits Attachments mit dem selben Namen im Ausgabeordner existieren siehe Kommentare im Code.

Das Skript kann hier heruntergeladen werden:

save_attachments_273941.py

Viel Spaß
Grüße Uwe

Support gerne gegen Aufwandsentschädigung per PN
novregen
novregen 24.05.2019 um 11:20:41 Uhr
Goto Top
Hallo Uwe,

ich würde gerne die Emails Inhalte ohne Anhang runterladen, bekomme bei dem Script aber immer folgende Fehlermeldung :
TypeError: initial_value must be str or None, not bytes
Liegt es am Phyton 3.5 ?