Question

J'extrait des e-mails de Gmail en utilisant les éléments suivants:

def getMsgs():
 try:
    conn = imaplib.IMAP4_SSL("imap.gmail.com", 993)
  except:
    print 'Failed to connect'
    print 'Is your internet connection working?'
    sys.exit()
  try:
    conn.login(username, password)
  except:
    print 'Failed to login'
    print 'Is the username and password correct?'
    sys.exit()

  conn.select('Inbox')
  # typ, data = conn.search(None, '(UNSEEN SUBJECT "%s")' % subject)
  typ, data = conn.search(None, '(SUBJECT "%s")' % subject)
  for num in data[0].split():
    typ, data = conn.fetch(num, '(RFC822)')
    msg = email.message_from_string(data[0][1])
    yield walkMsg(msg)

def walkMsg(msg):
  for part in msg.walk():
    if part.get_content_type() != "text/plain":
      continue
    return part.get_payload()

Cependant, certains e-mails que je reçois sont presque impossibles pour moi d'extraire des dates (en utilisant Regex) à partir de caractères liés à l'encodage tels que '=', atterrit au hasard au milieu de divers champs de texte. Voici un exemple où il se produit dans une plage de dates que je souhaite extraire:

Nom: Kirsti Courriel: kirsti@blah.blah # Téléphone: + 999 99995192 Total dans la fête: 4 Total, 0 Enfants Arrivée / Départ: 9 octobre = 2010 - 13 octobre 2010 - 13 octobre 2010

Existe-t-il un moyen de supprimer ces caractères d'encodage?

Était-ce utile?

La solution

Vous pouvez / devez utiliser le email.parser Module pour décoder les messages du courrier, par exemple (exemple rapide et sale!):

from email.parser import FeedParser
f = FeedParser()
f.feed("<insert mail message here, including all headers>")
rootMessage = f.close()

# Now you can access the message and its submessages (if it's multipart)
print rootMessage.is_multipart()

# Or check for errors
print rootMessage.defects

# If it's a multipart message, you can get the first submessage and then its payload
# (i.e. content) like so:
rootMessage.get_payload(0).get_payload(decode=True)

En utilisant le paramètre "décoder" de Message.get_payload, le module décode automatiquement le contenu, selon son codage (par exemple, les imprimables cités comme dans votre question).

Autres conseils

C'est connu comme un codage imprimé cité. Vous voulez probablement utiliser quelque chose comme quopri.decodestring - http://docs.python.org/library/quopri.html

Si vous utilisez Python3.6 ou version ultérieure, vous pouvez utiliser le email.message.Message.get_content() Méthode pour décoder automatiquement le texte. Cette méthode remplace get_payload(), pourtant get_payload() est encore disponible.

Dites que vous avez une chaîne s contenant cet e-mail (basé sur le exemples Dans les documents):

Subject: Ayons asperges pour le =?utf-8?q?d=C3=A9jeuner?=
From: =?utf-8?q?Pep=C3=A9?= Le Pew <pepe@example.com>
To: Penelope Pussycat <penelope@example.com>,
 Fabrette Pussycat <fabrette@example.com>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0

    Salut!

    Cela ressemble =C3=A0 un excellent recipie[1] d=C3=A9jeuner.

    [1] http://www.yummly.com/recipe/Roasted-Asparagus-Epicurious-203718

    --Pep=C3=A9
   =20

Les caractères non ASCII de la chaîne ont été codés avec le quoted-printable codage, comme spécifié dans le Content-Transfer-Encoding entête.

Créer un objet e-mail:

import email
from email import policy

msg = email.message_from_string(s, policy=policy.default)

La définition de la stratégie est requise ici; Par ailleurs policy.compat32 est utilisé, qui renvoie une instance de message hérité qui n'a pas la méthode get_content. policy.default deviendra finalement la politique par défaut, mais à partir de python3.7, il est toujours policy.compat32.

La get_content() La méthode gère automatiquement le décodage:

print(msg.get_content())

Salut!

Cela ressemble à un excellent recipie[1] déjeuner.

[1] http://www.yummly.com/recipe/Roasted-Asparagus-Epicurious-203718

--Pepé

Si vous avez un message multipAR get_content() doit être appelé sur les parties individuelles, comme ceci:

for part in message.iter_parts():
    print(part.get_content())
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top