Exercice commenté. Mailer java. 1. Intitulé. 2. Approche



Documents pareils
Pour plus de détails concernant le protocole TCP conférez vous à la présentation des protocoles Internet enseignée pendant.

TP3. Mail. Attention aux fausses manoeuvres lors de ce TP vous pouvez endommager votre mail sur ouindose.

Corrigé des exercices sur les références

Flux de données Lecture/Ecriture Fichiers

Programmation Internet en Java

Gestion distribuée (par sockets) de banque en Java

Programmation Réseau. Sécurité Java. UFR Informatique jeudi 4 avril 13

Dis papa, c est quoi un bus logiciel réparti?

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Introduction au langage Java

Communication inter-processus (IPC) : tubes & sockets. exemples en C et en Java. F. Butelle

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Projet de programmation (IK3) : TP n 1 Correction

Programmer en JAVA. par Tama

Cahier des Charges du Projet Domotique. Choquet Mathieu Masson Jérôme Groupe 6. Domotique. p.1

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Chapitre 10. Les interfaces Comparable et Comparator 1

PROGRAMMATION PAR OBJETS

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Remote Method Invocation (RMI)

Le modèle client-serveur

Le Modèle de Sécurité dans JAVA

Couche application. La couche application est la plus élevée du modèle de référence.

Développement Logiciel

Applet pour visualiser les variables «automate» notifiées

IFT287 Exploitation de base de données relationnelles et orientées objet. Laboratoire Mon premier programme Java en Eclipse

Synchro et Threads Java TM

Construire des plug-ins pour SAS Management Console SAS 9.1

Développement d un logiciel de messagerie instantanée avec Dotnet (version simplifiée)

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

Interfaces graphiques avec l API Swing

RMI le langage Java XII-1 JMF

Premiers Pas en Programmation Objet : les Classes et les Objets

TD3: tableaux avancées, première classe et chaînes

Programmation Orientée Objet - Licence TIS CM8/9. Rappel sur la séance précédente. Lancelot Pecquet Lancelot.Pecquet@math.univ-poitiers.

Cours 6 : Programmation répartie

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Auto-évaluation Programmation en Java

Paramétrage de compte mail netplus sur iphone et ipad

Remote Method Invocation en Java (RMI)

Tp 1 correction. Structures de données (IF2)

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Une introduction à Java

STS SE. FreeRTOS. Programmation réseau WIFI. Programmation réseau. Socket Tcp. FlyPort smart Wi-Fi module

INITIATION AU LANGAGE JAVA

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Programmation client-serveur sockets - RPC

Cours 1: Java et les objets

Utilisation d objets : String et ArrayList

ACTIVITÉ DE PROGRAMMATION

API04 Contribution. Apache Hadoop: Présentation et application dans le domaine des Data Warehouses. Introduction. Architecture

La carte à puce. Jean-Philippe Babau

Divers éléments. Protocoles d'applications. Un agent Utilisateur. MUA - Agents Utilisateurs de Courriel. Simple Mail Transfer Protocol

OpenPaaS Le réseau social d'entreprise

Un ordonnanceur stupide

Programme Compte bancaire (code)

Java Licence Professionnelle CISII,

Desktop Intégration. Rémi Forax

"Indy\Source\Fulld7.bat" 6. Lancer à présent Delphi. Allez dans le menu "Composant" puis sur "Installer des paquets...".

Le MSMQ. Version 1.0. Pierre-Franck Chauvet

Java Licence professionnelle CISII,

Programmation Objet Java Correction

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Threads. Threads. USTL routier 1

RN2-Programmation Orientée Objet - JAVA CH 1 Introduction à la POO et Java

Objets et Programmation. origine des langages orientés-objet

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

Entrées / Sorties. Entrées / Sorties. Entrées/Sorties. System.out. Fonctionnement par flots (stream) Karima Boudaoud IUT- R&T. Terrain connu.

Introduction : les processus. Introduction : les threads. Plan

TP JAVASCRIPT OMI4 TP5 SRC

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

L3 informatique TP n o 2 : Les applications réseau

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Programmation Réseau SSH et TLS (aka SSL)

Architecture Orientée Service, JSON et API REST

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

TP Composants Java ME - Java EE. Le serveur GereCompteBancaireServlet

Approche Contract First

Plan du cours. Historique du langage Nouveautés de Java 7

FTP & SMTP. Deux applications fondamentales pour le réseau Internet.

Module Com231A - Web et Bases de Données Notion 5 : Formulaires et utilisation des Bases de Données avec PHP

Configuration des logiciels de messagerie

Solutions du chapitre 4

