Dans la série code à garder sous la main : Deux classes pour envoyer des emails
Ces classes pour compiler et fonctionner ont besoin de activation.jar et mail.jar
Première classe : un objet contenant les caractéristiques d’un email
package com.ledruide.utils.mail;
import java.util.ArrayList;
import java.util.List;
/**
* @author JRA
* @since 26 fev. 2005
*/
public class Mail {
public String login = null;
public String password = null;
public String host = null;
public List<String> to = null;
public List<String> cc = null;
public List<String> bcc = null;
public List<String> attach = null;
public String from = null;
public String fromName = null;
public String replyTo = null;
public String subject = null;
public String mode = "html";
public String content = null;
public String priority = null;
public String getLogin() {
return login;
}
public void setLogin(String string) {
login = string;
}
public String getPassword() {
return password;
}
public void setPassword(String string) {
password = string;
}
public String getHost() {
return host;
}
public void setHost(String string) {
host = string;
}
public String getFrom() {
return from;
}
public void setFrom(String string) {
from = string;
}
public String getFromName() {
return fromName;
}
public void setFromName(String string) {
fromName = string;
}
public String getReplyTo() {
return replyTo;
}
public void setReplyTo(String string) {
replyTo = string;
}
public String getSubject() {
return subject;
}
public void setSubject(String string) {
subject = string;
}
public String getMode() {
return mode;
}
public void setMode(String string) {
mode = string;
}
public String getContent() {
return content;
}
public void setContent(String string) {
content = string;
}
public List<String> getTo() {
return to;
}
public void setTo(List<String> list) {
to = list;
}
public void addTo(String string) {
if (to == null) {
to = new ArrayList<String>();
}
to.add(string);
}
public List<String> getCc() {
return cc;
}
public void setCc(List<String> list) {
cc = list;
}
public void addCc(String string) {
if (cc == null) {
cc = new ArrayList<String>();
}
cc.add(string);
}
public List<String> getBcc() {
return bcc;
}
public void setBcc(List<String> list) {
bcc = list;
}
public void addBcc(String string) {
if (bcc == null) {
bcc = new ArrayList<String>();
}
bcc.add(string);
}
public List<String> getAttach() {
return attach;
}
public void setAttach(List<String> list) {
attach = list;
}
public void addAttach(String string) {
if (attach == null) {
attach = new ArrayList<String>();
}
attach.add(string);
}
public String getPriority(){
return priority;
}
public void setPriority( String priority ){
this.priority = priority;
}
}
</pre>
Seconde classe, l'envoi d'email
<pre class="brush:java>
package com.ledruide.utils.mail;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import java.util.StringTokenizer;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
/**
* EnvoiMail
* Classe permettant d'envoyer un mail acceptant comme parametres :
*
* Emetteur.
* Adresse de retour.
* Destinataires (TO, CC, BCC).
* Fichiers attachés.
* Nom de serveur SMTP
* Nom d'utilisateur
* Mot de passe (au cas ou..)
* Sujet
* Contenu
* @author JRA
* @since 26 fev. 2005
*/
public final class SendMail {
private SendMail() { }
/**
* Permet d'utiliser le programme en ligne de commande
* de facon independante.<BR>
* Usage : EnvoiMail [-l login -p password -H host <br>
* -TO to@to1.com;to@to2.com -CC cc@cc1.com;cc@cc2.com -BCC bcc@bcc1.com;bcc@bcc2.com <BR>
* -F fichierAttaché1;fichierAttaché2 -e emetteur -r adresseReponse <BR>
* Sujet et contenu sont demandés ensuite.
*
* @param args
*/
public static void main (final String[] args) {
if (args.length < 4) {
System.out.println(usage());
System.exit(1);
} else {
try {
System.out.println("constructParam");
final Mail arguments = constructParam(args);
System.out.println("createMessage");
createMessage(arguments);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static String usage() {
return "\nUsage : SendMail [-l login\n" +
"\t-p password\n" +
"\t-H host\n" +
"\t-TO to@to1.com;to@to2.com\n" +
"\t-CC cc@cc1.com;cc@cc2.com\n" +
"\t-BCC bcc@bcc1.com;bcc@bcc2.com\n" +
"\t-F fichierAttache1;fichierAttache2\n" +
"\t-e emetteur\n" +
"\t-r adresseReponse\n" +
"\t-m mode[text or html(default)]\n" +
"\nLe sujet et le contenu sont demandes ensuite...";
}
/**
* Construit la HashMap en fonction des arguments passés en ligne de commande
* <h4>Ne doit être appelé que par le main en ligne de commande !<h4>
*
* @param args les arguments de la ligne de commande
* @return la HashMap construite.
*/
private static Mail constructParam (final String[] args) throws Exception {
final Mail courriel = new Mail();
StringTokenizer tokenizer;
final String separateur = ";";
final BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
int i;
for (i = 0; i < args.length; i++) {
/* LOGIN */
if ("-l".equalsIgnoreCase(args[i])) {
courriel.setLogin(args[++i]);
System.out.println("login = " + courriel.getLogin());
}
/* PASSWORD */
else if ("-p".equalsIgnoreCase(args[i])) {
courriel.setPassword(args[++i]);
System.out.println("password = " + courriel.getPassword());
}
/* HOST */
else if ("-H".equalsIgnoreCase(args[i])) {
courriel.setHost(args[++i]);
System.out.println("host = " + courriel.getHost());
}
/* EMETTEUR */
else if ("-e".equalsIgnoreCase(args[i])) {
courriel.setFrom(args[++i]);
System.out.println("emetteur = " + courriel.getFrom());
}
/* ADRESSE REPONSE */
else if ("-r".equalsIgnoreCase(args[i])) {
courriel.setReplyTo(args[++i]);
System.out.println("addresseReponse = " + courriel.getReplyTo());
}
/* TO */
else if ("-TO".equalsIgnoreCase(args[i])) {
tokenizer = new StringTokenizer(args[++i], separateur);
while (tokenizer.hasMoreElements()) {
courriel.addTo(tokenizer.nextElement().toString());
}
}
/* CC */
else if ("-CC".equalsIgnoreCase(args[i])) {
tokenizer = new StringTokenizer(args[++i], separateur);
while (tokenizer.hasMoreElements()) {
courriel.addCc(tokenizer.nextElement().toString());
}
}
/* BCC */
else if ("-BCC".equalsIgnoreCase(args[i])) {
tokenizer = new StringTokenizer(args[++i], separateur);
while (tokenizer.hasMoreElements()) {
courriel.addBcc(tokenizer.nextElement().toString());
}
}
/* MODE */
else if ("-m".equalsIgnoreCase(args[i])) {
courriel.setMode(args[++i]);
System.out.println("mode = " + courriel.getMode());
}
/* FICHIERS ATTACHES */
else if ("-F".equalsIgnoreCase(args[i])) {
tokenizer = new StringTokenizer(args[++i], separateur);
while (tokenizer.hasMoreElements()) {
courriel.addAttach(tokenizer.nextElement().toString());
}
}/* SINON AFFICHER L'AIDE */
else {
System.out.println(usage());
System.exit(1);
break;
}
}
System.out.print("Sujet: ");
System.out.flush();
final String sujet = in.readLine();
courriel.setSubject(sujet);
System.out.print("Contenu: ");
System.out.flush();
final StringBuffer contenu = new StringBuffer(in.readLine());
courriel.setContent(contenu.toString());
return courriel;
}
/**
* Methode d'envoi du message.<br>
* Inclus le traitement des parametres envoyés (test des paramètres nécessaires.
*
* @param mail Mail contenant les paramètres du message
* @exception Exception if an error occurs
*/
public static void createMessage (final Mail mail) throws Exception {
final StringBuffer probleme = new StringBuffer(2000);
if (!testParametres(mail, probleme)) {
throw new Exception(probleme.toString());
}
final Properties properties = System.getProperties();
properties.put("mail.smtp.host", mail.getHost());
final Session session = Session.getInstance(properties, null);
/*
* Inclusion de toutes les variables d'envoi.
*/
final MimeMessage message = new MimeMessage(session);
final Multipart multiPart = new MimeMultipart();
/* SET FROM */
message.setFrom(new InternetAddress(mail.getFrom().toString()));
/* REPLY TO */
final String replyTo = mail.getReplyTo().toString();
//message.setReplyTo(ia.parse(replyTo));
message.setReplyTo(InternetAddress.parse(replyTo));
/* DESTINATAIRE(S) */
Iterator lEnum = mail.getTo().iterator();
while (lEnum.hasNext()) {
final String dest = lEnum.next().toString();
final InternetAddress destIA = new InternetAddress(dest);
message.addRecipient(Message.RecipientType.TO, destIA);
}
/* CARBON COPY */
lEnum = mail.getCc().iterator();
while (lEnum.hasNext()) {
final String dest = lEnum.next().toString();
final InternetAddress destIA = new InternetAddress(dest);
message.addRecipient(Message.RecipientType.CC, destIA);
}
/* BLIND CARBON COPY */
lEnum = mail.getBcc().iterator();
while (lEnum.hasNext()) {
final String dest = lEnum.next().toString();
final InternetAddress destIA = new InternetAddress(dest);
message.addRecipient(Message.RecipientType.BCC, destIA);
}
/* SUJET */
message.setSubject(mail.getSubject());
/* DATE D'ENVOI */
message.setSentDate(new Date());
/* TYPE MIME DE LA PARTIE CONTENU DU MESSAGE */
String charset="utf-8";
final MimeBodyPart mbpMessage = new MimeBodyPart();
if ("html".equalsIgnoreCase(mail.getMode())) {
mbpMessage.setContent(mail.getContent(), "text/html");
}
else {
mbpMessage.setText(mail.getContent());
}
/* AJOUT DU CONTENU AU MESSAGE EN 1ERE PARTIE */
multiPart.addBodyPart(mbpMessage);
/* FICHIERS ATTACHES */
MimeBodyPart mbpAttach;
List fichiers = mail.getAttach();
if (fichiers != null) {
lEnum = fichiers.iterator();
while (lEnum.hasNext()) {
String name = lEnum.next().toString();
File fichier = new File(name);
mbpAttach = new MimeBodyPart();
FileDataSource fds = new FileDataSource(name);
mbpAttach.setDataHandler(new DataHandler(fds));
mbpAttach.setFileName(fichier.getName());
/* AJOUT DU CONTENU AU MESSAGE EN 1ERE PARTIE */
multiPart.addBodyPart(mbpAttach);
}
}
message.setContent(multiPart);
/*
* Transport du message
*/
try {
if ("".equals(mail.getLogin()) && "".equals(mail.getPassword())) {
Transport.send(message, message.getAllRecipients());
}
else {
final Transport transport = session.getTransport("smtp");
transport.connect(mail.getHost(), mail.getLogin(), mail.getPassword());
transport.sendMessage(message, message.getAllRecipients());
transport.close();
}
}catch (Exception e) {
e.printStackTrace();
throw e;
}
}
/**
* Teste la validités des parametres reçu dans la HashMap
*
* @param map la Map des parametres a tester
* @return true si tous les parametres sont testés avec succès
*/
private static boolean testParametres (final Mail mail, final StringBuffer probleme) {
boolean ok = true;
probleme.append("\n*****************************");
probleme.append("\n**** PROBLEMS :");
if (mail == null) {
probleme.append("\nNothing to send ! ........KO");
ok = false;
}
else {
/*
* Verification de la validites de tous les parametres pour
* eviter plus tard une NullPointerException
*/
if ( mail.getLogin() == null ) {
probleme.append("\nNo login..................OK");
mail.setLogin("");
}
if ( mail.getPassword() == null ) {
mail.setPassword("");
probleme.append("\nNo password...............OK");
}
if ( mail.getFrom() == null ) {
mail.setFrom("");
probleme.append("\nNo From...................OK");
}
if ( mail.getReplyTo() == null ) {
mail.setReplyTo(mail.getFrom());
probleme.append("\nNo Reply to...............OK");
}
if ( mail.getHost() == null ) {
mail.setHost("");
probleme.append("\nNo SMTP Host...........FATAL");
ok = false;
}
if ( mail.getSubject() == null ) {
mail.setSubject("");
probleme.append("\nNo subject................OK");
}
if ( mail.getMode() == null ) {
mail.setMode("html");
probleme.append("\nNo mode...................OK");
}
if ( mail.getContent() == null ) {
mail.setContent("");
probleme.append("\nNo content................OK");
}
if ( mail.getTo() == null ) {
mail.setTo(new ArrayList<String>(0));
probleme.append("\nNo recipient TO........FATAL");
ok = false;
}
if ( mail.getCc() == null ) {
mail.setCc(new ArrayList<String>(0));
probleme.append("\nNo Carbon Copy............OK");
}
if ( mail.getBcc() == null ) {
mail.setBcc(new ArrayList<String>(0));
probleme.append("\nNo Blind Carbon Copy......OK");
}
/*
* Ici je regarde de quel type sont les fichiers que je recoit File ou URL
*/
if ( mail.getAttach() != null ) {
List fichiers = mail.getAttach();
Iterator ite = fichiers.iterator();
while (ite.hasNext()) {
final String name = (String)ite.next();
// Try to open URL connection first
try {
URL url = new URL(name);
//InputStream file = null;
url.openStream();
}
catch (MalformedURLException e) {
// Try to open plain file, if `name' is not a URL specification
try {
//InputStream file = null;
new FileInputStream(name);
} catch (FileNotFoundException ex) {
probleme.append("\nAttached file '" + name + "' not found.....FATAL");
ok = false;
}
} catch (IOException ex) {
probleme.append("\nAttached file '" + name + "' not found.....FATAL");
ok = false;
}
} //while
} else {
probleme.append("\nNo attached file..........OK");
}
}
probleme.append("\n*****************************");
return ok;
}
}