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-Key: 273941

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

Printed on: April 25, 2024 at 10:04 o'clock

Mitglied: 114757
114757 Jun 06, 2015 at 14:22:28 (UTC)
Goto Top
Member: Lochkartenstanzer
Lochkartenstanzer Jun 06, 2015, updated at Dec 18, 2018 at 14:04:37 (UTC)
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
Member: colinardo
Solution colinardo Jun 07, 2015, updated at Jun 15, 2015 at 09:48:16 (UTC)
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
Member: Jens4ever
Jens4ever Jun 19, 2015 at 20:34:53 (UTC)
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
Mitglied: 114757
114757 Jun 19, 2015 updated at 20:43:25 (UTC)
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
Member: colinardo
colinardo Jun 19, 2015 updated at 20:48:33 (UTC)
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
Member: novregen
novregen Dec 18, 2018 at 13:59:43 (UTC)
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 ß
Mitglied: 137846
137846 Dec 18, 2018 updated at 14:14:07 (UTC)
Goto Top
Member: novregen
novregen Dec 18, 2018 at 14:44:21 (UTC)
Goto Top
ok, und dann das script auf dem pi per cron ausführen oder muss dort noch mehr installiert werden ?
Mitglied: 137846
137846 Dec 18, 2018 updated at 14:46:19 (UTC)
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
Member: novregen
novregen Dec 18, 2018 at 14:46:21 (UTC)
Goto Top
oder kann man das auch auf der synology zum laufen bekommen ? dort gibt es ja auch python paket.
Mitglied: 137846
137846 Dec 18, 2018 updated at 14:48:34 (UTC)
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.
Member: colinardo
colinardo Dec 19, 2018 updated at 18:19:41 (UTC)
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
Member: novregen
novregen May 24, 2019 at 09:20:41 (UTC)
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 ?