A DESTINATION DES SERVICES TIERS. Editeurs d applications et ressources pédagogiques connectées à l ENT

Environnements de développement (intégrés)

Bases du langage. Historique Applications et applets Éléments de base du langage Classes et objets Les exceptions

Corrigés des premiers exercices sur les classes

Java DataBaseConnectivity

Package Java.util Classe générique

Chapitre VI- La validation de la composition.

La gestion des serveurs de mail

La gestion des exceptions

Java et les bases de données: JDBC: Java DataBase Connectivity SQLJ: Embedded SQL in Java. Michel Bonjour

TP1 : Initiation à Java et Eclipse

Notes de cours Practical BigData

Configuration de Zabbix

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

La messagerie électronique avec La Poste

Transcription:

Exercice commenté Auteur : cj-tronquet@ifrance.com Mailer java 1. Intitulé Ecrire une applet qui permette d envoyer un e-mail à partir d une page web. Cette applet devra contenir les champs From:, To:, Subject:, et le texte du message. Un bouton déclenchera l envoi du mail. 2. Approche Nous allons faire communiquer notre applet avec un serveur SMTP (Simple Mail Transfer Protocol). Ce protocole est le plus utilisé pour transmettre des e-mails. Du fait des restrictions de sécurité de Java, l applet ne peut qu établir une connection entre serveurs résident sur la même machine que l applet. Notre applet sera donc localisée sur une machine qui héberge également un serveur SMTP. 2.1. Le protocole SMTP Voici une session type de communication entre un client et un serveur SMTP : - le client ouvre un socket sur le port 25 du serveur SMTP (port par défaut). - Pour accord, le serveur SMTP renvoie une chaîne qui commence par 220. - Le client envoie la commande HELO suivie par son nom de domaine. - Pour accord, le serveur répond avec une chaîne commençant par 250. - Le client envoie la chaîne MAIL FROM: suivie de l adresse de l émetteur. - Si le serveur accepte cette adresse, il répond par le code 250. - Le client envoie la chaîne RCPT TO: suivie de l adresse du destinataire. - Si vous avez suivi, le serveur accepte en envoyant le code 250. - Puis le client envoie la commande DATA. - Le serveur envoie alors le code 354. - Le client peut alors envoyer son mail à proprement parler. Pour annoncer au serveur que le message est terminé, il faut envoyer le caractère «.» seul sur une ligne. - Le serveur répond alors par 250 si il a bien reçu le message. - Le client envoie la commande QUIT pour demander la fin de la connexion. - Le serveur envoie alors le code 221 et ferme la communication. 2.2. Fonctions et classes utiles La classe Socket permet d effectuer la liaison entre le client et le serveur. Les streams d écriture et de lecture sur le socket sont PrintStream et DataInputStream. Pour l écriture, on utilisera les méthodes println et flush de la classe PrintStream et pour la lecture, la méthode readline de DataInputStream. A des fins de propreté et de solidité de notre applet, on pourra utiliser les classes d exceptions adaptées à notre cas : ProtocolException, UnknownHostException, et IOException.

