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 type mail.provider.com
       from est une adresse email pour s'identifier auprès du serveur
       to adresse email du destinataire
       subject 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'objet InetAddress 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 au Socket
      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) { return false; }

    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 ;-)