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

Question p-e idiote: POP3 et IMAP

4 réponses
Avatar
CrazyCat
Bonjour,

je dois faire une petite appli en PHP qui à pour but de se connecter à
un serveur POP pour traiter des mails.
En cherchant dans la doc PHP, je ne trouve que des fonctions IMAP
(chapitre LVII. IMAP, POP3 and NNTP Functions).
Dois-je en conclure que c'est exactement pareil?

Si je me souviens bien, la différence entre l'imap et le pop c'est que
l'imap traite sur le serveur, le pop rappatrie (j'ai juste?), dois-je
aussi en conclure que PHP n'est, de manière native, pas capable de
traiter en POP et ne fait que le simuler au moyen des fonctions IMAP?

Merci bien :)
--
Aide informatique: http://help-info.forumactif.com
Humour: http://www.chatfou.com
Tchattez en liberté: http://www.crazy-irc.net

4 réponses

Avatar
P'tit Marcel
salut CrazyCat,

je dois faire une petite appli en PHP qui à pour but de se connecter à
un serveur POP pour traiter des mails.
En cherchant dans la doc PHP, je ne trouve que des fonctions IMAP
(chapitre LVII. IMAP, POP3 and NNTP Functions).
Dois-je en conclure que c'est exactement pareil?


l'extension IMAP permet de se connecter en POP mais c'est assez facile
de le faire toi-même avec une connexion par socket, genre :


$fp = fsockopen($serveur, $port, $errno, $errmes, 30)
or die("** fsockopen: $errno $errmes");
list($code,$reste)=dialogue_serv('',' ');
if(($code=='+OK') and (ereg('(<[^@]+@[^>]+>)',$reste,$reg))) {
# authentification protocole APOP si dispo
$ctrl=md5($reg[1].$password);
list($code,$reste)=dialogue_serv("APOP $user $ctrl"," ");
if ($code!='+OK') { # ok
$foo=dialogue_serv("quit"); # sortie
fclose($fp);
die("** connexion impossible par APOP à $serveur : mot de passe
erroné? ($code $reste)");
}
}
else { # authentification classique POP
list($code,$reste)=dialogue_serv("user $user"," ");
if ($code=='+OK') {
list($code,$reste)=dialogue_serv("pass $password"," ");
if ($code!='+OK') { # ok
fclose($fp); # pas de 'quit' car on s'est fait virer
die("** connexion impossible à $serveur : mot de passe erroné?
($code $reste)");
}
}
else {
$foo=dialogue_serv("quit"); # sortie
fclose($fp);
die("** connexion impossible à $serveur : réponse initiale ($code
$reste)");
}
} # fin de test APOP

# demande s'il y a des messages en attente
list($code,$reste)=dialogue_serv("stat"," ");
if ($code!='+OK') { # ok
$foo=dialogue_serv("quit"); # sortie
fclose($fp);
die("** erreur sur la commande stat ($code $reste)");
}
$nb=strtok($reste," ");
if ($nb <= 0) {
echo "pas de messages en attenten";
}
else {
$mes=$mesdel=array();
$foo=dialogue_serv("list"); # la 1ère ligne est identique à la
réponse à stat donc on s'en fout
list($cle,$valeur)=dialogue_serv('',' ');
while($cle != ".rn") {
$mes[]=$cle; # tableau des n° de messages à récupérer
list($cle,$valeur)=dialogue_serv('',' ');
}

# boucle de lecture de chaque mail en attente (les derniers
messages d'abord)
krsort($mes,SORT_NUMERIC);
$mesdel=array(); # messages à supprimer
foreach($mes as $i) {
# Lecture message $i
list($code,$reste)=dialogue_serv("retr $i "," "); # le message
entier
if($code <> '+OK') { # ok
echo "message $i non récupéré ($code $reste)<br>n";
continue; # de foreach
}
list($cle,$valeur)=dialogue_serv('',':');

#boucle de lecture du contenu du message (entête puis contenu)
$entete=true;
while($cle != ".rn") {
# cle est le nom du champ d'entête (si on est dans les entêtes)
# valeur est le contenu du champ d'entête
# si on est passé au contenu (après la première ligne vide),
# alors tout est dans la variable cle

# si on veut supprimer du serveur le message en cours
$mesdel[]=$i;

if($cle=="rn") {
$enteteúlse;
}

# lecture de la ligne suivante du message
if($entete) {
list($cle,$valeur)=dialogue_serv('',':');
}
else {
$cle=dialogue_serv('');
}

} # fin de boucle de lecture du message i

} # fin de boucle de lecture des messages en attente

# suppression des messages de la bàl
foreach($mesdel as $i) {
list($code,$reste)=dialogue_serv("dele $i"," ");
if($code <> '+OK') {
echo "</font>** erreur à la suppression du message $i ($code
$reste)<br>n";
}
}
} # fin du test d'existence de message email en attente dans la bàl

# fermeture du socket et confirmation
list($code,$reste)=dialogue_serv("quit"," "); # sortie et confirmation
des suppressions
if($code <> '+OK') {
echo "erreur à la fermeture de la connexion ($code $reste)";
}
else {
echo "Fin de connexion mailn";
}
fclose($fp);

# traite chaque question/réponse avec le serveur de mail
function dialogue_serv($commande, $sep='') {
global $fp;
if ($commande<>'') {
fputs($fp,$commande."rn");
}
$buf=fgets($fp,1024);
if ($sep<>'') {
$buf=explode($sep,$buf,2);
if (sizeof($buf)==1) {
$code=$buf[0];
$reste="";
}
else {
list($code,$reste)=$buf;
}
return array($code,$reste);
}
else return $buf;
}


C'est pas de la programmation super classe, mais ça marche sans souci 25
fois par jour depuis quasiment la création de ce forum...


eça
--
P'tit Marcel
stats sur les forums modérés http://www.centrale-lyon.org/ng/

Avatar
CrazyCat
P'tit Marcel wrote:
En cherchant dans la doc PHP, je ne trouve que des fonctions IMAP
(chapitre LVII. IMAP, POP3 and NNTP Functions).
Dois-je en conclure que c'est exactement pareil?
l'extension IMAP permet de se connecter en POP mais c'est assez facile

de le faire toi-même avec une connexion par socket, genre :
C'est pas de la programmation super classe, mais ça marche sans souci 25
fois par jour depuis quasiment la création de ce forum...


Merci pour ce code, mais je vais m'en tenir à l'utilisation des
fonctions "natives".
En fait, il y a de fortes chances pour que je fonctionne en IMAP, mais
ça me permet de comprendre une chose (je suis un peu nul question boites
mails): POP et IMAP sont (grosso modo) les mêmes protocoles, la
différence est au niveau de la gestion:
POP rapatrie les mails alors que IMAP les traite sur le serveur.
Donc, une configuration POP avec option "laisser les mails sur le
serveur" est de l'IMAP :)

--
Aide informatique: http://help-info.forumactif.com
Humour: http://www.chatfou.com
Tchattez en liberté: http://www.crazy-irc.net


Avatar
Clifden
POP rapatrie les mails alors que IMAP les traite sur le serveur.
Donc, une configuration POP avec option "laisser les mails sur le
serveur" est de l'IMAP :)



Pas vraiment. En fait au niveau des fonctionnalité, POP est inclus dans
IMAP. Au niveau protocole, cela ne se passe pas du tout de la meme manière.

POP permet en gros:
* Lister les mails
* Obtenir les infos sur l'ensemble des mails (nombre, taille totale,
statut (lu/non lu))
* rapatrier les n premières lignes d'un mail (donc obtenir les infos
contenu dans le header, par exemple)
* effacer un mail

Lorsque tu utlise un client (Outlook, Thunderbird, etc...), cela se
passe de la manière suivante en POP: demande du nombre de mail, leur
taille, et commence à les lire, pour les effacer par la suite (dans la
majorité des cas).

IMAP permet une vraie gestion (et non pas "je lit, j'efface) avec un
vrai dialogue client/serveur, et des opération d'écriture sur le
serveur. Il gere aussi la notion de dossier. Donc il permet:
* Management des dossiers (création, renomage, effacement, listing)
* Management des mails (lecture, ecriture, effacement)

Tu vois donc qu'en appelant une fonction permettant de faire de l'imap,
si le serveur décline qu'il est en fait du POP, la fonction va se
contenter de lui donner les ordres qu'il est capable de faire.
Une partie seulement des fonctions imap PHP fontionne en POP, par
exemple les fonctions de gestion des directory vont provoquer une erreur
sur un serveur pop. Mais si tu utilises une fonction qui est chargée de
te renvoyer le contenu du mail n° i, sur un serveur POP, il y aura pas
de problème.

J'espère avoir répondu à tes interrogations.

Avatar
CrazyCat
Clifden wrote:
J'espère avoir répondu à tes interrogations.


Parfait, du coup je comprend que l'on ne trouve que les fonctions
imap_*, car qui peut le plus peut le moins.

Merci bien

--
Aide informatique: http://help-info.forumactif.com
Humour: http://www.chatfou.com
Tchattez en liberté: http://www.crazy-irc.net