[python] IMAP, Gmail und encoding

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [python] IMAP, Gmail und encoding

    Hey,
    nach ca. vier Jahren ohne Post, jetzt mal wieder ich... und dann nicht mal PHP

    Ich versuch email (betreffe) per imap von gmail abzurufen, hab aber probleme. obwohl ich ca. 200 code varianten ausprobiert habe die man so über google findet.

    wenn die email non-ascii zeichen enthällt bekomme ich:
    Code:
    Subject: Beste =?ISO-8859-15?Q?Gr=FC=DFe?=
    statt:
    Code:
    Subject: Beste Grüße
    Der Code ist:
    Code:
    #!/usr/bin/python
    import email, getpass, imaplib, os,re
    m = imaplib.IMAP4_SSL("imap.googlemail.com",993)
    m.login(user,pwd)
    m.select("INBOX")
    resp, data = m.search(None, "FLAGGED")
    keys = data[0].split()
    for num in keys:
            raw = m.fetch(num, '(BODY.PEEK[HEADER.FIELDS (SUBJECT)])')[1][0][1]
            subj = email.Header.decode_header(raw)
            subject = u"".join([unicode(text, charset or "utf-8") for text, charset in subj])
            print subject
    Any hints would be much appreciated
    Die Musikreview Seite

    hi, i'm a signature virus. copy me into your signature to help me spread.

  • #2
    Hallo,

    so werden Sonderzeichen in Kopfzeilen codiert, es ist also nichts falsch daran, dass du sowas bekommst.

    MIME - Wikipedia, the free encyclopedia

    Gruß,

    Amica
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

    Kommentar


    • #3
      Hey, danke für deine Antwort.

      Ja das weiß ich, aber sollte:

      Code:
      email.Header.decode_header
      sich nicht darum kümmern?
      Die Musikreview Seite

      hi, i'm a signature virus. copy me into your signature to help me spread.

      Kommentar


      • #4
        Achso, sorry, hab mir deinen Code mangels Python-Kenntnissen nicht angesehen. Auf den ersten Blick sollte es das tun, da geb ich dir recht, aber was der Code jetzt genau macht, bleibt mir als Nicht-Python verborgen.
        [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
        Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
        Super, danke!
        [/COLOR]

        Kommentar


        • #5
          Zitat von Tartax Beitrag anzeigen
          ... sollte:

          Code:
          email.Header.decode_header
          sich nicht darum kümmern?
          Im Prinzip ja. Daher würde ich mal vermuten, dass der Fehler im übergebenen Header-String liegt. Lass dir doch mal probeweise den Wert von raw vor dem Aufruf von .decode_header() und danach die beiden Rückgabewerte anzeigen.
          Zuletzt geändert von fireweasel; 05.04.2011, 12:07.
          Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

          Kommentar


          • #6
            Jup, gerade gemacht, raw scheint in ordnung zu sein, aber mir ist aufgefallen dass es bei utf-8 klappt. iso-8859 schient das problem zu sein:

            erst mail (iso):
            Code:
            raw: Subject: Fwd: Beste =?ISO-8859-15?Q?Gr=FC=DFe?=
            
            subj: [('Subject: Fwd: Beste =?ISO-8859-15?Q?Gr=FC=DFe?=\r\n\r\n', None)]
            output: Subject: Fwd: Beste =?ISO-8859-15?Q?Gr=FC=DFe?=

            zweite email(utf):
            Code:
            raw: Subject: =?UTF-8?B?0JLQuNC60YLQvtGAINCS0L7RgNC+0LHRh9GD0Lo=?=
             =?UTF-8?B?IHBvc3RlZCBvbiB5b3Vy?= =?UTF-8?B?IFdhbGwu?=
            
            subj: [('Subject:', None), ('\xd0\x92\xd0\xb8\xd0\xba\xd1\x82\xd0\xbe\xd1\x80 \xd0\x92\xd0\xbe\xd1\x80\xd0\xbe\xd0\xb1\xd1\x87\xd1\x83\xd0\xba posted on your Wall.', 'utf-8'), ('', None)]
            output: Subject:Виктор Воробчук posted on your Wall.
            Die Musikreview Seite

            hi, i'm a signature virus. copy me into your signature to help me spread.

            Kommentar


            • #7
              Zitat von Tartax Beitrag anzeigen
              Jup, gerade gemacht, raw scheint in ordnung zu sein, aber mir ist aufgefallen dass es bei utf-8 klappt. iso-8859 schient das problem zu sein:

              erst mail (iso):
              Code:
              raw: Subject: Fwd: Beste =?ISO-8859-15?Q?Gr=FC=DFe?=
              
              subj: [('Subject: Fwd: Beste =?ISO-8859-15?Q?Gr=FC=DFe?=\r\n\r\n', None)]
              output: Subject: Fwd: Beste =?ISO-8859-15?Q?Gr=FC=DFe?=

              zweite email(utf):
              Code:
              raw: Subject: =?UTF-8?B?0JLQuNC60YLQvtGAINCS0L7RgNC+0LHRh9GD0Lo=?=
               =?UTF-8?B?IHBvc3RlZCBvbiB5b3Vy?= =?UTF-8?B?IFdhbGwu?=
              
              subj: [('Subject:', None), ('\xd0\x92\xd0\xb8\xd0\xba\xd1\x82\xd0\xbe\xd1\x80 \xd0\x92\xd0\xbe\xd1\x80\xd0\xbe\xd0\xb1\xd1\x87\xd1\x83\xd0\xba posted on your Wall.', 'utf-8'), ('', None)]
              output: Subject:Виктор Воробчук posted on your Wall.
              Mhmmm, das ist merkwürdig. Die Zeichensatz-Kodierung (ISO-Latin, UTF-8) sollte keine Rolle spielen, sie wird nur als Klartext zurückgeliefert. Wenn der Ausgangsstring zurückgeliefert wird, hat .decode_header() die Quoted-Printable-Kodierung nicht erkannt. Der dazu (in email/mail.py) benutzte RegEx lautet:

              Code:
              ecre = re.compile(r'''
                =\?                   # literal =?
                (?P<charset>[^?]*?)   # non-greedy up to the next ? is the charset
                \?                    # literal ?
                (?P<encoding>[qb])    # either a "q" or a "b", case insensitive
                \?                    # literal ?
                (?P<encoded>.*?)      # non-greedy up to the next ?= is the encoded string
                \?=                   # literal ?=
                (?=[ \t]|$)           # whitespace or the end of the string
                ''', re.VERBOSE | re.IGNORECASE | re.MULTILINE)
              Ich sehe nicht, wo der auf deinen Header nicht passen sollte.

              Wenn man ein wenig herumgoogelt, findet man zu .header_decode() lediglich "Bugs", die mit (nichtvorhandenen) Leerzeichen am Ende eines kodierten Teilstücks zu tun haben. Du könntest versuchsweise ein Leerzeichen vor den Zeilenumbruch einfügen, um zu sehen, ob das Zeilenende nicht richtig erkannt wird. Aber $ und MULTILINE (entspricht /m in PCRE) sollten eigentlich zusammenpassen.
              Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

              Kommentar

              Lädt...
              X