Interrupts in email Abfrage einbauen

  • Hey,
    ich versuche gerde eine Interrupt in einen Programm Code einzufügen, der meine Emails Abfragen soll. Es soll aber noch der Abhandlung des Interrupts die Email Abfrage weitergeführt werden, wie stell ich das an?

    Der Programm Code:
    #! /usr/bin/python

    # Das Script benötigt die IMAPLIB und TIME. Für POP3 wäre das POPLIB. Siehe http://docs.python.org/2/library/poplib.html
    # Googlemail verwendet IMAP address: imap.gmail.com und Port 993 username ist die volle Mailaddresse

    import imaplib, time
    import RPi.GPIO as GPIO

    GREEN_PIN = 25
    RED_PIN = 24

    class MailChecker:
    def __init__(self, server, port):
    # GPIO aufsetzen - siehe Konstanten für GREEN_PIN und RED_PIN müssen mit eurer Belegung übereinstimmen
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(GREEN_PIN, GPIO.OUT)
    GPIO.setup(RED_PIN, GPIO.OUT)
    GPIO.setwarnings(False)

    # verbindung mit dem IMAP server - SSL versteht sich ;)
    try:
    self.m = imaplib.IMAP4_SSL(server, port)
    except:
    self.do_error("Server nicht erreichbar")

    def do_error(self, error):
    print(error)
    exit()


    def log_in(self, user, password):
    # Login mit mailaddresse und password
    try:
    self.m.login(user, password)
    except:
    self.do_error("Fehler: Login")

    def check_mail(self):
    type, data = 0, 0
    # Inbox nach ungelesenen Mails durchsuchen. Kann weiter eingeschränkt werden z.B. '(FROM "Horst")'
    try:
    self.m.select()
    type, data = self.m.search(None, "UNSEEN")
    except:
    self.do_error("Ausnahme: Mailsabrufen")


    if type == "NO":
    self.do_error("Fehler: Mailsabrufen")

    self.report(data)

    def start_checking(self, interval):
    while True:
    self.check_mail()
    time.sleep(interval)

    def report(self, data):
    message_count = len(data[0].split())
    if message_count > 0:
    print("Sie haben %i neue Mails" %
    message_count)
    GPIO.output(RED_PIN, GPIO.LOW)
    for i in range(1, 100):
    # Grüne LED Blinkt
    GPIO.output(GREEN_PIN, GPIO.LOW)
    time.sleep(.2)
    GPIO.output(GREEN_PIN, GPIO.HIGH)
    time.sleep(.2)
    else:
    print("Keine neuen Mails")
    GPIO.output(GREEN_PIN, GPIO.LOW)
    GPIO.output(RED_PIN, GPIO.HIGH)

    if __name__ == "__main__":
    user = "benutzer"
    password = "passwort"
    server = "serveradresse"
    port = 993
    # oder welcher port auch immer relevant ist

    checker = MailChecker(server, port)
    checker.log_in(user, password)
    checker.start_checking(60)

    Der Interrupt :
    1. GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
    2. def my_callback(channel):
    print("test")
    3. GPIO.add_event_detect(17, GPIO.RISING, callback=my_callback)

    Ich hoffe ihr könnte mir helfen, da ich noch ein blutiger Anfänger in Sachen Python bin :)
    Gruß Tobi

    • Offizieller Beitrag

    Hallo tobi.

    bitte benutze Code Blocks wenn du Quelltext darstellen willst.

    Das coole an Interrupts ist ja das diese in eigenem Thread ablaufen und so dein Hauptprogramm nicht stören. Hier hab ich das mal zusammengefasst.

    Was soll den passieren wenn du einen Interrupt auslöst? Grade in einem Mailscanprogramm fehlen mir da grade die Ansätze ;)

    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.

  • Im dem Theard soll später mal eine Variable zurückgesetzt bzw. verändert werden, da ich dieses Email Programm nutze um einen bestimmten Inhalt auf einem einfachen LCD Display (4x20) anzuzeigen. So soll bei Betätigen des Tasters ein anderer Inhalt angezeigt werden oder das Display soll gelöscht werden.

    Hier mein Versuch:

    Ich erhalte aber folgende Fehlermeldung:

    Code
    sudo python mail.py
    Traceback (most recent call last):
      File "mail.py", line 11, in <module>
        class MailChecker:
      File "mail.py", line 78, in MailChecker
        GPIO.add_event_detect(17, GPIO.RISING, callback=mycallback)
    RuntimeError: No access to /dev/mem.  Try running as root!

    Was mache ich falsch :D?

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!