TP3 1 Protocole SMTP 2 Programmation Java

publicité
Université Paris 7
M2 II
Protocole Internet
TP3
Mail
Pour ce TP vous exécuterez vos commandes de la machine ouindose. Attention aux fausses manoeuvres, elles
peuvent endommager votre mail sur les machines de l'UFR.
1
Protocole SMTP
1. Le protocole SMTP est dénit dans la RFC 821 (mise à jour
dans la RFC 2821). Le format des messages est spécié 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érication (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 à vos chiers 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 etudiant de ouindose.
1
import java.util.*;
import javax.mail.Address;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
// 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 {
// emetteur du message (MAIL FROM:)
Address emetteur = new InternetAddress("[email protected]",
"Pere Noel");
// recepteur du message (RCPT TO:)
Address receveur = new InternetAddress("etudiant");
// positionnement de la propriete mail.host au serveur local
Properties props = new Properties();
props.put("mail.host", "ouindose.ufr-info-p7.jussieu.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);
2
}
}
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 conejo.ufr-info-P7.jussieu.fr
où se trouve un serveur pop3.
import
import
import
import
javax.mail.*;
javax.mail.internet.*;
java.util.*;
java.io.*;
public class pop3Client {
public static void main(String[] args) {
Properties props = new Properties();
String host = "conejo.ufr-info-p7.jussieu.fr";
//ligne 0
String username = "etudiant";
String password = "motcache";
String provider = "pop3";
try {
// Connection au serveur POP3
//ligne 1
Session session = Session.getDefaultInstance(props, null);
Store store = session.getStore(provider);
//ligne 2
store.connect(host, username, password);
3
// Ouverture de la boite aux lettres
Folder inbox = store.getFolder("INBOX");
if (inbox == null) {
System.out.println("No INBOX");
System.exit(1);
}
inbox.open(Folder.READ_ONLY);
// Lire les messages
Message[] messages = inbox.getMessages();
for (int i = 0; i < messages.length; i++) {
System.out.println("------------ Message " + (i+1)
+ " ------------");
messages[i].writeTo(System.out);
}
// Fermer la connexion en laissant les fichiers
// sur le serveur
inbox.close(false);
store.close();
}
}
}
catch (Exception ex) {
ex.printStackTrace();
}
Modier ce programme pour n'acher que le sujet, l'émetteur
et la date d'envoi.
4. Authentication 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.Authenticator).
Quand une session dispose d'un tel objet, quand on réalise la
connexion, on appelle la méthode getPasswordAuthentificator().
A titre indicatif, on propose une sous classe de Authentificator:
4
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("etudiant"));
...
//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);
}
5
class HideDialog implements ActionListener {
public void actionPerformed(ActionEvent e) {
passwordDialog.hide();
}
}
}
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 ache une boite de dialogue permettant de saisir l'identication
et le mot de passe de l'utilisateur qui désire connaitre les entête
de ces messages.
6
Téléchargement