Université Paris 7 M2 II Protocole Internet 1 Protocole SMTP TP2 Mail et servlet 1. Le protocole SMTP est définit dans la RFC 821 (mise à jour dans la RFC 2821). Le format des messages est spécifié dans la RFC 822. Consultez ces RFC et répondez aux questions suivantes: Quel port utilise smtp? A quoi servent les commandes HELO, MAIL FROM:, RCPT TO:, DATA? 2. Par la commande telnet, envoyez un mail à un utilisateur de ouindose. 3. Y a t il une vérification (et si oui de quel ordre), du domaine transmis par HELO? de l identité de l émetteur du message? 2 Programmation Java Java propose une JavaMail API pour manipuler le courrier. 1. Ajouter les Java Archive File activation.jar et mail.jar (à charger depuis java.sun.com/products/javamail) 2. En utilisant les classes de javax.mail.*, le programme suivant permet d envoyer un mail à l utilisateur cd de liafa.jussieu.fr en utilisant le serveur smtp ouindose.informatique.univ-paris-diderot.fr. import java.util.*; import javax.mail.*; // les 2 classes suivantes sont utilisées pour // le courrier electronique Internet import javax.mail.internet.internetaddress; import javax.mail.internet.mimemessage; public class EnvoiMailSimple { public static void main(string[] args) { try { 1
// emetteur du message (MAIL FROM:) le mail a pour emetteur Pere Noel Address emetteur = new InternetAddress("pppppp@liafa.jussieu.fr", "Pere Noel"); // recepteur du message (RCPT TO:) Address receveur = new InternetAddress("cd@liafa.jussieu.fr"); Properties props = new Properties(); // choix du serveur smtp props.put("mail.host", "ouindose.informatique.univ-paris-diderot.fr"); // demarrage d une session de courrier Session mailconnection = Session.getInstance(props, null); // Construction du message à envoyer par Internet Message msg = new MimeMessage(mailConnection); msg.setfrom(emetteur); msg.setrecipient(message.recipienttype.to, receveur); msg.setsubject("bientot Noel"); msg.setcontent(" M as tu envoye ta commande?\n j attends", "text/plain"); //Emission du message Transport.send(msg); catch (Exception ex) { ex.printstacktrace(); Consultez les classes Message et MimeMessage et enrichissez votre courrier. 3. Le programme suivant permet de lire le courrier de etudiant avec le mot de passe motcache sur ouindose.informatique.univ-paris-diderot.fr où se trouve un serveur pop3. import java.util.date; import java.util.properties; import javax.mail.*; public class pop3client { public static void main(string[] args) { Properties props = new Properties(); String host = "ouindose.informatique.univ-paris-diderot.fr"; // ligne 0 String password="motcache"; 2
String username = "etudiant"; String provider = "pop3"; try { // ligne 1 Session session = Session.getDefaultInstance(props,null); Store store = session.getstore(provider); // ligne 2 store.connect(host, username, password); System.out.println("connection reussie"); Folder inbox = store.getfolder("inbox"); if (inbox == null) { System.out.println("No INBOX"); System.exit(1); inbox.open(folder.read_only); // récuperer les messages du serveur Message[] messages = inbox.getmessages(); for (int i = 0; i < messages.length; i++) { System.out.println("------------ Message " + (i+1) + " ------------"); messages[i].writeto(system.out); System.out.println(); // Ferme la connexion // sans enlever les messages du serveur inbox.close(false); store.close(); catch (Exception ex) { ex.printstacktrace(); Modifier ce programme pour n afficher que le sujet, l émetteur et la date d envoi. 4. Authentification Il n est pas souhaitable que le mot de passe se trouve dans ce programme. L API Javamail propose une classe abstraite Authentificator (javax.mail. Authentificator). Quand une session dispose d un tel objet, quand on réalise la connexion, on appelle la méthode getpasswordauthentificator(). 3
A titre indicatif, on propose une sous classe de Authentificator: MailAuthentificator qui s utiliserait ainsi partir du programme précédent: // on enlève la ligne 0 // au lieu de la ligne 1 Session session = Session.getDefaultInstance(props, new MailAuthenticator(username));... //au lieu de la ligne 2 store.connect(host, null, null); Classe MailAuthentificator: import javax.mail.*; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class MailAuthenticator extends Authenticator { private JDialog passworddialog = new JDialog(new JFrame(), true); private JLabel passwordlabel = new JLabel("Password: "); private String username; private JPasswordField passwordfield = new JPasswordField(20); private JButton okbutton = new JButton("OK"); public MailAuthenticator(String u) { username = new String(u); Container pane = passworddialog.getcontentpane(); pane.setlayout(new GridLayout(2, 1)); JPanel p = new JPanel(); p.add(passwordlabel); p.add(passwordfield); p.add(okbutton); pane.add(p); passworddialog.pack(); ActionListener al = new HideDialog(); okbutton.addactionlistener(al); passwordfield.addactionlistener(al); class HideDialog implements ActionListener { public void actionperformed(actionevent e) { passworddialog.hide(); 4
public PasswordAuthentication getpasswordauthentication() { passworddialog.show(); String password = new String(passwordField.getPassword()); passwordfield.settext(""); return new PasswordAuthentication(username, password); Réécrire le programme de l exercice précédent de telle sorte qu il affiche une boite de dialogue permettant de saisir l identification et le mot de passe de l utilisateur qui désire connaître les entête de ces messages. 3 Servlet 1. On considère une application web. Le fichier index.jsp contient 2 boutons et un champ texte où on saisie le nom de l utilisateur l activation d un de ces boutons appelle une servlet travail.java, mappée sur travail.html, qui affiche un message "on va envoyer du courrier pour nom" ou "on va lire le courrier de nom " index.jsp <%@page contenttype="text/html" pageencoding="utf-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/tr/html4/loose.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>jsp Page</title> </head> <body> <h1> Bonjour, </h1> <form action= travail.html method= get > <input type= submit name= bouton value= Envoie > <input type= submit name= bouton value= Lire > </body> </html> Classe travail.java import java.io.*; import java.net.*; import javax.servlet.*; import javax.servlet.http.*; 5
public class travail extends HttpServlet { protected void processrequest(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { response.setcontenttype("text/html;charset=utf-8"); PrintWriter out = response.getwriter(); try { out.println("<html>"); out.println("<head>"); out.println("<title>servlet NewServlet2</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>servlet pour le courrier " + request.getcontextpath () + "</h1>"); out.println("</body>"); out.println("</html>"); String bouton =request.getparameter("bouton"); String nom=request.getparameter("nom"); if (bouton.equals("envoie"))out.println("on va envoyer du courrier pour "+nom); if (bouton.equals("lire"))out.println("on va lire le courrier de "+nom ); finally { out.close(); protected void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { processrequest(request, response); protected void dopost(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { processrequest(request, response); public String getservletinfo() { return "Un petit webmail "; 6
Le mapping dans web.xml <servlet> <servlet-name>travail</servlet-name> <servlet-class>travail</servlet-class> </servlet> <servlet-mapping> <servlet-name>travail</servlet-name> <url-pattern>/travail.html</url-pattern> </servlet-mapping> 2. 3. Au lieu d afficher le message "on va lire le courrier pour nom ", on va lire le courrier. La servlet travail.java passe le contrôle à la servlet lect.java mappée sur lect.html: if (bouton.equals("lire")){ RequestDispatcher disp ; disp=request.getrequestdispatcher("/lect.html"); disp.forward(request,response); Cette servlet affiche un champ pour saisir le password de l utilisateur et passe le contrôle à une autre servlet pour afficher le courrier. Utiliser les cookies pour ne pas redemander le mot de passe de l utilisateur à chaque fois (mais prévoyez qu il puisse changer). Ecrire le code de ces servlets. 4. Au lieu d afficher le message "on va envoyer du courrier", on va envoyer le courrier. La servlet travail.java passe le contrôle à la servlet envoi.java mappée sur envoi.html. Elle demande le destinataire, le sujet et le texte du message à envoyer. et passe le contrôle à une autre servlet qui fait le traitement. Ecrire le code de ces servlets. 7