erstmal möchte ich sagen, dass ich mich im Grunde nicht mit Python auskenne. Meine Erfahrung im Programmieren durfte ich in zwei Semestern C++ an der Uni sammeln.
Ich möchte hier nicht auftreten im Sinne von "schreibt mal mein Programm fertig", habe derzeit aber leider nicht die Zeit Python von Grund auf neu zu lernen.
Ich freue mich jedoch über Erklärungen/Anmerkungen, weil ich das ganze dann doch am Ende halbwegs verstehen möchte.
Sollte mein Unterfangen zu komplex/arbeitsintensiv sein, um das an dieser Stelle reinzustellen, kann ich mit der Aussage auch leben.
Ich verwende Windows 10 habe Python 3.7.2 installiert, den Code schreibe ich in MS Visual Studio 2017.
Der ausführende PC besitzt jedoch nur Python 3.7 und läuft unter Windows 10.
Fehelende Angaben werde ich natürlich schnellstmöglich nachreichen.
Schonmal besten Dank im Voraus.
Gruß
SRT
Also folgendes soll das Programm tun:
1. Auf einen Mailserver mittels IMAP verbinden
2. Die E-Mail eines bestimmten Absenders abwarten (Diese Mail wird immer einen PDF Anhang haben)
3. Den Inhalt der PDF Datei auslesen (die Formatierung soll möglichst erhalten bleiben)
4. Den ausgelesenen Inhalt in eine Mail kopieren
5. Neue Email, per SMTP, mit dem PDF Inhalt an einen bestimmten Kontakt versenden
6. Das Programm soll das 24/7 tun bis es manuell beendet wird
(7. Ein Log File schreiben/optional ist mir gerade so eingefallen, muss nicht wäre aber cool)
Zu 1.
Dazu verwende ich "imaplib"
Hier wird soweit ich das Verstanden habe ja aber der text der Mail ausgelesen, der ist jedoch uninteressant. Wie kann ich quasi den PDF Anhang zur weiteren Bearbeitung "auswählen"
Code: Alles auswählen
mail = imaplib.IMAP4_SSL('imap.web.de')
mail.login('Mailadresse', 'Passwort')
mail.list()
mail.select("inbox")
result, data = mail.search(None, "ALL")
ids = data[0]
id_list = ids.split()
latest_email_id = id_list[-1]
result, data = mail.fetch(latest_email_id, "(RFC822)")
raw_email = data[0][1]
dazu ist mir keine richtige Lösung über den weg gelaufen. Im Moment habe ich die Krücke, dass mein Mail Programm automatisch den Anhang speichert und ich den Ordner überwache.
Außerdem lässt dieser Teil das Programm laufen bis eine Taste gedrückt wird.
Dazu dieser Teil:
Code: Alles auswählen
class ExampleHandler(FileSystemEventHandler):
def on_created(self, event): # when file is created
# do something, eg. call your function to process the image
time.sleep(3)
Email()
print('Ausgeführt')
observer = Observer()
event_handler = ExampleHandler() # create event handler
# set observer to use created handler in directory
observer.schedule(event_handler, path='C:\Test')
observer.start()
# sleep until keyboard interrupt, then stop + rejoin the observer
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()
zu 3.
Hier sieht man noch den Umstand, dass ich immer einfach nur die neuste Datei nehme. Ich würde den Weg aber eben gerne vermeiden. Der Anhang muss eigneltich nicht abgespeichert werden sondern nur Verarbeitet.
Code: Alles auswählen
list_of_files = glob.glob('C:\Test\*.pdf')
#* means all if need specific format then *.csv
latest_file = max(list_of_files, key=os.path.getctime)
pdf_file = latest_file
read_pdf = PyPDF2.PdfFileReader(pdf_file)
number_of_pages = read_pdf.getNumPages()
page = read_pdf.getPage(0)
page_content = page.extractText()
#print (page_content)
Den Punkt fasse ich mal zusammen, hoffentlich ist das richtig.
Der page_content kommt vom auslesen der PDF, leider ist die Formatierung komplett weg.
Versendet wird per SMTP.
Code: Alles auswählen
fromaddr = "Adresse1"
toaddr = "Adresse2"
msg = MIMEMultipart()
msg['From'] = fromaddr
msg['To'] = toaddr
msg['Subject'] = "TEST"
#body = page_content
msg.attach(MIMEText(page_content, 'plain'))
server = smtplib.SMTP('smtp.web.de', 587)
server.starttls()
server.login(fromaddr, "Passwort")
text = msg.as_string()
server.sendmail(fromaddr, toaddr, text)
server.quit()