Traitement d'un email POP en Perl

Le
Mag
Bonjour a tous,

Je sollicite une nouvelle fois votre aide hihi vous m'avez si bien
dépanné les précédente fois ;=)


J'ai un serveur POP3 qui stock les emails ..

Je viens de faire un mini script qui ce connecte
en utilisant Net::POP3

actuellement il m'affiche juste:

# ./Releve-POP3.pl
Mailbox has 1 message(s).
Message Info: Email de Magalie RINARD <mag@laposte.net> avec comme sujet
"Test"


Je cherche a decomposé très précisement l'email pour extraire:

1- L'email expediteur
2- Le sujet
3- Le corp du message (avec traitement si html)
4- Sortir les pieces jointes.



Alors je me dit qu'il y a peut etre des modules qui simplifie cela ?

Votre avis ? quelqu'un aurais un exemple pour faire cela ?







Voici le script actuel recupere a partir du net

#!/usr/bin/perl
use Net::POP3;


##
## Parametrage des informations Messagerie POP3
##
$host = 'mon.pop."';
$user = 'mon_compte_pop';
$pass = 'Mon_pass';


&connexion_pop3;
&verification_nouveau_message;
&analyse_email;
&deconnexion_pop3;

print ("Message Info: Email de $email_de avec comme sujet
"$email_sujet"");




# Sub de Connexion POP3
sub connexion_pop3 {
$conn = Net::POP3->new($host) or die("ERROR: Unable to
connect.");
}

# Sub de Deconnexion POP3
sub deconnexion_pop3 {
$conn->quit();
}




# Sub de Veirification du Nbr de message dans la boite
sub verification_nouveau_message {
$numMsg = $conn->login($user, $pass) or die("ERROR: Unable to
login.");
if ($numMsg > 0) {
print "Mailbox has $numMsg message(s).";
} else {
print "Mailbox is empty.";
}
}


# Analyse des Emails présent dans la boite POP3
sub analyse_email {
foreach my $msg_id (1 .. $numMsg) {
my $header = $conn -> top($msg_id, 0);
my ($subject, $from) = analyze_header($header);
}
}


# Analyse de l'entete pour extraire le Sujet et le From
sub analyze_header {
my $header_array_ref = shift;
my $header = join "", @$header_array_ref;
my ($subject) = $header =~ /Subject: (.*)/m;
my ($from ) = $header =~ /From: (.*)/m;
$email_de = $from;
$email_sujet = $subject;
}
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Mag
Le #18947181
Mag a écrit :
> Je cherche a decomposé très précisement l'email pour extraire:

1- L'email expediteur
2- Le sujet
3- Le corp du message (avec traitement si html)
4- Sortir les pieces jointes.




Je me reponds a moi meme, j'ai trouve un autre bout de code qui
fait a peut pret ce que je veux (merci a l'auteur)

#!/usr/bin/perl
use Mail::POP3Client;
use MIME::Parser;

my $pop = new Mail::POP3Client(
USER => 'mon_compte', # your username
PASSWORD => 'mon_pass', # your user password
HOST => "mon_serveur" # your pop3 server
);

my $outputdir = '.';
my $parser = new MIME::Parser;
$parser->output_under($outputdir);

print $pop->Count();
for (my $i = 1; $i <= $pop->Count(); $i++) {
my $msg = $pop->HeadAndBody($i);
my $data = $parser->parse_data($msg);
}



C'est genial cela sauvegarde les emails dans un repertoire et j'ai les
pieces jointes ainsi que le corps du message.

Je vais essayer de trouvé la doc du module POP3Client pour voir si il
peut aussi m'extraire le From/To/Subject
Mag
Le #18947221
Mag a écrit :
Mag a écrit :
> Je cherche a decomposé très précisement l'email pour extraire:

1- L'email expediteur
2- Le sujet
3- Le corp du message (avec traitement si html)
4- Sortir les pieces jointes.




Je me reponds a moi meme, j'ai trouve un autre bout de code qui
fait a peut pret ce que je veux (merci a l'auteur)

#!/usr/bin/perl
use Mail::POP3Client;
use MIME::Parser;

my $pop = new Mail::POP3Client(
USER => 'mon_compte', # your username
PASSWORD => 'mon_pass', # your user password
HOST => "mon_serveur" # your pop3 server
);

my $outputdir = '.';
my $parser = new MIME::Parser;
$parser->output_under($outputdir);

print $pop->Count();
for (my $i = 1; $i <= $pop->Count(); $i++) {
my $msg = $pop->HeadAndBody($i);
my $data = $parser->parse_data($msg);
}



C'est genial cela sauvegarde les emails dans un repertoire et j'ai les
pieces jointes ainsi que le corps du message.

Je vais essayer de trouvé la doc du module POP3Client pour voir si il
peut aussi m'extraire le From/To/Subject




Ok j'ai rajouté cela:

my $head = $pop->Head($i);
my ($subject) = $head =~ /Subject: (.*)/m;
my ($from ) = $head =~ /From: (.*)/m;
my ($date ) = $head =~ /Date: (.*)/m;

du coup j'ai bien ce qu'il me faut hihi

De: Mag TEST Sujet: Test^M
Date: Sat, 28 Feb 2009 09:20:45 +0100^M




Alors derniere question:

Comment extraire avec certitude l'email de $from ?
car actuellement c'est "Mag TEST mais si on ne mets pas de nom ou un autre mailer ?

Comment extraire correctement la date:
"Sat, 28 Feb 2009 09:20:45 +0100"
dans des variables $jour $mois etc sachant que l'espace
peut changer entre Sat, et la date si on est avant le 10
du mois


Merci d'avance pour vos conseils
Jogo
Le #18948091
> Comment extraire avec certitude l'email de $from ?



J'utilise Mail::Address pour ça. Simple et efficace.

Comment extraire correctement la date:



Et pour ça DateTime::Format::Mail. Là c'est bien plus compliqué, mais
la famille DateTime est ce qui se fait de mieux pour la manipulation
des dates.

--
C'est surtout particulièrement masochiste et contre-productif. Si le
principe c'est que celui qui gueule le plus fort à raison, fufe va devenir
un bourbier innomable que même le fme actuel c'est fr.comp.os.vms à côté.
-- Éric Marillier dans fufe --
Freddy DISSAUX
Le #18948081
Le Sat, 21 Mar 2009 07:24:58 +0100, Mag écrivait:
Mag a écrit :
Mag a écrit :
> Je cherche a decomposé très précisement l'email pour extraire:

1- L'email expediteur
2- Le sujet
3- Le corp du message (avec traitement si html)
4- Sortir les pieces jointes.







Extrait d'un script chez moi:

my $parsed = Email::MIME->new($message);

my @parts = $parsed->parts;
my $body = $parsed->body;
my $from = $parsed->header('From');


--
freddy <point> dsx <arobase> free <point> fr
Paul Gaborit
Le #18948631
À (at) Sat, 21 Mar 2009 10:23:27 +0100,
Jogo
Comment extraire avec certitude l'email de $from ?



J'utilise Mail::Address pour ça. Simple et efficace.

Comment extraire correctement la date:



Et pour ça DateTime::Format::Mail. Là c'est bien plus compliqué, mais
la famille DateTime est ce qui se fait de mieux pour la manipulation
des dates.



Les deux modules font du bon boulot... dans la mesure où les entêtes
ont un contenu cohérent ! Mais ce n'est absolument pas garanti. En
fait les entêtes d'un mail peuvent avoir un contenu totalement
arbitraire. C'est l'expéditeur ou le logiciel de l'expéditeur qui en
décide. Et si l'expéditeur est malicieux (blague, spam, pirate...),
les entêtes peuvent contenir n'importe quoi. Il faut donc se méfier de
ce qu'on extrait et surtout de ce qu'on en fait.

--
Paul Gaborit - Perl en français -
Mihamina Rakotomandimby
Le #18971851
Mag wrote:
&connexion_pop3;
&verification_nouveau_message;
&analyse_email;
&deconnexion_pop3;



Quels sont les mots cle pour savoir ce que veulent dire les "&" en début
de ligne?

--
Chef de projet chez Vectoris
http://www.google.com/search?q=mihamina+rakotomandimby
Telephone: +261 33 11 207 36
Paul Gaborit
Le #18973441
À (at) Tue, 24 Mar 2009 21:41:57 +0300,
Mihamina Rakotomandimby
Mag wrote:
&connexion_pop3;
&verification_nouveau_message;
&analyse_email;
&deconnexion_pop3;



Quels sont les mots cle pour savoir ce que veulent dire les "&" en
début de ligne?



Pour les mots clés, je ne sais pas... Par contre, pour savoir à quoi
sert un & devant un nom de fonction (et non en début de ligne), c'est
décrit dans la doc 'perlsub'.

La plupart des scripts qui utilisent '&' devant un nom de fonction, le
font de manière abusive et les auteurs n'en mesurent pas toujours les
conséquences (éventuellement fâcheuses). La bonne syntaxe dans le cas
ci-dessus serait :

connexion_pop3();
verification_nouveau_message();
analyse_email();
deconnexion_pop3();

Et si les fonctions sont déjà déclarées ou importées, on peut même se
passer des parenthèses.

--
Paul Gaborit - Perl en français -
espie
Le #18976301
In article Paul Gaborit
La plupart des scripts qui utilisent '&' devant un nom de fonction, le
font de manière abusive et les auteurs n'en mesurent pas toujours les
conséquences (éventuellement fâcheuses). La bonne syntaxe dans le cas
ci-dessus serait :



connexion_pop3();
verification_nouveau_message();
analyse_email();
deconnexion_pop3();



Et si les fonctions sont déjà déclarées ou importées, on peut même se
passer des parenthèses.



De toutes facons, vu que le script de depart a ete ecrit par quelqu'un
qui ne comprend pas la notion de variable locale, c'est mal barre...

J'avoue que c'est impressionnant de voir a quel point on peut faire
des trucs moches a partir d'un module propre avec une encapsulation
objet decente...
Publicité
Poster une réponse
Anonyme