Utilisation de l'API JavaMail
[40 mn de lecture - paru le 9/4/2003 - Public : Débutant]
|
   
|
Auteur
3. Utilisation des classes JavaMail
Dans cette partie, je vais vous montrez différentes utilisations des classes expliquées
au chapitre précédent pour faire différentes tâches, notamment des exemples d'utilisation
réalisés au cours de mon stage :
3.1. Envoyer un message 
Voici les différentes étapes à accomplir pour envoyer
votre message :
En premier lieu, il faut créer un objet Properties et récupérez les propriétés
du système.
Vous devez spécifier le nom de votre serveur de smtp aux
propriétés (objet Properties) pour mail.smtp.host.
Envoyer des messages nécessite d'avoir une session.
Obtenez la Session objet basé sur Properties.
Créez un objet MimeMessage pour la session, et paramétrez
ensuite celui-ci avec le sujet, le contenu, les adresses du destinataire et
de l'expéditeur.
L'envoie du message se termine par la méthode send()
de la classe Transport.
Exemple:
String emailfrom = ...;
String emailto = ...;
// Récupére les propriétés du systéme
Properties props = System.getProperties();
// Spécification du serveur mail
props.put("mail.smtp.host", host);
// Récupère la session
Session session = Session.getDefaultInstance(props, null);
// Définition du message
MimeMessage message = new MimeMessage(session);
//Spécification de l'expéditeur
message.setFrom(new InternetAddress(emailfrom));
//Spécification du destinataire
message.addRecipient(Message.RecipientType.TO, new InternetAddress(emailto));
//Sujet du message
message.setSubject("Ineo Utilisateurs");
//Texte du message
message.setText("Liste des utilisateurs");
// Envoie le message
Transport.send(message); |
3.2 Vérification des messages 
Pour lire vos messages, vous devez récupérer une session, récupérer et se connecter
à un objet store qui représente un système de stockage de messages. (Nous l’appellerons
« Messagerie »).
Il vous faut ensuite ouvrir le dossier approprié et récupérer vos messages.
Exemple pour le « checking » des messages :
String host = ...;
String username = ...;
String password = ...;
// Créé un objet Properties
Properties props = new Properties();
// Récupère la session
Session session = Session.getDefaultInstance(props, null);
// Récupère la "messagerie" et se connecte
Store store = session.getStore("pop3");
store.connect(host, username, password);
// Récupère le fichier "Boite de réception"
et l'ouvre
Folder folder = store.getFolder("INBOX");
folder.open(Folder.READ_ONLY);
// Check les messages du dossier
Message message[] = folder.getMessages();
//Utilisé pour la lecture
BufferedReader reader = new BufferedReader ( new InputStreamReader(System.in));
for (int i=0, n=message.length; i<n; i++) {br> System.out.println(i
+ ": " + message[i].getFrom()[0] + "\t" + message[i].getSubject());
// Pour la lecture du message
System.out.println("Voulez vous lire le message " [YES
to read/QUIT to end]");
String line = reader.readLine();
if ("YES".equals(line)) {
message[i].writeTo(System.out);
}
else if ("QUIT";.equals(line)) {
break;
}
}
// ferme la connection
folder.close(false);
store.close();
|
3.3 Suppression des messages et « drapeaux » 
Supprimer un message nécessite l’utilisation des « drapeaux
». 
L’objet Flags (javax.mail.Flags) représente les drapeaux. Ceux-ci
sont associés aux messages.
En effet chaque message est défini par un état représenté par un « Flag
». Les différents flags sont prédéfinis dans la classe Flags.Flag et sont listés:
Flags.Flag.ANSWERED
: le message a été demandé
Flags.Flag.DELETED
: message marqué pour la suppression
Flags.Flag.DRAFT
: le message est un brouillon
Flags.Flag.FLAGGED
: message marqué dans un état sans définition
Flags.Flag.RECENT
: message arrivé récemment, non modifiable.
Flags.Flag.SEEN
: message visualisé
Flags.Flag.USER
: le user peut ajouter des états particuliers.
Pour supprimer vos messages, vous devez spécifier les « Flag.DELETED
»
| message.setFlag(Flags.Flag.DELETED, true); |
Ouvrer le dossier en READ_WRITE mode:
| folder.open(Folder.READ_WRITE); |
Une fois les messages passés au processus, fermer le dossier avec la méthode
close() avec comme paramètre true pour effacer les messages.
3.4 Répondre au message 
La classe Message inclue une méthode reply()
pour créer un nouveau message avec les propriétés du message reçu en ajoutant
« RE : » dans le sujet.
Pour répondre seulement à l’expéditeur, il faut passer false
en paramètre à la méthode reply().
MimeMessage reply = (MimeMessage)message.reply(false);
reply.setFrom(new InternetAddress("groupe@ineo.com"));
reply.setText("Message recu merci");
Transport.send(reply); |
3.5 Envoyer un message avec des Pièces jointes 
Lors de mon stage, j'ai du créer une application, envoyant des mails contenant une pièce jointe (un fichier).
Voici pour cela les étapes à suivre pour joindre une pièce jointe à votre message
Les pièces jointes sont des ressources qui peuvent être jointes avec un mail. Elles
souvent placées en dehors des messages comme un fichier texte, une image, une vidéo, un
executable.
Comme avec un client de messagerie, on peut aussi attacher une pièce jointe au mail
avec les API JavaMail et les ouvrir.
Pour envoyer une pièce jointe, il faut créer des parties de messages.Chaque
partie est créée avec un objet de type MimeBodyPart.
La première partie est votre message.
Les autres parties correspondent à la pièce jointe.
Toutes les parties sont ajoutées dans un objet de type MimeMultipart
grâce à la méthode addBodyPart().
Il faut utiliser la classe DataSource pour définir la pièce
jointe qui sera un objet de type FileDataSource.
La méthode setDataHandler() permet l’ajout de la pièce jointe
au message avec la méthode setFileName() pour le nom du fichier.
Exemple:
// Définit le message
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.addRecipient(Message.RecipientType.TO,
new InternetAddress(to));
message.setSubject("Pièce jointe");
// Première partie du message
BodyPart messageBodyPart = new MimeBodyPart();
// Contenu du message
messageBodyPart.setText("le voici");
//Ajout de la première partie du message dans un objet Multipart
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(messageBodyPart);
// Partie de la pièce jointe
messageBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource("image.gif");
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName("image.gif");
//Ajout de la partie pièce jointe
multipart.addBodyPart(messageBodyPart);
message.setContent(multipart);
// Envoi du message
Transport.send(message);
|
3.6 Message HTML
Pour envoyer un mail en html, il vous suffit simplement de d’écrire votre html
dans une string et de le passer au message en lui spécifiant le type et le sous-type
du protocole MIME "text/html"
String htmlText = " <H1>Hello</H1>" + "<img
src=\"http://www.labo-java.com/images/logo.gif\">";
message.setContent(htmlText, "text/html")); |
3.7 Inclure une image au message HTML
Si on veut envoyer un message HTML contenant des images, il faut alors traiter
le message différemment.
En effet, les images doivent être ajoutées en pièces jointes au message. Cependant
chaque image doit être référencée par une "cid URL". cid
est la référence du Content-ID (entête de l'image attaché). Ainsi on pourra
mettre le lien de l'image dans le HTML par le cid que l'on aura défini.
Le processus reste le même que pour une pièce jointe classique (chapitre 3.5),
cependant nous devons indiquer le lien entre les deux parties du message, la
partie contenu (html) et l'image. Ceci se fera grâce à "related"
passé en paramètre au constructeur de l'objet MultiPart.
Exemple:
| String file = ...;
// Crée le message
Message message = new MimeMessage(session);
// On met les attributs d'entête ( sujet, adresse, expéditeur,
destinataire)
message.setSubject("Embedded Image");
message.setFrom(new InternetAddress(from));
message.addRecipient(Message.RecipientType.TO,
new InternetAddress(to));
// Crée la partie message pour le contenu
BodyPart messageBodyPart = new MimeBodyPart();
String htmlText = "<H1>Hello</H1>" +
"<img src=\"cid:image\">";
//Type et sous-type du message
messageBodyPart.setContent(htmlText, "text/html");
//Crée l'objet Multipart qui contiendra toutes les parties du message
//on doit passer en paramètre "related", puisque les deux parties entres
elles
//sont reliées
MimeMultipart multipart = new MimeMultipart("related");
multipart.addBodyPart(messageBodyPart);
// Crée l'autre partie du message qui contient l'image
messageBodyPart = new MimeBodyPart();
// Place l'image dans la partie
DataSource fds = new FileDataSource(file);
messageBodyPart.setDataHandler(new DataHandler(fds));
//Attribue un nom à l'entête de l'image ( pour faire le lien)
messageBodyPart.setHeader("Content-ID","<image>");
// Ajoute la partie à l'objet Multipart
multipart.addBodyPart(messageBodyPart);
// Ajoute l'objet Multipart au message
message.setContent(multipart);
|
3.8 Gestion d'une mailing liste
Durant mon stage j’ai du concevoir une application permettant d’envoyer un
ficher Excel (créer à partir d’une base de données) à une liste de contact.
Ainsi je vais pouvoir vous montrer la gestion d’une liste de contact avec l’envoi
d’un fichier ou d’un message à ces contacts.
La plupart des programmes de mail comme Outlook permettent d'envoyer un même message à plusieurs personnes. Il suffit de mettre dans la liste des destinataires les emails des personnes à qui vous souhaitez envoyer ce même message.
Malheureusement ceci a la fâcheuse tendance de donner un côté spam au message.
JavaMail peut pallier à ce problème, en envoyant le message à plusieurs personnes et de manière individuelle.
Il va donc falloir créer le message avec le sujet et le contenu.
Comme je vous l’ai présenté dans mon premier exemple, voici les règles de création
d’un message puis de son envoi :
Récupération d'une session grâce
à Session.getDefaultInstance(props, null).Cette méthode static
prend en paramètre un objet de type Properties qui doit décrire
le serveur de mail.
Création d'un message de classe
MimeMessage.
Une fois créé ce message, il faut modifier l'expéditeur, la liste des destinataires,
le sujet et le contenu du message, grâce aux méthodes setFrom(),
setRecipients(), setSubject() et setContent().
Envoi du message grâce à la méthode
static send() de la classe Transport.
Pour la modification du destinataire, il suffit d’étudier le fichier .txt
qui contient la liste des destinataires.
Chaque ligne du fichier texte doit contenir un destinataire. On récupère alors
chaque destinataire dans un variable de type String dest.
InternetAddress [] address = {new InternetAddress (dest)};
message.setRecipients (Message.RecipientType.TO, address);
|
Voici le programme utilisé pour envoyer un message à une liste de contacts
:
import ineo.utilities.*;
import ineo.metier.*;
import javax.mail.internet.*;
import javax.mail.*;
import java.util.*;
import java.io.*;
import javax.mail.internet.InternetAddress;
public class mail {
public mail() {
}
private final static String MAILER_VERSION = "Java";
public static void envoyerMailSMTP(String serveur, boolean debug) {
try {
Properties prop = System.getProperties();
prop.put("mail.smtp.host", "smtp.ineo.fr");
Session session = Session.getDefaultInstance(prop, null);
Message message = new MimeMessage(session);
//Modification de l'expéditeur du message
message.setFrom(new InternetAddress("juliemuesser@ineo.com"));
// Lecture du fichier txt listeDiffusion afin de récupérer
toutes les adresses mails
String nomFichier = "listeDiffusion.txt";
FileReader file = new FileReader("nomFichier");
BufferedReader buf = new BufferedReader(file);
String adr = buf.readLine();
// On crée un ArrayList qui contiendra les adresses mails
ArrayList mesAddresses = new ArrayList();
while (adr != null) {
mesAddresses.add(adr);
adr = buf.readLine();
}//while
InternetAddress[] internetAddresses = null;
String uneAdresse = "";
//Modification du destinataire
for (int i = 0; i < mesAddresses.size(); i++) {
uneAdresse = (String) mesAddresses.get(i);
internetAddresses[i] = new InternetAddress(uneAdresse);
}//for
message.setRecipients(Message.RecipientType.TO, internetAddresses);
//Modification des autres propriétés du message
message.setSubject("Test");
message.setText("test mail");
message.setHeader("X-Mailer", MAILER_VERSION);
message.setSentDate(new Date());
session.setDebug(debug);
//envoie du message
Transport.send(message);
}//try
catch(Exception e)
{
e.printStackTrace();
}//catch
}//envoyerMailSMTP()
}//class Mail
|
|