Tagebuch-Eintrag #40
Projekt-Idee: PDF aus Email drucken – Schritt #3.1
So nah an dran und doch so fern kam mir in den Sinn, als ich im letzten Schritt es geschafft hatte die PDF-Dateien herunterladen und zu speichern und am Ende ein Logikfehler auffiel.
Woher weiß Python wie oft die Dateien gedruckt werden soll?
Ich habe hin und her überlegt. Und versuchte auf Glück einfach folgendes (einfach der Logik gefolgt).
Meine bisherige while-Schleife zum ausdrucken der PDF-Dateien nach der Zahl im Betreff (Zeile 46 bis 51) verschob ich einfach in die for-Schleife, wo die Dateien abgespeichert werden (ab Zeile 52) und innerhalb der if-Bedingung in der Zeile 61.
Um ehrlich zu sein, hatte ich nicht erwartet, dass es funktioniert. Aber es hat funktioniert. Als ich das Programm dann startete hat es wirklich (symbolisch mit der print-Ausgabe (Zeile 78, 79) die PDF-Dateien so oft ausgedruckt, wie die Zahl im Betreff es vorsieht.
Ich war baff! Und das ist der aktuelle Code
import imaplib
import base64
import os
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.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)
# 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
for part in email_message.walk():
if part.get_content_type() != "application/pdf":
continue
if part.get("Content-Disposition") is None:
continue
fileName = part.get_filename()
if bool(fileName):
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):
fp = open(filePath, "ab")
fp.write(part.get_payload(decode=True))
fp.close()
# print("N:", fileName)
# 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:
# Die while-Schleife durchläuft für jede PDF-Datei von jeder Email. Exemplare basierend auf Zahl im Betreff.
print("+++++" * 5)
# Ich brauch jetzt hier nur eine Funktion, für den Druck der Dateien
print(fileName, "PDF-Datei wird ausgedruckt...")
print(str(n) + ". " + "Druck")
print("+++++" * 5)
n = n + 1
# Verbindung trennen und ausloggen.
mail.close()
mail.logout()
Jetzt werden die PDF-Dateien von den jeweiligen Emails auch in der gewünschten Anzahl ausgedruckt – zumindest wüsste ich theoretisch, wo der entsprechende Programm-Code hinzugehört.
Das kommt dann als nächstes. Ich nähere mich dem Ende 😀