Niveau :      
Résumé : telnet pop.mail.net 110

Connaître le protocole

Connaître un protocole peut toujours servir.

  1. Vous pourrez ainsi tester les services que vous mettez en place
  2. Vous pourrez diagnostiquer le problème quand un ami vous dira "Ça marche pas !"
  3. Si vous-même avez un problème vous pourrez probablement le résoudre à la main.

Hier je me suis retrouvé à devoir télécharger 32000 mails sur un serveur pop et mon pauvre client (hé oui fetchmail n'est pas le seul client) est un peu oublié du côté de la résistance aux crash et n'a pas supporté. Le problème c'est qu'il n'a pas effacé les 15000 premiers mails qu'il a réussi à télécharger. Merci la boulette, après 30mn on n'a pas trop envie de tout reprendre au début.

Connaître le protocole POP

Je ne vais vous parler que des bases. Pour la suite, lisez la RFC 1939 :)

Une session POP est relativement simple (ce que vous tapez est en capitale, sauf les +OK) :

$ telnet pop.mail.net 110
Trying 127.0.0.1...
Connected to pop.mail.net.
Escape character is '^]'.
+OK <23594.1175023984@pop.mail.net>
USER toto
+OK
PASS xxx
+OK
LIST
+OK
1 1235
.
RETR 1
[...]
+OK
DELE 1
+OK
QUIT
Connection closed by foreign host.

[...] étant remplacé par le contenu du mail. Pour le reste je pense que vous avez compris.

Maintenant automatisons la suppression des mails.

Scripting

Nous utiliserons nc à la place de telnet car il est plus pratique pour le script. Nous allons préparer un fichier de commandes à envoyer au serveur.

Préparation :

$ # la partie login
$ echo "USER toto" > file1
$ echo "PASS xxx" >> file1
$ # la partie suppression
$ for i in $(seq 1 15000); do echo DELE $i ; done > file2

$ # la fin
$ echo "QUIT" >> file2

Pourquoi 2 fichiers ? Parce que nous aurons besoin de temporiser après le login, sinon le serveur nous jette.

Pourquoi inclure le QUIT ? Parce que le serveur POP ne valide pas les commandes DELE si la connexion ne se termine pas proprement.

Maintenant le tout :

$ cat file1 - file2 | nc pop.mail.net 110

On envoie à la suite file1, l'entrée standard (vous) puis file2. La sortie standard n'ayant pas changé (vous) il vous est possible de constater ce qui se passe.

Une fois le login accepté, il suffit de terminer les données sur l'entrée standard (avec ctrl-d) pour passer à l'envoi de file2.

Notez une technique différente avec moins de contrôle mais plus d'autonomie :

$ (cat file1 ; sleep 2; cat file2) | nc pop.mail.net 110