Ordner mit Pdf`s mailen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
DMD
User
Beiträge: 123
Registriert: Sonntag 17. Mai 2015, 03:34

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
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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)
            )
the more they change the more they stay the same
DMD
User
Beiträge: 123
Registriert: Sonntag 17. Mai 2015, 03:34

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.
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.
DMD
User
Beiträge: 123
Registriert: Sonntag 17. Mai 2015, 03:34

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?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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.
the more they change the more they stay the same
DMD
User
Beiträge: 123
Registriert: Sonntag 17. Mai 2015, 03:34

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?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Nochmal: Hoer auf mit dem raten. Du musst einen Buchstaben hinzufuegen welcher das ist und wo kannst du in meinem Link nachlesen.
Benutzeravatar
/me
User
Beiträge: 3552
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
Antworten