2010-06-16 8 views
12

J'écris un script Python pour traiter les courriels retournés par Procmail. Comme l'a suggéré dans ce question, j'utilise la configuration Procmail suivante:Analyse du courrier électronique avec Python

:0: 
|$HOME/process_mail.py 

Mon script process_mail.py reçoit un e-mail via stdin comme ceci:

From hostname Tue Jun 15 21:43:30 2010 
Received: (qmail 8580 invoked from network); 15 Jun 2010 21:43:22 -0400 
Received: from mail-fx0-f44.google.com (209.85.161.44) 
by ip-73-187-35-131.ip.secureserver.net with SMTP; 15 Jun 2010 21:43:22 -0400 
Received: by fxm19 with SMTP id 19so170709fxm.3 
for <[email protected]>; Tue, 15 Jun 2010 18:47:33 -0700 (PDT) 
MIME-Version: 1.0 
Received: by 10.103.84.1 with SMTP id m1mr2774225mul.26.1276652853684; Tue, 15 
Jun 2010 18:47:33 -0700 (PDT) 
Received: by 10.123.143.4 with HTTP; Tue, 15 Jun 2010 18:47:33 -0700 (PDT) 
Date: Tue, 15 Jun 2010 20:47:33 -0500 
Message-ID: <[email protected]> 
Subject: TEST 12 
From: Full Name <[email protected]> 
To: [email protected] 
Content-Type: text/plain; charset=ISO-8859-1 

ONE 
TWO 
THREE 

Je suis en train d'analyser la message de cette façon:

>>> import email 
>>> msg = email.message_from_string(full_message) 

Je veux obtenir des champs de message comme 'De', 'À' et 'Sujet'. Toutefois, l'objet de message ne contient aucun de ces champs.

Qu'est-ce que je fais mal?

Répondre

9

Vous devez vous assurer que les lignes ne sont pas accidentellement cassés (comme ils sont ci-dessus, mais il est difficile de dire si c'était un problème de copier-coller) - avec un intac t message tel que:

Received: (qmail 8580 invoked from network); 15 Jun 2010 21:43:22 -0400 
Received: from mail-fx0-f44.google.com (209.85.161.44) by ip-73-187-35-131.ip.secureserver.net with SMTP; 15 Jun 2010 21:43:22 -0400 
Received: by fxm19 with SMTP id 19so170709fxm.3 for <[email protected]>; Tue, 15 Jun 2010 18:47:33 -0700 (PDT) 
MIME-Version: 1.0 
Received: by 10.103.84.1 with SMTP id m1mr2774225mul.26.1276652853684; Tue, 15 Jun 2010 18:47:33 -0700 (PDT) 
Received: by 10.123.143.4 with HTTP; Tue, 15 Jun 2010 18:47:33 -0700 (PDT) 
Date: Tue, 15 Jun 2010 20:47:33 -0500 
Message-ID: <[email protected]> 
Subject: TEST 12 
From: Full Name <[email protected]> 
To: [email protected] 
Content-Type: text/plain; charset=ISO-8859-1 

ONE 
TWO 
THREE 

puis

msg = email.message_from_string(msgtxt) 
print msg['Subject'] 

impressions TEST 12 comme vous le souhaitez.

+0

Comment obtenir le corps de l'email ici? – Anuj

+0

Si vous voulez vraiment tout le corps de l'e-mail RFC2822 avec des structures MIME brutes et tout, l'analyse du message en Python est fondamentalement superflue; le corps est tout après la première ligne vide. Normalement, avec les messages modernes, vous voulez analyser la structure MIME et extraire une ou plusieurs parties du corps. – tripleee

1

Je réponds à moi-même.

J'ai trouvé un bogue dans le code qui construit les messages. Il ajoute des sauts de ligne entre certaines lignes, empêchant l'analyseur de fonctionner correctement.

3

Il semble que vous avez linefeeds sans espaces préfixera les lignes supplémentaires, qui selon RFC 2822 §2.3.2 est illégale:

Chaque champ d'en-tête est logiquement une seule ligne de caractères comprenant
le nom du champ, le côlon et le corps du champ. Cependant, pour des raisons de commodité, et pour traiter les limitations de caractères 998/78 par ligne,
la partie de corps de champ d'un champ d'en-tête peut être divisée en une représentation de ligne multiple
; c'est ce qu'on appelle "pliage". La règle générale est
que partout où cette norme permet de replier les espaces blancs (pas
caractères simplement WSP), un CRLF peut être inséré avant tout WSP. Pour
exemple, le champ d'en-tête:

Subject: This is a test 

peut être représentée par:

Subject: This 
    is a test 

Il devrait ressembler à ceci:

From hostname Tue Jun 15 21:43:30 2010 
Received: (qmail 8580 invoked from network); 15 Jun 2010 21:43:22 -0400 
Received: from mail-fx0-f44.google.com (209.85.161.44) 
    by ip-73-187-35-131.ip.secureserver.net with SMTP; 15 Jun 2010 21:43:22 -0400 
Received: by fxm19 with SMTP id 19so170709fxm.3 
    for <[email protected]>; Tue, 15 Jun 2010 18:47:33 -0700 (PDT) 
MIME-Version: 1.0 
Received: by 10.103.84.1 with SMTP id m1mr2774225mul.26.1276652853684; Tue, 15 
    Jun 2010 18:47:33 -0700 (PDT) 
Received: by 10.123.143.4 with HTTP; Tue, 15 Jun 2010 18:47:33 -0700 (PDT) 
Date: Tue, 15 Jun 2010 20:47:33 -0500 
Message-ID: <[email protected]> 
Subject: TEST 12 
From: Full Name <[email protected]> 
To: [email protected] 
Content-Type: text/plain; charset=ISO-8859-1 

ONE 
TWO 
THREE