C est là que l on voit clairement l avantage de Java sur d autres langages : sa simplicité. Il suffit seulement des quelques fonctions ci-dessus pour pouvoir implémenter un mailer web! 3. Solution commentée 3.1. Vue d ensemble Il nous faut tout d abord créer l environnement graphique qui permettra d écrire un e-mail. Pour cela on utilisera dans cet exercice le gestionnaire de mise en page GridBagLayout ; cela va mous permettre un positionnement précis des objets dans le cadre de l applet. Toutes ces opérations se font naturellement dans la méthode init. On va redéfinir la méthode action pour intercepter l appui sur le bouton «Envoyer». Si l evènement intercepté provient bien du bouton, alors on exécute la méthode «envoyer» qui se charge d émettre le mail vers le serveur SMTP. On va écrire la méthode Trace qui nous permettra d écrire dans la zone de message toutes les informations utiles (notamment de connexion). Si les codes que le serveur renvoie ne sont pas ceux attendus, on va générer des exceptions. Celles-ci seront traitées par la fonction appelante, en l occurrence action. 3.2. Code source Mail.java import java.applet.applet; import java.net.*; import java.io.*; import java.awt.*; public class Mail extends java.applet.applet { TextArea tmessage; // zone de texte contenant le texte du mail Button benvoie; // pour envoyer le mail TextField tsujet; // zone texte contenant le sujet TextField tto; // zone texte contenant le destinataire du message TextField tfrom; // zone texte contenant l'émetteur du message public void init() { //Positionnement des objets GridBagLayout gridbag = new GridBagLayout(); GridBagConstraints g = new GridBagConstraints(); setfont(new Font("Arial", Font.PLAIN, 12)); setlayout(gridbag); g.anchor = GridBagConstraints.NORTHEAST; g.fill = GridBagConstraints.HORIZONTAL; g.weightx = 1.0; g.weighty = 1.0; benvoie = new Button("Envoyer") ; gridbag.setconstraints(benvoie, g); add(benvoie); g.gridwidth = GridBagConstraints.RELATIVE; Label labelfrom = new Label("De :"); gridbag.setconstraints(labelfrom, g); add(labelfrom); tfrom = new TextField("") ; gridbag.setconstraints(tfrom, g); add(tfrom); benvoie = new Button("Envoyer") ; gridbag.setconstraints(benvoie, g); add(benvoie); Label labelto = new Label("à :") ; gridbag.setconstraints(labelto, g); add(labelto);

tto = new TextField("") ; gridbag.setconstraints(tto, g); add(tto); Label labelsujet = new Label("Sujet :") ; gridbag.setconstraints(labelsujet, g); add(labelsujet); tsujet = new TextField("") ; gridbag.setconstraints(tsujet, g); add(tsujet); Label labelmessage = new Label("Message :") ; gridbag.setconstraints(labelmessage, g); add(labelmessage); g.fill = GridBagConstraints.BOTH ; g.gridheight = GridBagConstraints.REMAINDER; tmessage = new TextArea("",5,40) ; gridbag.setconstraints(tmessage, g); add(tmessage); public boolean action(event evt, Object arg) { if (evt.target instanceof Button) { // si l'evt a été généré par le bouton try { envoyer( tto.gettext(), tfrom.gettext(), tsujet.gettext(), tmessage.gettext() ) ; //on écrit un message dans la zone du message catch(unknownhostexception uhe) { Trace("*** EXCEPTION: Hote inconnu: " + uhe ) ; catch(protocolexception pe) { Trace("*** EXCEPTION de protocole: " + pe ) ; catch(ioexception ioe) { Trace("*** EXCEPTION e/s: " + ioe ) ; return true ; public void envoyer( UnknownHostException { String to_address, String from_address, String ssu, String smess) throws IOException, ProtocolException, tmessage.settext("") ; //on ecrit un récapitulatif dans la zone de message Trace("+---------Envoi d'un mail-----------------------+") ; Trace(" De: " + from_address) ; Trace(" à: " + to_address) ; Trace(" Sujet: " + ssu) ; Trace("+-----------------------------------------------+"); Trace(" Message : " + smess) ; Trace("+-----------------------------------------------+") ; Socket socket; DataInputStream in; PrintStream out; String hote; String str; // Le stream de lecture du Socket // Le stream d'ecriture du Socket // Identification du poste // Pour la lecture de donnees // Identification du poste hote = InetAddress.getLocalHost().toString() ; // On aurait tout aussi bien pu spécifier explicitement l'hôte // ex: www.wanadoo.fr

// Ouverture du socket (connection au serveur SMTP) // et des streams de lecture et d'ecriture socket = new Socket(getDocumentBase().getHost(), 25); in = new DataInputStream(socket.getInputStream()); out = new PrintStream(socket.getOutputStream()); // lecture du message initial if (!str.startswith("220")) throw new ProtocolException(str); while (str.indexof('-') == 3) { if (!str.startswith("220")) throw new ProtocolException(str); // Envoie de HELO au serveur SMTP out.println( "HELO " + hote ); // On est connecte au serveur... // Envoi des infos d'émetteur et de destinataire out.println( "MAIL FROM: " + from_address ); out.println( "RCPT TO: " + to_address ); // On est pret a envoyer les donnees out.println( "DATA" ); if (!str.startswith("354")) throw new ProtocolException(str); //Texte du message // Emetteur - Destinataire - Sujet out.println("from: " + from_address); out.println("to: " + to_address); out.println( "Subject: " + ssu + "\n" ); // lignes non obligatoire mais fortement recommandées, sous peine de refus des mails out.println("comment: Unauthenticated sender"); out.println("x-mailer: Simple tsmtp"); out.println(""); out.println( smess ) ; out.println(".") ; out.println("quit"); out.flush(); in.close() ; Trace("Fin du mail...") ;

socket.close(); return ; public void Trace(String str) { tmessage.appendtext(str + "\n"); //penser au caractère de fin de ligne "\n" return ; public static void main(string args[]) { Frame f = new Frame("Mailer web"); Mail mailer = new Mail(); mailer.init(); mailer.start(); f.add("center", mailer); f.resize(350, 200); f.pack(); f.show();