2016-11-29 5 views
0

Je lis le Python 3 docs here et je dois être aveugle ou quelque chose ... Où dit-on comment obtenir le corps d'un message? Ce que je veux faire est d'ouvrir un message et d'effectuer une boucle dans les corps textuels du message, en ignorant les pièces jointes binaires. Pseudocode:Comment obtenir le corps (ou les corps) du message à partir de l'objet Message retourné par email.parser.Parser?

def read_all_bodies(local_email_file): 
    email = Parser().parse(open(local_email_file, 'r')) 
    for pseudo_body in email.pseudo_bodies: 
     if pseudo_body.pseudo_is_binary(): 
      continue 
     # Pseudo-parse the body here 

Comment faire? Est-ce que même la classe Message est correcte pour cela? N'est-ce pas seulement pour les en-têtes?

Répondre

1

Ce mieux est d'utiliser deux fonctions:

  1. un pour ouvrir le fichier. Si le message est en une partie, get_payload renvoie une chaîne dans le message. Si le message est multipart, elle renvoie la liste des sous-messages
  2. seconde pour gérer le texte/charge utile

Voici comment cela peut se faire:

def parse_file_bodies(filename): 
    # Opens file and parses email 
    email = Parser().parse(open(filename, 'r')) 
    # For multipart emails, all bodies will be handled in a loop 
    if email.is_multipart(): 
     for msg in email.get_payload(): 
      parse_single_body(msg) 
    else: 
     # Single part message is passed diractly 
     parse_single_body(email) 

def parse_single_body(email): 
    payload = email.get_payload(decode=True) 
    # The payload is binary. It must be converted to 
    # python string depending in input charset 
    # Input charset may vary, based on message 
    try: 
     text = payload.decode("utf-8") 
     # Now you can work with text as with any other string: 
     ... 
    except UnicodeDecodeError: 
     print("Error: cannot parse message as UTF-8") 
     return