Python E-Mail mit Umlauten

Registriere dich jetzt, um exklusive Vorteile zu genießen! Als registriertes Mitglied kannst du Inhalte herunterladen und profitierst von einem werbefreien Forum.
Mach mit und werde Teil unserer Community!
  • 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:

    Edited once, last by schnibli ().

  • 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.

    Edited once, last by llutz ().

  • 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: