Tagebuch-Eintrag #38
Projekt-Idee: PDF aus Email drucken – Schritt #2
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()

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.