Seite 1 von 1

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

Verfasst: Freitag 3. Februar 2023, 00:32
von LED
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

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

Verfasst: Freitag 3. Februar 2023, 09:15
von __deets__
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.

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

Verfasst: Freitag 3. Februar 2023, 11:29
von Sirius3
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)}"

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

Verfasst: Freitag 3. Februar 2023, 20:17
von LED
__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

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

Verfasst: Freitag 3. Februar 2023, 22:15
von __blackjack__
@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.

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

Verfasst: Freitag 3. Februar 2023, 22:46
von __deets__
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.

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

Verfasst: Sonntag 5. Februar 2023, 12:20
von LED
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?

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

Verfasst: Sonntag 5. Februar 2023, 13:18
von Sirius3
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.

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

Verfasst: Sonntag 5. Februar 2023, 19:41
von LED
Alles klar, jetzt habe ich es ausprobiert und verstanden. Es funktioniert!

Vielen Dank!