TP2 1 Protocole SMTP 2 Programmation Java

publicité
Université Paris 7
M2 II
Protocole Internet
TP2
Mail et servlet
1
Protocole SMTP
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("[email protected]",
"Pere Noel");
// recepteur du message (RCPT TO:)
Address receveur = new InternetAddress("[email protected]");
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
import
import
import
javax.mail.*;
javax.swing.*;
java.awt.*;
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
import
import
import
java.io.*;
java.net.*;
javax.servlet.*;
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>
3.
2. 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
Téléchargement