Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Chercher le champ From d'un mail

8 réponses
Avatar
Franck Dia
Bonjour, je débute tout juste sur Perl, et je bloque un peu sur les
expressions régulières. Je cherche à dans l'entête d'un mail à trouver
l'expéditeur et à afficher le contenu du champ From:
Pour cela j'ai utilisé l'opérateur d'appartenance =~pour trouver la chaine
de caractère From:

Première difficulté.
Trouver From: n'est pas bien difficile mais comment trouver la suite des
autres caractères qui composent cette ligne.

Deuxième difficulté.
Une fois qu'on à recherché et trouvé cette chaine de caractère comment
l'affiche t'on par exemple sur la sortie standard d'un terminal UNIX?

8 réponses

Avatar
Benoit Izac
Bonjour,

le 13/04/2004 à 14:12, Franck Dia a écrit
dans le message <BCA1A5C7.8627% :

Bonjour, je débute tout juste sur Perl, et je bloque un peu sur les
expressions régulières. Je cherche à dans l'entête d'un mail à trouver
l'expéditeur et à afficher le contenu du champ From:
Pour cela j'ai utilisé l'opérateur d'appartenance =~pour trouver la
chaine de caractère From:

Première difficulté.
Trouver From: n'est pas bien difficile mais comment trouver la suite
des autres caractères qui composent cette ligne.


/^From:s+(.*)$/

on recherche :
une ligne commençant `^'
par `From:'
suivi d'un ou plusieurs espace(s) `s+'
suivi de zéro ou plus caractère(s) quelconque(s) `.*'
jusqu'à la fin de la ligne `$'

les parenthèses autour de `.*' permettent de capturer `zéro ou plus
caractère(s) quelconque(s)' et sont stockés dans la variable $1.

perldoc perlre

Deuxième difficulté.
Une fois qu'on à recherché et trouvé cette chaine de caractère comment
l'affiche t'on par exemple sur la sortie standard d'un terminal UNIX?


print "$1n";

--
Benoit Izac

Avatar
Franck Dia
Le 13/04/04 15:39, dans , « Benoit Izac »
a écrit :

Bonjour,

le 13/04/2004 à 14:12, Franck Dia a écrit
dans le message <BCA1A5C7.8627% :

Bonjour, je débute tout juste sur Perl, et je bloque un peu sur les
expressions régulières. Je cherche à dans l'entête d'un mail à trouver
l'expéditeur et à afficher le contenu du champ From:
Pour cela j'ai utilisé l'opérateur d'appartenance =~pour trouver la
chaine de caractère From:

Première difficulté.
Trouver From: n'est pas bien difficile mais comment trouver la suite
des autres caractères qui composent cette ligne.


/^From:s+(.*)$/

on recherche :
une ligne commençant `^'
par `From:'
suivi d'un ou plusieurs espace(s) `s+'
suivi de zéro ou plus caractère(s) quelconque(s) `.*'
jusqu'à la fin de la ligne `$'

les parenthèses autour de `.*' permettent de capturer `zéro ou plus
caractère(s) quelconque(s)' et sont stockés dans la variable $1.

perldoc perlre

Deuxième difficulté.
Une fois qu'on à recherché et trouvé cette chaine de caractère comment
l'affiche t'on par exemple sur la sortie standard d'un terminal UNIX?


print "$1n";


Merci Benoit, je test de suite.


Avatar
Laurent Wacrenier
Benoit Izac écrit:
on recherche :
une ligne commençant `^'
par `From:'
suivi d'un ou plusieurs espace(s) `s+'


L'espacement n'est pas nessessaire selon la RFC 822 (qui n'a rien à
voir avec perl).

Avatar
Laurent Wacrenier
Benoit Izac écrit:
on recherche :
une ligne commençant `^'
par `From:'
suivi d'un ou plusieurs espace(s) `s+'


L'espacement n'est pas nessessaire selon la RFC 822 (qui n'a rien à
voir avec perl).

suivi de zéro ou plus caractère(s) quelconque(s) `.*'
jusqu'à la fin de la ligne `$'


Un corp d'entête peut être multilignes.

Avatar
Franck Dia
Le 13/04/04 16:30, dans BCA1C63D.868C%, « Franck Dia »
a écrit :

Bonjour, je débute tout juste sur Perl, et je bloque un peu sur les
expressions régulières. Je cherche à dans l'entête d'un mail à trouver
l'expéditeur et à afficher le contenu du champ From:
Pour cela j'ai utilisé l'opérateur d'appartenance =~pour trouver la
chaine de caractère From:

Première difficulté.
Trouver From: n'est pas bien difficile mais comment trouver la suite
des autres caractères qui composent cette ligne.


/^From:s+(.*)$/



Merci Benoit, je test de suite.



Bon! Mon script fonctionne mais avec une légère modification. En effet le
script ne trouve pas la chaine quand j'utilise les caractères spéciaux:
^ et $
Par contre aucun pb de cette manière /From:s+(.*)/

