Email mit Python versenden

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
erdmulch
User
Beiträge: 230
Registriert: Samstag 17. Juli 2010, 19:50

Hallo zusammen,

Ich würde gerne eine email mit Python versenden:
der Code lautet wie folgt:

Code: Alles auswählen

[/
import smtplib
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
from email.mime.multipart import MIMEMultipart
 
fromaddr = "von@gmx.de"
toaddr = "an@gmx.de"
 
msg = MIMEMultipart()
 
msg['From'] = fromaddr
msg['To'] = toaddr
msg['Subject'] = "SUBJECT OF THE EMAIL"
 
body = "TEXT YOU WANT TO SEND"
 
msg.attach(MIMEText(body, 'plain'))
 
filename = "951635.jpg"
attachment = open("c:\temp\951635.jpg", "rb")
 
part = MIMEBase('application', 'octet-stream')
part.set_payload((attachment).read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', "attachment; filename= %s" % filename)
 
msg.attach(part)
 
server = smtplib.SMTP('smtp.gmx.de', 587)
server.starttls()
server.login(fromaddr, "geheim")
text = msg.as_string()
server.sendmail(fromaddr, toaddr, text)
server.quit()


Python]


Ohne Anlage lässt sich die Email ohne Probleme versenden.
mit Anlage, erscheint folgende Fehlermeldung:
    attachment = open("c:\temp\951635.jpg", "rb")
OSError: [Errno 22] Invalid argument: 'c:\temp\\951635.jpg'


Klar, dass es nicht geht wenn 2  "\\" im Pfad sind. Aber warum macht dies Python?
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Das sind keine 2 \ im Pfad, '\\' ist *ein* Zeichen, nämlich *ein* \. Das Problem ist das \t, denn das ist auch *ein* Zeichen, nämlich ein Tabulator-Zeichen.

Code: Alles auswählen

In [1]: len('\\')
Out[1]: 1

In [2]: print('\\')
\

In [3]: print('a\\b')
a\b

In [4]: len('\t')
Out[4]: 1

In [5]: print('a\tb')
a       b
Wenn man \ in einer Zeichenkette haben will (und keine Escape-Sequencen für Sonderzeichen), dann sollte man ein ”raw”-Zeichenkettenliteral verwenden, in dem man ein r voran stellt. Also ``open(r'c:\temp\951635.jpg', 'rb')``.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
erdmulch
User
Beiträge: 230
Registriert: Samstag 17. Juli 2010, 19:50

Kann mir jetzt noch jemand sagen, wie ich äöüß in die email schreiben kann, ohne dass eine Fehlermeldung kommt?

Code: Alles auswählen

body.encoding('utf-8')
funktioniert jedenfalls nicht ;-(
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@erdmulch: Die Methode heisst ja auch `encode()`. Und man muss dem `MIMEText` dann auch sagen wie der Text kodiert ist, denn der Empfänger muss ja wissen wie er das wieder dekodieren muss.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

@erdmulch: email ist komplizierter als man das glaubt. Statt dich mit solchen Details rum zu ärgeren, installier dir das Paket marrowmailer, und benutz das einfach. Das hat eine ganz simple API & kümmert sich für dich um Dinge wie encodings und attachments.
Antworten