Seite 1 von 1

Mails + Python - zip als Angang geht nicht

Verfasst: Dienstag 4. Mai 2010, 09:11
von PreludeBA4
Hallo leute,

ich hab da ein kleines Problem, nach dessen Antwort ich mich seit gestern schon dumm und dämlich suche.
Ich möchte mit meinem Python-Script eine Mail versenden mit einem ZIP-Archiv als Anhang. Im KMail zeigt er es auch an aber zB. unter Outlook oder im RoundCube Webmail wird es nicht angezeigt :?

Hier mal der Code:

Code: Alles auswählen

        self.funcSendMail(["xxx@xxx.com", ], ["", ], ["", ], subject, name_of_file, text, text_anhang, os.path.basename(log_file))

def funcSendMail(self, to, cc, bcc, subject, name_of_file, text, text_anhang='', logfile=''):
        
        # Verbindung zum Mail-Server
        server = SMTP(options["mail_server"])

        msg = MIMEMultipart('alternative')

        # Anzeigedaten
        msg['From'] = options["mail_from"]
        ##msg['To'] = (';').join(to)
        msg['To'] = options["mail_to"]
        ##msg['Cc'] = cc
        msg['Cc'] = options["mail_cc"]
        msg['Bcc'] = options["mail_bcc"]
        msg['Subject'] = subject
        
        # Temporäres Log-File erstellen
        logfile_tmp = open(logfile, 'w')
        logfile_tmp.write(text_anhang)
        logfile_tmp.close()
        
        # Log-File öffnen und auslesen
        # Zip-Datei erstellen und Log-File hinein schreiben
        logfile_in = open(logfile, 'rb')
        ##logfile_out = gzip.open(logfile+'.gz', 'wb')
        ##logfile_out.writelines(logfile_in)
        ##logfile_out.close()
        logfile_out = zipfile.ZipFile(logfile+'.zip', 'w')
        logfile_out.write(logfile, os.path.basename(logfile), zipfile.ZIP_DEFLATED)
        logfile_out.close()
        logfile_in.close()

        # Text als .txt und .html anfügen
        part1 = MIMEText(text, 'plain')
        ##part2 = MIMEText(html, 'html')
        
        # Zip-Datei Attachment erstellen und anhängen
        ##path = logfile+'.gz'
        path = logfile+'.zip'
        ctype, encoding = mimetypes.guess_type(path)
        if ctype is None or encoding is not None:
            ctype = 'application/octet-stream'
        maintype, subtype = ctype.split('/', 1)
        fp = open(path, 'rb')
        part3 = MIMEBase('application', 'zip')
        part3.set_payload(fp.read())
        fp.close()
        # Encode the payload using Base64
        Encoders.encode_base64(part3)

        part3.add_header('Content-Disposition', 'attachment', filename=os.path.basename(path))
        

        msg.attach(part1)
        ##msg.attach(part2)
        msg.attach(part3)

        # Mail versenden
        server.sendmail('xxx@xxx.com', to+cc+bcc, msg.as_string())
        
        # Verbindung zum Server trennen und Temporäre Dateien löschen
        server.quit()
        os.remove(logfile)
        ##os.remove(logfile+'.gz')
        os.remove(logfile+'.zip')

Kann mir da jemand weiter helfen oder zumindest sagen, warum er im KMail angezeigt wird und überall anders nicht?! :(


MFG Ronny

Verfasst: Dienstag 4. Mai 2010, 10:02
von BlackJack
@PreludeBA4: "alternative" scheint mir der falsche Multipart-Typ hierfür zu sein. Das bedeutet, dass die enthaltenen Teile die gleichen Informationen, nur unterschiedlich kodiert, enthalten und der Mail-Client sich den oder die davon zur Anzeige aussuchen kann, mit denen er etwas anfangen kann. Klassisches Beispiel ist hier Plain-Text und HTML als Alternativen, die ja im Grunde die gleichen Informationen enthalten (sollten).

Diese beiden Varianten werden von den meisten Mail-Clients angezeigt, weil die meisten halt auch HTML anzeigen können, oder zumindest wissen wie man dafür eine externe Anwendung startet. Mann könnte zum Beispiel die gleiche Mail auch als RTF-Dokument als Alternative verschicken, und da würden wahrscheinlich mehrere Mailclients sagen -- damit kann ich nichts anfangen, ich zeige einfach den Text/HTML-Teil und gut ist.

Für Attachements wird normalerweise "mixed" als Multypart-Typ verwendet.

Verfasst: Dienstag 4. Mai 2010, 10:20
von PreludeBA4
Vielen dank für die schnelle Antwort. :)
Hab von dem Email-Zeugs leider noch nicht so den Plan mit den ganzen MIME-Typen etc. :(
Aber das scheint der Fehler gewesen zu sein :)

Zumindest im Webmail wird es jetzt angezeigt. Wie es in Outlook etc. ist kann ich im Moment nicht gucken aber wird schon passen denk ich.


Nochmals vielen Dank :D