REMARQUE: J'utilise la méthode Head du module Mail::POP3Client, cette
fonction retourne pour chez moi le header suivant en lui passant le
paramètre 1:

Return-Path:
Delivered-To:
Received: (qmail 12981 invoked by uid 0); 12 Apr 2004 05:33:33 -0000
Received: from unknown (HELO T5U3X7) ([24.82.178.152])
(envelope-sender )
by 212.198.2.118 (qmail-ldap-1.03) with SMTP
for ; 12 Apr 2004 05:33:33 -0000
Received: from 101.106.60.224 by 24.82.178.152; Mon, 12 Apr 2004 10:30:30
+0400
Message-ID:
From: "Arica Jesse"
Reply-To: "Arica Jesse"
To: , ,
Subject: Y Stuck With Ur Current Job? Buy A Degree N Get Higher Salary
poison
Date: Mon, 12 Apr 2004 10:28:30 +0400
MIME-Version: 1.0
X-MimeOLE: Produced By Microsoft MimeOLE V4.71.2605.5
Content-Type: multipart/alternative;
boundary="--051149541833615244"

Si quelqu'un peut m'expliquer pourquoi cette différence lorsque j'utilise le
^et $.



Avatar
Franck Dia
Le 13/04/04 18:01, dans BCA1DB7B.8691%, « Franck Dia »
a écrit :

Le 13/04/04 16:30, dans BCA1C63D.868C%, « Franck Dia »
a écrit :

Bonjour, je débute tout juste sur Perl, et je bloque un peu sur les
expressions régulières. Je cherche à dans l'entête d'un mail à trouver
l'expéditeur et à afficher le contenu du champ From:
Pour cela j'ai utilisé l'opérateur d'appartenance =~pour trouver la
chaine de caractère From:

Première difficulté.
Trouver From: n'est pas bien difficile mais comment trouver la suite
des autres caractères qui composent cette ligne.


/^From:s+(.*)$/



Merci Benoit, je test de suite.



Bon! Mon script fonctionne mais avec une légère modification. En effet le
script ne trouve pas la chaine quand j'utilise les caractères spéciaux:
^ et $
Par contre aucun pb de cette manière /From:s+(.*)/

REMARQUE: J'utilise la méthode Head du module Mail::POP3Client, cette
fonction retourne pour chez moi le header suivant en lui passant le
paramètre 1:

Return-Path:
Delivered-To:
Received: (qmail 12981 invoked by uid 0); 12 Apr 2004 05:33:33 -0000
Received: from unknown (HELO T5U3X7) ([24.82.178.152])
(envelope-sender )
by 212.198.2.118 (qmail-ldap-1.03) with SMTP
for ; 12 Apr 2004 05:33:33 -0000
Received: from 101.106.60.224 by 24.82.178.152; Mon, 12 Apr 2004 10:30:30
+0400
Message-ID:
From: "Arica Jesse"
Reply-To: "Arica Jesse"
To: , ,
Subject: Y Stuck With Ur Current Job? Buy A Degree N Get Higher Salary
poison
Date: Mon, 12 Apr 2004 10:28:30 +0400
MIME-Version: 1.0
X-MimeOLE: Produced By Microsoft MimeOLE V4.71.2605.5
Content-Type: multipart/alternative;
boundary="--051149541833615244"

Si quelqu'un peut m'expliquer pourquoi cette différence lorsque j'utilise le
^et $.


J'ai dû boire! ça marche parfaitement avec les caractères spéciaux ^ et $.

Désolé pour le dérangement (lol) @+




Avatar
Benoit Izac
Bonjour,

le 13/04/2004 à 18:01, Franck Dia a écrit
dans le message <BCA1DB7B.8691% :

Bon! Mon script fonctionne mais avec une légère modification. En effet le
script ne trouve pas la chaine quand j'utilise les caractères spéciaux:
^ et $
Par contre aucun pb de cette manière /From:s+(.*)/


Pour le ^ et $, c'est normal, je croyais que tu lisais ton en-tête
ligne par ligne.

Après lecture (rapide) de la RFC 822, la regexp serait plutôt un truc
comme ça :

if ($header =~ /(?:n|^)From:s*(.*?)s*(?=n[^[:cntrl:]s:]+:|$)/s) {
print "$1n";
}

ça permet de faire des trucs intéressants avec par exemple les
received :

#!/usr/bin/perl -w
use strict;

$/ = "";
my $header = <>;
my $count = 1;
my @received;

while ($header =~ /nReceived:s*(.*?)s*(?=n[^[:cntrl:]s:]+:|$)/gs) {
push(@received, $1);
}

foreach (reverse @received) {
print "$count:t$_nn";
++$count;
}
__END__

--
Benoit Izac

Avatar
Benoit Izac
Dans le message ,

if ($header =~ /(?:n|^)From:s*(.*?)s*(?=n[^[:cntrl:]s:]+:|$)/s) {
^^^^^^^^^^^^^^^^

Ce n'est pas correct.

selon la RFC c'est [41-7173-176]+ avec un jeu de caractères ASCII
(donc pas portable).

--
Benoit Izac