Mails
- Présentation -
Les mails... ces derniers que vous manipulez sans doute régulièrement ont été la première chose la plus usitée sur Internet (alors ARPANet). Nous allons voir ici comment envoyer ses propres mails en passant par un serveur SMTP. Cet exemple repose sur du code Java pour la connection mais le principe de dialogue avec le serveur reste le même pour tous les langages.
- Notre projet -
Nous allons donc créer une application simple, permettant de spécifier l'hôte SMTP, l'expéditeur, le destinataire et le sujet. La méthode que nous proposons ici va donc accepter des String
pour la spécification de ces informations. Nous verrons également les surprises que nous réserve ce genre d'application...
- Le Code -
Voici le code Java illustrant nos propos:
public boolean sendMail(String host, String from, String to, String subject) { /*host
doit être une IP ou un nom de typemail.provider.com
from
est une adresse email pour s'identifier auprès du serveurto
adresse email du destinatairesubject
le sujet du mail */ Socket smtpPipe; // Socket de connection PrintWriter out; // Flux servant à dialoguer avec le serveur BufferedReader in; // Flux servant à recevoir les réponse du serveur InetAddress mailHost, ourselves; try { // Nous récupérons l'objetInetAddress
correspondant // à l'IP de notr hôte. mailHost = InetAddress.getByName(host); ourselves = InetAddress.getLocalHost(); } catch (UnknownHostException uhe) { return false; } try { // Nous nous connectons à l'hôte sur le port 25 (port SMTP usuel) smtpPipe = new Socket(mailHost, 25); if (smtpPipe == null) return false; // Nous récupérons les flux in/out associés auSocket
in = new BufferedReader(new InputStreamReader(smtpPipe.getInputStream())); out = new PrintWriter(new OutputStreamWriter(smtpPipe.getOutputStream()), true); // Sans l'un d'eux, on est mal... if (in == null || out == null) return false; // Ici tout le monde est concerné // On lit le message d'accueil du serveur // En gros, il nous demande de nous présenter in.readLine(); // Il faut le saluer par son nom out.println("HELLO " + ourselves.getHostName()); in.readLine(); // On s'identifie en lui donnant l'email de l'expéditeur out.println("MAIL FROM:<" + from + ">"); in.readLine(); // Il nous accepte ? Et le destinataire ? out.println("RCPT TO:<" + to + ">"); in.readLine(); // Ici commence le corps du message out.println("DATA"); // Ceci est le header du mail out.println("To: <" + to + ">"); // Ce from ne sert pas à identifier... et si on le falsifiait ? ;-) out.println("From: <" + from + ">"); // Le sujet du mail out.println("Subject: " + subject + "\n"); /* Ici vous n'avez plus qu'à faire des out.println(String) pour transmettre le mail. Cette partie ne devrait pas vous poser beaucoup de problèmes... */ // Lorsque le corps du message est fini, on transmet '.' out.println("."); in.readLine(); // On quitte out.println("QUIT"); } catch (IOException ioe) { returnfalse; } return true; }
En fait, envoyer un mail n'est pas chose compliquée. Quant aux surprises... Vous avez remarqué que l'on transmettait une première fois l'adresse de l'expéditeur pour s'identifier ? Mais la seconde fois, après avoir envoyé DATA
, on peut mettre tout à fait autre chose ! C'est cette adresse qui sera affichée dans le client mail ;-) De même, placer ce genre de méthode dans une boucle for
peut donner des résultats intéressants ;-)
[ Astuces ]