Python TagebuchPython lernen – mein persönliches Tagebuch

Tagebuch-Eintrag #38
Projekt-Idee: PDF aus Email drucken – Schritt #2

Nach dem ich es geschafft habe mich mich Python auf dem IMAP-Server einzuloggen und die E-Mails zu filtern, geht es im zweiten Schritt weiter.
Werbung/Anzeige

Es war ganz schön kompliziert bisher und es bleibt auch etwas kompliziert für einen Python-Anfänger.

Hin und wieder dachte ich dran, dass es vielleicht doch noch zu früh ist solch ein Python-Projekt als Anfänger umzusetzen. Manchmal verstand ich den Code nicht, welches im Tutorial ist.

Aber ich habe es doch noch geschafft den zweiten Schritt des Projektes umzusetzen, natürlich mit Hilfe von Tutorials, welches ich am Ende dieses Tagesbuch-Eintrages verlinkt habe.

Anhänge aus der Email erfassen

Nach dem ich den ersten Schritt gemacht habe, geht es nun darum die Anhänge aus den den relevanten Emails zu erfassen und auszudrucken.

Ich habe ein anderes Tutorial gefunden und deswegen sieht der Code anders aus, als im Schritt eins. Also nicht wunder 😉

Tutorial:
https://medium.com/@sdoshi579/to-read-emails-and-download-attachments-in-python-6d7d6b60269

Dieses Tutorial ist jedoch fehlerhaft, weil eine Fehlermeldung erscheint, dass latest_email_uid nicht angegeben wurde. Die Lösung dafür fand ich in einem anderen Tutorial, welches auch das Thema hat Emails auszulesen:
https://blog.webnersolutions.com/how-to-fetch-unread-emails-from-a-mailbox/

Und mein jetziger Programm-Code sieht so aus und es funktioniert sogar.

import imaplib
import base64
import email

email_user = "USER"
email_pass = "PASS"

mail = imaplib.IMAP4_SSL("HOST", PORT)
mail.login(email_user, email_pass)
# Nur die Inbox duchsuchen
mail.select("Inbox")
# Nach Emails vom bestimmten Absender (FROM) suchen mit dem Begriff "drucken" im Betreff.
result, data = mail.search("UTF-8", 'UNSEEN FROM "ABSENDER@DOMAIN-ABC.DE" SUBJECT "drucken"')
mail_ids = data[0]
id_list = mail_ids.split()
latest_email_uid = int(id_list[-1])
for num in data[0].split():
    result, data = mail.fetch(num, "(RFC822)")
    raw_email = data[0][1]
    
    # Converts byte literal to string removing b''
    raw_email_string = raw_email.decode("utf-8")
    email_message = email.message_from_string(raw_email_string)

    # Anhänge erfassen und runterladen (später)
    for part in email_message.walk():
        if part.get_content_maintype() == "multipart":
            continue
        if part.get("Content-Disposition") is None:
            continue
        fileName = part.get_filename()
        if bool(fileName):
            print("N:", fileName)
            subject = str(email_message).split("Subject: ", 1)[1].split("\n To:", 1)[0]
            print('Downloaded "{file}" from email titled "{subject}" with UID {uid}.'.format(file=fileName, subject=subject, uid=latest_email_uid))
    # Nachrichten in einer for-Schleife ausgeben.
    for response_part in data:
        if isinstance(response_part, tuple):
            msg = email.message_from_string(response_part[1].decode("utf-8"))
            email_subject = msg["subject"]
            email_from = msg["from"]
            print("***" * 5)
            print("From: ", email_from, "\n")
            print("Subject: ", email_subject, "\n")
            print("***" * 5)
            # Betreff erfassen und in einer Liste umwandeln
            subject_command = email_subject.split(",")
            # Zahl für Exemplare
            copy = int(subject_command[0])
            # Signalwort "drucken"
            task = subject_command[1]
            n = 1
            # Anhänge ausdrucken. Exemplare je Anhang basierend auf Zahl im Betreff
            while n <= copy:
                print("+++++" * 5)
                print("PDF-Datei wird ausgedruckt...")
                print(str(n) + ". " + "Druck")
                print("+++++" * 5)
                n = n + 1
# Verbindung trennen und ausloggen.
mail.close()
mail.logout()
Anhang wird gedruckt - theoretisch ;)
Anhang wird gedruckt. Exemplare basierend auf Zahl im Betreff (Subject) – theoretisch 😉

Ich werde den Code am Ende sowieso optimieren und übersichtlicher machen, für’s erste soll es zunächst so funktionieren, wie ich es geplant habe. Feintuning folgt später. Wenn ich später mehr Erfahrung gesammelt habe, kann ich den Code sicher auch gleich übersichtlicher gestalten. Das ist noch Zukunftsmusik. 😉

Der nächste Schritt

Im nächsten Schritt habe ich mir überlegt, die PDF-Dateien (filtern, nur PDF runterladen) zuerst wirklich herunterzuladen. Davor muss ich noch ausdrücklich sagen, dass es nur PDF-Dateien herunterladen soll. Aktuell lädt es alle Anhänge aus der E-Mail herunter.

Wenn die Dateien in einem Ordner sind, kommt eine neue Funktion, welches die Dateien in dem Ordner ausliest und zum Drucker sendet.

Ich bin gespannt wie das umgesetzt werden kann.

# # ## ENDE Tagebuch-Eintrag #38 | Projekt-Idee: PDF aus Email drucken – Schritt #2
Werbung/Anzeige
Schlagwörter im Tagebuch-Eintrag:

Kommentar schreiben




Werbung/Anzeige