Python TagebuchPython lernen – mein persönliches Tagebuch

Tagebuch-Eintrag #41
Projekt-Idee: PDF aus Email drucken – Schritt #4 – Es funktioniert

Es funktioniert! Es funktioniert! Das ist so krass!
Werbung/Anzeige

Ich habe es tatsächlich geschafft. Ich kann es selbst kaum glauben 😀

Es fehlte nur noch die Funktion, dass Python die heruntergeladenen PDF-Dateien drucken soll und diese Funktion ist so simpel und ist im os-Modul enthalten: os.startfile(path[, operation]).

os.startfile() benötigt natürlich die Datei mit der was gemacht werden soll und (optional) ein Befehl, was gemacht werden soll. In meinem Fall lautet mein Befehl (operation) print um die Dateien über den Standard-Drucker des Betriebssystems zu drucken.

Etwas ungläubig, dass es so einfach ist, habe ich es erstmal mit einer einfachen Datei getestet:

import os
os.startfile('C:/Users/username/Desktop/printing_jobs/datei.txt', 'print')

Es funktionierte. Und weil ich für meinen Einsatz-Zweck mehrere PDF-Dateien drucken möchte, testete ich es weiter mit einer for-Schleife, welches alle Dateien aus einem Ordner ausliest und einzeln über os.startfile() druckt.

Hierfür nutze ich das glob-Modul, welches Pfad-Eingaben ermöglicht. Im Detail habe ich mich jedoch noch mit diesem Modul befasst.

import glob
files = glob.glob("C:/Users/user/Desktop/printing_jobs/*.txt")
for file in files:
    print(file)
    os.startfile(file, 'print')

Die for-Schleife läuft durch und auch die Dateien, die sich im definierten Order befindet, werden tatsächlich ausgedruckt.

Der Wahnsinn! 😀

In das Python-Programm übernehmen

Nun gilt diese Druckfunktion in mein Python-Projekt zu übertragen. Das glob-Modul benötige ich hier nicht. Die Stelle, wo die Funktionalität hin muss, habe ich bereits als Kommentar in der while-Schleife vorgemerkt und entsprechend eingebaut. Hier in der Zeile: 67

Mein funktionierender Code in der Alpha Version 0.0.1 mit Kommentaren zu den jeweiligen Zeilen und Funktionen, was es genau passiert.

# FINAL - ALPHA 0.0.1
# Module importieren
import imaplib
import base64
import os
import email
# E-Mail-Postfach Benutzer und Passwort
email_user = "USER"
email_pass = "PASS"
# IMAP-Host und Port bei mail hinterlegen und anschließend mit mail.login einloggen
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.DE" SUBJECT "drucken"')
# Mails IDs vergeben
mail_ids = data[0]
id_list = mail_ids.split()
latest_email_uid = int(id_list[-1])
# Emails erfassen, die die Bedinungen aus Zeile 17 erfüllen 
for num in data[0].split():
    result, data = mail.fetch(num, "(RFC822)")
    raw_email = data[0][1]
    # E-Mail Nachrichten als UTF-8 decodieren
    raw_email_string = raw_email.decode("utf-8")
    email_message = email.message_from_string(raw_email_string)
    # 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 = Betreff
            email_subject = msg["subject"]
            # email_from: Absender
            email_from = msg["from"]
            # Absender und Betreff ausgeben. Zwecks überprüfung, ob die richtigen Emails ausgelesen wurden.
            print("From: ", email_from, "\n")
            print("Subject: ", email_subject, "\n")
            # Betreff erfassen und in einer Liste umwandeln
            subject_command = email_subject.split(",")
            # copy = Zahl für Exemplare, die zu drucken sind
            copy = int(subject_command[0])
            # task = Signalwort "drucken"
            task = subject_command[1]
        # E-Mails verarbeiten
        for part in email_message.walk():
            # Überspringen, wenn es keine PDF-Datei ist
            if part.get_content_type() != "application/pdf":
                continue
            if part.get("Content-Disposition") is None:
                continue
            # Gefundene Dateinamen werden der Variable fileName übergeben
            fileName = part.get_filename()
            # Wenn fileName == True, also wenn Dateien vorhanden sind.
            if bool(fileName):
                # Datei dem Ordner-Pfad (Zielordner) hinzufügen und diesen Pfad zur Datei in der Variable filePath übergeben.
                filePath = os.path.join("c:/", "Users/username/Desktop/printing_jobs", fileName)
                # Hier werden die Dateien in den Ordner gespeichert
                if not os.path.isfile(filePath):
                    # öffne die Datei und füge es dem Ordner hinzu: a = hinzufügen/anhänge, b = Binary-Modus (Bilder, Dateien etc)
                    fp = open(filePath, "ab")
                    fp.write(part.get_payload(decode=True))
                    # Ordner schließen
                    fp.close()
                    subject_command = email_subject.split(",")
                    # Zahl für Exemplare
                    copy = int(subject_command[0])
                    # Signalwort "drucken"
                    task = subject_command[1]
                    # Zahl für Start-Exemplar
                    n = 1
                    # Anhänge ausdrucken. Exemplare je Anhang basierend auf Zahl im Betreff
                    while n <= copy:
                        # Die while-Schleife durchläuft für jede PDF-Datei von jeder Email. Exemplare basierend auf Zahl im Betreff.
                        # Und nur so lange, wie n kleiner oder gleich copy ist.
                        print("+++++" * 5)
                        # Ausgabe dass die Datei gedruckt wird
                        print(filePath, "PDF-Datei wird ausgedruckt...")
                        # hier die eigentiche Anweisung zum drucken der Dateien. Der Standard-Drucker wird verwendet.
                        os.startfile(filePath, 'print')
                        # Info, das wie vielte Exemplar gedruckt wird. 
                        print(str(n) + ". " + "Druck")
                        n = n + 1
# Verbindung zum IMAP-Server trennen und ausloggen.
mail.close()
mail.logout()

Etwas fehlt noch

Es fehlt immer noch die Absicherung gegen Tippfehler bei der Anzahl. Hierfür muss ich noch eine if-Abfrage einbauen. Vielleicht schaffe ich es in dieser Abfrage eine Funktion einzubauen, dass automatisch eine E-Mail an den Absender geschickt wird, wenn z.B. die zu druckenden Exemplaren größer als 5 sind oder gar zweistellig.

Außerdem werden die heruntergeladenen Dateien in dem Ziel-Ordner nicht gelöscht. Das ist natürlich ganz gut, da die Dateien nicht mehr benötigt werden.

Ganz wichtig ist auch, dass das Passwort nicht als Klartext abgespeichert werden darf. Hier sollte eine Verschlüsselung drin sein.

Insgesamt werde ich den Programm-Code optimieren und daraus auch eine richtige Funktion erstellen.

Trotzdem bin ich recht zufrieden mit der Alpha Version 0.0.1. Immerhin mein erstes Python-Programm, was funktioniert und auch bei uns auf Arbeit intern eine Verwendung finden wird.

Nun kann ich mich erstmal andere Themen zu Python widmen, wie z.B. Webseiten Crawler mit Python bauen. Dafür hätte ich auch eine praktische Anwendung.

Die verwendeten Tutorials oder Lösungswege

Die Schritte zu diesem Python-Projekt

# # ## ENDE Tagebuch-Eintrag #41 | Projekt-Idee: PDF aus Email drucken – Schritt #4 – Es funktioniert
Werbung/Anzeige
Schlagwörter im Tagebuch-Eintrag:

Kommentar schreiben




Werbung/Anzeige