Python E-Mail mit Umlauten

  • Guten Morgen miteinander,

    Ich würde mir gerne via Python eine Mail senden, dies Funktioniert auch mit:

    wunderbar.

    Nun ist das Problem das Umlaute (öäü) nicht richtigt dargestellt werden.

    Kann mir jemand helfen?

    Freundliche Grüsse
    Schnibli

    Ready when you are :bravo2:

  • Hier mal eine Vorlage:


    Die vielen Kommentare machen den Code schlecht lesbar.

    Edit:
    - Die Einrückungen sind von dieser kaputten Forensoftware reduziert worden.
    - Den Teil mit dem Anhang kannst du auch weglassen. Wichtig ist die unicode Kodierung ``_charset='utf-8'``.

  • Ich habe es jetzt mal so abgeänder:

    Aber leider werden die Umlaute immer noch nicht richtig dargestellt :s

    Ready when you are :bravo2:

    Einmal editiert, zuletzt von schnibli (13. Dezember 2016 um 18:24)

  • Du benutzt auch kein Junicode-Literale fuer deine Umlaute. Da gehört ein u davor ->

    Code
    u"ö"
  • Komisch, bei mir (Outlook) kommen die Zeichen so an, wie ich sie gesendet habe.

    mit ``_charset='utf-8'``: "ÖSTERÜÜäääüü"
    ohne ``_charset='utf-8'``: "C STERC C C$C$C$C<C<"
    ohne ``_charset='utf-8'` mit unicode_literals: "UnicodeEncodeError: 'ascii' codec can't encode character u'\xd6' in position 0: ordinal not in range(128)"

    Edit:

    Code
    msg.attach(MIMEText(text.encode('utf-8'), _charset='utf-8'))
    ...
    ...
       send_mail(["rsc@test.ch"],
                 "Betreff",
                 u"ÖSTERÜÜüü"
               )
  • bootsmann kein Wunder, wenn zwar brav utf-8 als encoding in deinen header schreibst, aber dann dein Editor auf latin1 steht.... das muss schon zusammenpassen.

    Code
    Python 2.7.11 (v2.7.11:6d1b6a68f775, Dec  5 2015, 12:54:16)
    [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> '\xd6'.decode('latin1')
    u'\xd6'
    >>> '\xd6'.decode('latin1').encode('utf-8')
    '\xc3\x96'
    >>> print('\xd6'.decode('latin1').encode('utf-8'))
    Ö
  • Ah, jetzt sehe ich - der Fehler kam von tiefer. Aber es muss consistent sein, um sicher zu gehen, dass der Bytestring das richtige encoding hat, sollte man

    - einen unicode-String verwenden,
    - den aber vor der Eingabe mit genau dem encoding enkodieren, welches man im charset angegeben hat. Sonst ist Essig.

    Ich persönlich benutze fuer Mail eh nur noch das hier: https://github.com/marrow/mailer

  • Vor einiger Zeit habe ich das Problem in Java so gelöst:

    Code
    String body = "blah ü ö ä Ü Ö Ä ß"
           String destString = body.replaceAll(" ", "&nbsp;").replaceAll(System.getProperty("line.separator"), "<br />").replaceAll("€", "&euro").replaceAll("ö", "&ouml;").
                   replaceAll("Ö", "&Ouml;").replaceAll("ä", "&auml;").replaceAll("Ä", "&Auml;").replaceAll("ü", "&uuml;").replaceAll("Ü", "&Uuml;").
                   replaceAll("ß", "&szlig;");

    Wobei das replaceAll(" ", "&nbsp;") unbedingt an erster Stelle muss. Müsste wohl in Py auch hin zu bekommen sein.

  • Das geht aber nur bei HTML-Emails. Das sind ja nicht alle. Und man kann es schon hinbekommen, haben andere halt Bibliotheken fuer geschrieben.


  • Nur-Text-EMails gibt es nur wenn der Benutzer es explizit wählt.
    Ansonsten ist alles HTML-Standard.

    Auch wenn viele Email-Clients (mua) HTML als default-Format eingestellt haben, bleibt Email ohne extra Deklaration text/plain (siehe rfc2822 - 2.3).

    Wenn du nichts zu sagen hast, sag einfach nichts.

    Einmal editiert, zuletzt von llutz (14. Dezember 2016 um 21:28)

  • Hallo Zusammen.

    Vielen Dank für die Zahlreichen Beiträge.
    Beim Beispiel von Bootsman war es tatsächlich die Formatierung (Kodierung) von Notepad ++

    Nun meine Frage. Wie kann ich mein Beispiel Anpassen sodass es Funktioniert? :) Geht das überhaupt? (Kodierung wurde schon geändert aber ohne erfolg.)


    Gruss Schnibli

    Ready when you are :bravo2:

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!