Seite 1 von 1

Ordner mit Pdf`s mailen

Verfasst: Freitag 11. September 2015, 23:37
von DMD
hallo
wie kann ich einen ordner, in dem sich pdf-dateien befinden,
zippen und dann als email verschicken.
mein code bisher

Code: Alles auswählen

    TO = 'du@gmx.de'
    FROM = 'ich@gmx.de'
    SUBJECT = 'Text'

    MESSAGE = """
    Hier steht Mailtext drin
    """

    msg = MIMEMultipart()
    msg['From'] = FROM
    msg['To'] = TO
    msg['Subject'] = SUBJECT
    msg.attach(MIMEText(MESSAGE))

    Tk().withdraw()
    filename = askopenfilename()
    fp=open(filename,'rb')
    att = email.mime.application.MIMEApplication(fp.read(),_subtype="pdf")
    fp.close()
    att.add_header('Content-Disposition','attachment',filename=filename)
    msg.attach(att)

    mailserver = smtplib.SMTP('mail.gmx.net', 587)
    mailserver.ehlo()
    mailserver.starttls()
    mailserver.ehlo()
    mailserver.login(FROM, 'Passwort')

    mailserver.sendmail(FROM, TO, msg.as_string())

    mailserver.quit()

bisher funktionierts nur mit einer pfd datei

Re: Ordner mit Pdf`s mailen

Verfasst: Freitag 11. September 2015, 23:56
von Dav1d
zipfile:

Code: Alles auswählen

    zip_path = os.path.join(directory, 'glad.zip')
    with open(zip_path, 'w') as fobj:
        zipf = zipfile.ZipFile(fobj, mode='w')
        write_dir_to_zipfile(directory, zipf, exclude=['glad.zip'])
        zipf.close()

Code: Alles auswählen

def write_dir_to_zipfile(path, zipf, exclude=None):
    if exclude is None:
        exclude = []

    for root, dirs, files in os.walk(path):
        for file_ in files:
            if file_ in exclude:
                continue

            zipf.write(
                os.path.join(root, file_),
                os.path.relpath(os.path.join(root, file_), path)
            )

Re: Ordner mit Pdf`s mailen

Verfasst: Samstag 12. September 2015, 01:35
von DMD
wie bekomm ich das denn zum laufen:

Code: Alles auswählen

import os
import zipfile

def write_dir_to_zipfile(path, zipf, exclude=None):
    if exclude is None:
        exclude = []

    for root, dirs, files in os.walk(path):
        for file_ in files:
            if file_ in exclude:
                continue

            zipf.write(
                os.path.join(root, file_),
                os.path.relpath(os.path.join(root, file_), path)
            )

directory = 'C:\\Users\\DMD-OL\\Desktop'

zip_path = os.path.join(directory, 'Neuer Ordner.zip')
with open(zip_path, 'w') as fobj:
    zipf = zipfile.ZipFile(fobj, mode='w')
    write_dir_to_zipfile(directory, zipf, exclude=['Neuer Ordner.zip'])
    zipf.close()
so wie es jetzt hier ist, bekomm ich eine diagnostic message "C:\Users\DMD-OL\Desktop\Neuer Ordner.zip: Unexpected end of archive"
ich möchte gern den ordner: Neuer Ordner (in welchem eine pdf-datei drin is) zippen und dann rausballern.

Re: Ordner mit Pdf`s mailen

Verfasst: Samstag 12. September 2015, 03:42
von BlackJack
@DMD: Es gibt einen Unterschied zwischen Text- und Binärdateien. Insbesondere unter Windows ist es wichtig das man Dateien im richtigen Modus öffnet, also wenn man sich nicht sicher ist das es Text ist, dann immer als Binärdatei. Und sowohl ZIP- als auch PDF-Dateien sind Binärdateien.

Das ZIP in den gleichen Ordner zu legen wie den, den man da reinpacken möchte ist vielleicht etwas ungünstig weil man dann das ZIP in sich selbst steckt wenn man nicht aufpasst.

Re: Ordner mit Pdf`s mailen

Verfasst: Samstag 12. September 2015, 05:44
von DMD
da hast du natürlich absolut recht (hab nix verstanden).

also irgendwo hier

Code: Alles auswählen

directory = 'C:\\Users\\DMD-OL\\Desktop'
 
zip_path = os.path.join(directory, 'Neuer Ordner.zip')
with open(zip_path, 'w') as fobj:
    zipf = zipfile.ZipFile(fobj, mode='w')
    write_dir_to_zipfile(directory, zipf, exclude=['Neuer Ordner.zip'])
    zipf.close()
ist der fehler und es ist nicht ['Neuer Ordner.zip'], right?

Re: Ordner mit Pdf`s mailen

Verfasst: Samstag 12. September 2015, 06:49
von cofi
Bevor du jetzt noch weiter raetst welche Teile es sein koennten, lese nochmal den Post von BlackJack.
Du erstellst die Zip Datei im Text-Modus, aber eine Zip Datei enthaelt nunmal keinen Text.

Wie du eine Datei im Binaer-Modus erstellst, sagt dir die Dokumentation: https://docs.python.org/2/library/functions.html#open

Re: Ordner mit Pdf`s mailen

Verfasst: Samstag 12. September 2015, 12:44
von Dav1d
Sorry, hätte mehr zum Code schreiben sollen als ihn nur hinzuklatschen. BlackJack und Cofi haben dich ja schon in die richtige Richtung gewiesen, es funktioniert bei mir, da ich das ganze unter Linux ausgeführt habe, Windows handelt das ein bisschen anders (mehr dazu in Cofi's Link).

`exclude` existiert hauptsächlich um nicht die Zip-Datei die man gerade schreibt mitzuzippen. Es ist ein bisschen einfach implementiert, da es nur den Dateinamen überprüft aber nicht den Pfad, war aber für meinen Usecase ausreichend.

Re: Ordner mit Pdf`s mailen

Verfasst: Samstag 12. September 2015, 19:17
von DMD
das heisst also
1. die pdf-datei in binärcode umwandeln
2. binarcod- pdf in den ordner rein
3. ordner mit binär pdf zippen
richtig?

Re: Ordner mit Pdf`s mailen

Verfasst: Samstag 12. September 2015, 20:06
von cofi
Nochmal: Hoer auf mit dem raten. Du musst einen Buchstaben hinzufuegen welcher das ist und wo kannst du in meinem Link nachlesen.

Re: Ordner mit Pdf`s mailen

Verfasst: Sonntag 13. September 2015, 11:52
von /me
DMD hat geschrieben:das heisst also
1. die pdf-datei in binärcode umwandeln
2. binarcod- pdf in den ordner rein
3. ordner mit binär pdf zippen
Verstehst du diese Aussagen eigentlich selber? Wenn ja, dann erkläre mal bitte, was du damit meinst, denn außer dir kann sich vermutlich niemand etwas darunter vorstellen (Was soll ein "Binärcode-PDF" sein?). Wenn du erklärst was du damit meinst, dann können wir vielleicht mit falsch vorgestellten Konzepten deinerseits aufräumen.

Du hast doch die Antwort schon bekommen: Öffne die Datei im Binärmodus. Wenn du jetzt fragst "Welche?", dann schau doch mal bitte in deinem Code nach, an wie vielen Stellen du denn eine Datei mit open öfnest.