E-Mail mit Anhang versenden, .bin statt .csv

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
LED
User
Beiträge: 4
Registriert: Freitag 3. Februar 2023, 00:26

Moin,
ich habe folgenden Code der soweit auch funktioniert:

Code: Alles auswählen

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders

def send_email(filename, recipient_email):
    sender_email = "no-reply@domain.de"
    subject = "CSV-Datei als Anhang"
    message = "Finden Sie anbei die angeforderte CSV-Datei"
    msg = MIMEMultipart()
    msg['From'] = sender_email
    msg['To'] = recipient_email
    msg['Subject'] = subject
    msg.attach(MIMEText(message))
    attachment = MIMEBase("application", "octet-stream")

    with open(filename, "r") as file:
        attachment.set_payload((file).read())
    encoders.encode_base64(attachment)
    attachment.add_header(
        "Content-Disposition",
        f"attachment; filename={filename}",
    )
    msg.attach(attachment)
    smtp = smtplib.SMTP('mail.domain.de', 25)
    #smtp.starttls()
    smtp.sendmail(sender_email, recipient_email, msg.as_string())
    smtp.quit()
    
    
send_email("liste.csv", "name@domain.de")
Liegt die CSV-Datei im Skript Verzeichnis, wird diese auch als Anhang empfangen. Ändere ich jedoch den Aufruf in:

Code: Alles auswählen

send_email(r"\\domain.de\data\Rückfragen\liste.csv", "name@domain.de")
Wird die E-Mail ebenfalls versendet, die Datei jedoch als "ATT000001.bin" empfangen. Leider habe ich Umlaute im Netzwerkpfad... aber kann es daran wirklich liegen?

Viele Grüße
Knut
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ein stinknormales Open kann keine Dateien über das Netz holen. Da musst du schon eine Freigabe gemounted haben, oder die Datei via HTTP runterladen, oder sowas.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Es kann sein, dass absolute Pfade als `filename` nicht gern gesehen werden. Deshalb solltest Du nur den Dateinamen ohne Pfad angeben:

Code: Alles auswählen

f"attachment; filename={os.path.basename(filename)}"
LED
User
Beiträge: 4
Registriert: Freitag 3. Februar 2023, 00:26

__deets__ hat geschrieben: Freitag 3. Februar 2023, 09:15 Ein stinknormales Open kann keine Dateien über das Netz holen. Da musst du schon eine Freigabe gemounted haben, oder die Datei via HTTP runterladen, oder sowas.
Es handelt sich dabei um einen Pfad zu einem Netzlaufwerk auf einem Windows Server (VM). Ich greife immer so auf meine Dateien zu und es funktioniert.
Wie gesagt, die Datei wird auch angehängt und der Inhalt der CSV Datei ist dabei, nur wird der Anhang als .bin angehängt. Und es liegt wirklich nur am Pfad.
Sirius3 hat geschrieben: Freitag 3. Februar 2023, 11:29 Es kann sein, dass absolute Pfade als `filename` nicht gern gesehen werden. Deshalb solltest Du nur den Dateinamen ohne Pfad angeben:
Das macht irgendwie keinen Sinn. Aber da es ja im Skriptordner funktioniert, werde ich mir erst Mal so helfen, dass ich die Datei vom Netzlaufwerk in den Skriptordner kopiere und nach dem Versenden wieder lösche.
Mich würde aber trotzdem interessieren, wie ich den "Fehler" beheben kann bzw. was die Ursache ist.

Viele Grüße
Knut
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@LED: Doch das macht sehr wohl Sinn. Ein absoluter Pfad bei einem Dateianhang ist üblicherweise ein Angriffsversuch in der Hoffnung man könne so beim Empfänger gezielt irgendwo eine Datei überschreiben oder platzieren. Du solltest da ganz unabhängig irgendwelcher anderer Probleme tatsächlich nur den Dateinamen in den MIME-Header packen. Wo die Datei her kommt ist dabei egal, die kann weiterhin von einem absoluten Pfad kommen, aber die Metainformation für den Dateinamen sollte tatsächlich nur den Dateinamen enthalten und nicht noch zusätzlich einen Pfad. Diese Information ist ja nur dazu da, dass der Empfänger weiss wie die Datei heisst. Wo der Empgfänger die Datei dann abspeichert, sollte er das tatsächlich explizit tun, legt er dann ja selber fest.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

LED hat geschrieben: Freitag 3. Februar 2023, 20:17
__deets__ hat geschrieben: Freitag 3. Februar 2023, 09:15 Ein stinknormales Open kann keine Dateien über das Netz holen. Da musst du schon eine Freigabe gemounted haben, oder die Datei via HTTP runterladen, oder sowas.
Es handelt sich dabei um einen Pfad zu einem Netzlaufwerk auf einem Windows Server (VM). Ich greife immer so auf meine Dateien zu und es funktioniert.
Wie gesagt, die Datei wird auch angehängt und der Inhalt der CSV Datei ist dabei, nur wird der Anhang als .bin angehängt. Und es liegt wirklich nur am Pfad.
Ich habe mich verguckt, war also Quatsch. Sirius3 und Blackjack haben ja aber die Ursache erkannt.
LED
User
Beiträge: 4
Registriert: Freitag 3. Februar 2023, 00:26

OK, ich glaube ich habe es nur halb verstanden. Als Parameter übergebe ich nur den Namen des Anhangs.

Aber wie lege ich dann vorher den Pfad fest?
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Natürlich den kompletten Pfad. Wie sonst sollst du denn die Datei laden können? Bei attachment aber dann nur den Dateinamen. So wie ich es dir gezeigt habe.
LED
User
Beiträge: 4
Registriert: Freitag 3. Februar 2023, 00:26

Alles klar, jetzt habe ich es ausprobiert und verstanden. Es funktioniert!

Vielen Dank!
Antworten