Wörter aus E-Mail in .txt Datei speichern

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo liebe Leute

    Ich habe hier im Forum einige Zeilen Code gefunden, mit denen ich bereits eine E-Mail auslesen konnte. Wenn das Wort "Wort" geschickt wird, konnte die print Funktion aufgerufen werden:

    [code=php]# check Mails
    def checkMails():
    try:
    print("read mails")
    m = imaplib.IMAP4_SSL(MailReceiveSRV)
    m.login(MailReceiveUSER, MailReceivePWD)
    if running:
    m.select("Inbox")
    status, unreadcount = m.status('INBOX', "(UNSEEN)")
    unreadcount = int(unreadcount[0].split()[2].strip(').,]'))
    if unreadcount > 0:
    items = m.search(None, "UNSEEN")
    items = str(items[1]).strip('[\']').split(' ')
    for index, emailid in enumerate(items):
    #print "emailid: " + emailid
    resp, data = m.fetch(emailid, "(RFC822)")
    email_body = data[0][1]
    mail = email.message_from_string(email_body)
    if mail["Subject"] == 'Code':
    for part in mail.walk():
    if part.get_content_type() == 'text/plain':
    body = part.get_payload()
    # For each line in message execute instructions
    for line in body.split('\r\n'):
    if line == "Wort":
    print("Wort erkannt")


    time.sleep(interval)
    except Exception, e1:
    print("Error...: " + str(e1))
    except (KeyboardInterrupt, SystemExit):
    exit()

    checkMails()[/php]

    Jetzt muss ich dieses Wort in eine .txt Datei abspeichern.
    Ich muss jede Zeile vom E-Mail in eine separate .txt Datei abspeichern.
    Also in jeder Zeile vom E-Mail wird jeweils nur ein Befehlswort stehen, Bsp:

    [code=php]Starten
    15.30
    Adresse[/php]

    Jetzt weiss ich leider nicht genau wie ich diese Wörter Zeile für Zeile in eine eigene .txt Datei auslesen kann?
    Das abspeichern könnte ich ja dann einfach mit file.write(.....) machen oder?

    Ich bin euch sehr dankbar für eure Hilfe oder Tipps!
    Danke und Gruss

  • Hallo dbv. Ok ich versuche es verständlicher zu beschreiben:

    Vorhandenes Skript:
    Ich habe ein Skript, das für einige Variablen Worte oder Zahlen benötigt.
    Diese Worte oder Zahlen werden ständig wieder aus einer .txt Dateien ausgelesen, da sie sich ändern können.
    Jetzt möchte ich diese Variablen für das erste Skript per E-Mail einstellen.

    Neues Skript
    Also möchte ich die Worte oder Zahlen per E-Mail senden können und in die .txt Datei abspeichern. Diese .txt Datei wird dann vom vorhandenen Skript immer ausgelesen.

    Problem
    Mit dem obigen Code kann ich aber bisher nur bestimmte Worte erkennen und damit etwas auslösen. Aber ich möchte beliebige Wörter oder Zahlen aus der E-Mail in die .txt Datei abspeichern.

    Also habe ich gedacht, dass in jeder Zeile der E-Mail verschiedene Wörter stehen können, und mein Skript so Zeile für Zeil auslesen kann
    Das neue Skript weiss dann, das in der ersten Zeile der E-Mail z.b. die Variable a steht, und in der zweiten Zeile die variable b usw.
    Diese Variablen können sollen dann an die .txt Datei übergeben werden.

    Ich hoffe es ist nun verständlich. Sonst bitte einfach nachfragen falls ich was schlecht erklärt habe.

    Danke für die Hilfe.

    • Offizieller Beitrag

    Ah, jetzt hab ichs ;). generell weisst du ja wie man wie man sich einzelne Zeilen des email bodys anzeigen lässt.

    Code
    for line in body.split('\r\n')


    ('\r\n') ist das NewLine Zeichen unter Windows. Wenn du also ne Mail von nem anderen BS sendest muss das nicht mehr klappen.
    du könntest jetzt einfach jede zeile in ein Textfile schreiben

    Code
    with open("/home/pi/text.txt","a") as f:
        for line in body.split('\r\n'):
            if line != "":
                f.write(line+"\n")
  • Hallo,

    wenn man an den Zeilenumbrüchen splitten will, dann gibt noch `splitlines()`, welche alle Windows- und Unix-Zeilenumbrüche erkennt.

    Wenn du, wie in der Eingangsfrage dargestellt, _jedes_ Wort in eine eigene Zeile in der Ausgabedatei haben willst, dann nimmst du nur `split()` (also ohne Argument in den Klammern). Dann wird der Text an allen Leerzeichen, Tabs und Zeilenumbrüchen gesplittet.

    Gruß, noisefloor

  • :denker: Der Code kommt mir irgendwie bekannt vor :D


    Ich meine mich zu erinnern den Code so geschrieben zu haben das jede Zeile der EMail überprüft wird.... (Server/PI Steuerung via EMail)

    Der Tip von dbv ist also korrekt und die richtige Vorgehensweise - wobei er vermutlich den Inhalt der Datei jedesmal überschreiben will, oder? Also 'w' anstatt 'a'.

    Allerdings scheint nicht klar zu sein ob er wirklich jedes Wort einer Zeile separat schreiben will, oder sowieso nur ein Wort pro Zeile in der EMail stehen wird :s

    Das Script sähe dann also so aus:

    Spoiler anzeigen


    [code=php]#!/usr/bin/python
    #
    # optimized by meigrafd
    #
    # original: Scroll-Menü
    #
    import smtplib, sys, time, email, getpass, imaplib
    from time import gmtime, strftime
    from email.header import Header
    from email.mime.image import MIMEImage
    from email.mime.multipart import MIMEMultipart
    from email.mime.text import MIMEText

    #---------------------------------------------------------------------

    #check eMails every ... sec
    interval = 10
    #react only on eMails with exact this subject
    subject = 'Pi'

    #save to file
    toFile = '/tmp/emailData.txt'

    MailReceiveUSER = 'USER'
    MailReceivePWD = 'PASSWORD'
    MailReceiveSRV = 'imap.gmail.com'

    MailSendUSER = MailReceiveUSER
    MailSendPWD = MailReceivePWD
    MailSendSRV = 'smtp.gmail.com'
    MailSendFROM = MailReceiveUSER
    MailSendTO = 'xxx'

    #---------------------------------------------------------------------

    # check Mails
    def checkMails():
    try:
    print "Starting checkMails"
    m = imaplib.IMAP4_SSL(MailReceiveSRV)
    m.login(MailReceiveUSER, MailReceivePWD)
    while running:
    m.select("Inbox")
    status, unreadcount = m.status('INBOX', "(UNSEEN)")
    unreadcount = int(unreadcount[0].split()[2].strip(').,]'))
    if unreadcount > 0:
    items = m.search(None, "UNSEEN")
    items = str(items[1]).strip('[\']').split(' ')
    for index, emailid in enumerate(items):
    #print "emailid: " + emailid
    resp, data = m.fetch(emailid, "(RFC822)")
    email_body = data[0][1]
    mail = email.message_from_string(email_body)
    if mail['Subject'] == subject:
    timeNow = strftime("%d.%m.%Y %H:%M:%S", gmtime())
    print "[{}] New EMail with Subject '{}' received, checking.. ".format(timeNow, mail['Subject']),
    for part in mail.walk():
    if part.get_content_type() == 'text/plain':
    body = part.get_payload()

    # Write each line of message to File
    with open(toFile, 'w') as f:
    for line in body.split('\r\n'):
    if line != "":
    f.write(line+"\n")

    time.sleep(interval)
    except Exception, e1:
    print "Error in checkMails: " + str(e1)
    checkMails()


    if __name__ == '__main__':
    try:
    running = True
    checkMails()
    except Exception, e1:
    print "Error...: " + str(e1)
    except (KeyboardInterrupt, SystemExit):
    running = False
    print "Schliesse Programm.."[/php]

    Aus Sicherheitsgründen würde ich aber dringend dazu raten den validpass Teil wieder einzubauen!

  • Hallo ich danke euch allen! Super Hinweise :)

    Ja den Code habe ich soweit von meigrafd übernommen :D

    Und genau ich habe aus dem "a" ein "w" gemacht, dass es immer überschrieben wird.

    Und es wird in jeder E-Mail-Zeile nur genau ein Wort stehen, und diese sollen in eine Datei gespeichert werden.

    Das hat mit dem heute geposteten Code von dbv und meigrafd geklappt, danke nochmal!

    Habe z.B.

    [code=php]Code
    Raspberry
    Pi[/php]

    verschickt, aber in der Datei stand dann ein Fragezeichen am Anfang...?

    [code=php]?Code
    Raspberry
    Pi[/php]

    Woher kommt denn das plötzlich?

    Und ich lasse den ganzen Code nicht in einem Thread laufen, sondern werde ihn mit der Crontab alle 10 Minuten einmal ausführen. Oder ist es von euch irgendwie zu empfehlen ihn in einem Thread laufen zu lassen?

    meigrafd: Ich sehe nicht ganz wo der validpass eingebaut war? Ich habe doch als Sicherheit die Zeile die das Subject überprüft...?
    [code=php]if mail["Subject"] == 'Code':[/php]


    Wäre es noch viel Aufwand, direkt jedes Wort in eine eingene .txt Datei abzuspeichern? Ich sehe nicht genau wie ich das anstellen könnte.. Also Code in einer code.txt Datei und Raspberry in einer Raspberry.txt Datei usw..
    Denn so wäre es für mich anschliessend wesentlich einfacher die Daten auszulesen, weil ich dann nicht immer die ganze Datei parsen müsste um eine bestimmte Zeile auszulesen.

    Bin wirklich froh dass ihr so hilfsbereit seid! Danke!

Jetzt mitmachen!

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