L'angolo del N00b

Appunti di programmazione per principianti e non
 
IndiceIndice  CalendarioCalendario  FAQFAQ  CercaCerca  Lista utentiLista utenti  GruppiGruppi  RegistrarsiRegistrarsi  AccediAccedi  

Condividere | 
 

 JavaMail - Package di gestione servizio e-mail

Vedere l'argomento precedente Vedere l'argomento seguente Andare in basso 
AutoreMessaggio
Jambalaya
Admin


Maschile
Numero di messaggi : 33
Età : 35
Località : Bios
Data d'iscrizione : 21.02.09

MessaggioOggetto: JavaMail - Package di gestione servizio e-mail   Gio Mag 14, 2009 4:01 pm

Per inviare le mail serviranno le librerie JAvaMail e il JAF che si occupa di gestire gli invii mail piu' complessi. Al classpath si eve aggiungere mail.jar dalla libreria JAvaMail activation.jar da JAF
Per reperira JavaMail usare il seguente indirizzo: http://java.sun.com/products/javamail/downloads/index.html
Per JAF http://java.sun.com/javase/technologies/desktop/javabeans/jaf/downloads/index.html (Per le versioni di Java <1.6 poichè dopo è nativo)


Ora mandiamo una semplice mail usando JavaMail, nel codice di esempio i settaggi sono stati messi tutti in una singola clsse "Mail Settings" in modo da rendere più semplice la comparazione del codice.

Codice:


public class MailSettings {
   // settare smtpHost con l'hostname del proprio server
   public static String smtpHost="mail.example.com";   
   // per l'autenticazione SMTP si settino le due seguenti linee con user e psw
   public static String smtpUsername="username";
   public static String smtpPassword="password";
   
   // settare toAddress con l'indirizzo del destinatario
   public static String toAddress="destinatario@example.com";

   //settare un array con un "x" di altri destinatari in CopiaCarbone
   
   public static String[] ccAddresses=new String[] { "someone@example.com", "other@example.com" };

   //settaggio del mittente   
   public static String fromAddress="io@example.com";
   public static String fromName="Mail Example App";
   
   //settaggio dell'oggetto della mail
   public static String messageSubject="Oggetto della mail";
   
   //Corpo della mail
   public static String messageBody1="Riempimento del corpo della mail di esempio";
   
   //è possibile allegare dei file
   public static String inlineImage="file:immagineAllegato.gif";   
}

C'è un altra cosa necessaria prima di iniziare a mandare e-mail, lhostname del server SMTP. JavaMail usa il concetto di una classe di Sessione per mantenere i settaggi come l'host SMTP e l'autenticazione. l'idea è quela che la sessione possa essere isolata nella JAva Virtual Machine e questo dovfrebe interrompere il furto di code di connessioni in cui si possono trovare anche user e psw. Testiamo una sessione:

Codice:

Properties props=new Properties();
props.put("mail.smtp.host",MailSettings.smtpHost);
Session session=Session.getDefaultInstance(props,null);


Non si creano nuove Sessioni, le si creano dalla Session factory e gli si passano i settaggi attraverso un istanza dele Propietà. Qui abbiamo solo settato l'host SMTP. Ora è possibile creare un messaggio utilizzando tale connessione.

Codice:

Message message=new MimeMessage(session);


JavaMail ha una classe "Message" della quale tutti i tipi di messaggio dipendono. Se cercate nell'API di JavaMail noterete che esiste solo una subclasse, "MimeMessage". JavaMail costruita come un framwork per messaggi generico, per questo l'apparente ridondanza di astrazione. Noi abbimao creato un MimeMessage usando la sessione, ed ora dobbiamo popolarlo.

Codice:

message.setFrom(new InternetAddress(MailSettings.fromAddress, MailSettings.fromName));

Sempre a proposito di astrazioni, JavaMail ha una classe "Address" dalla quale derivano gli altri tipi di indirizzamento, se ci occupiamo solo di mandare e-mail tramite internet, usiamo un "InternetAddess", il quale immagazzina l'indirizzo e-mail che farà la aprte del "from" ed un nome personale a scopo di visualizzazione. Ora per settare il destinatario:

Codice:

message.setRecipient(Message.RecipientType.TO, new InternetAddress(MailSettings.toAddress));

Questa astrazione di indirizzi si vede anche ora, settiamo un destinatario e il suo tipo. Da ora in avanti, almeno per le e-mail di solo testo, è una passeggiata. Dobbiamo solamente settare l'oggetto e il testo nella e-mail e stamparlo.

Codice:

message.setSubject(MailSettings.messageSubject);
message.setText(MailSettings.messageBody1);
message.setSentDate(new Date());

Si puo' quindi inviare il messaggio:

Codice:

Transport.send(message);

Questa chiamata alla classe "Transport" le fa cercare la sessione apropriata e il modo di inoltro del messaggio. Fatto ciò l'e-mail è inviata. Dobbiamo ancora aggiunger del codice per catturare le tre diverse exception che JavaMail può generare, AddressException, MessagingException e UnsupportedEncodingException. E questo è il metodo basilare per inviare e-mail con JavaMail.

L'autenticazione SMTP (ie. SMTP AUTH) necessita di un username e una psw per poter permettere l'invio di e-mail.
Con JavaMail è necessario creare un autenticatore che restituisca le credenziali:

Codice:

class ForcedAuthenticator extends Authenticator {
  public PasswordAuthentication getPasswordAuthentication() {
    return new PasswordAuthentication(MailSettings.smtpUsername,
      MailSettings.smtpPassword);
  }
}

Quindi si assegna una sua instanza alla Sessione quando la creiamo.

Codice:

Session session=Session.getDefaultInstance(props,new ForcedAuthenticator());

C'è una limitazione tuttavia, fare ciò lega la sessione di default alla specifica autorizzazione e si ha bisogno di una reference ad essa per attivare la sessione. Si puo' sostituire usando "Session.getInstance() che crea una nuova instanza non condivisa, ma ora si deve gestire la propria istanza di sessione.

La classe "Message" di JavaMail ha un metodo chiamato setRecipients che accetta un array di InternetAddress. Non è elegante e si puo' incorrere in errori se si prepare un array di stringhe di indirizzi e-Mail.

Codice:

ArrayList ccs=new ArrayList();
for(String s:MailSettings.ccAddresses) ccs.add(new InternetAddress(s));
message.setRecipients(Message.RecipientType.CC,
(InternetAddress[]) ccs.toArray(new InternetAddress[ccs.size()]));

Infine vediamo come inviare e-mail contenenti codifica html e immagini allegate. Qui è dove il framework di JavaBeans Activation entra in gioco con JavaMail per assistere nella codifica dell'immagine. Con l'API JavaMail creaiamo un instanza di MimeMultipart instance e quindi creiamo un MimeBodyParts e li assembliamo insieme in questa instanza del Mimemultipart.

Codice:

MimeMultipart multipart=new MimeMultipart();
BodyPart msgBodyPart=new MimeBodyPart();
msgBodyPart.setContent("<H1>Hi! From HtmlJavaMail</H1>
  <img src=\"cid:logo\">","text/html");
BodyPart embedImage=new MimeBodyPart();
DataSource ds=new URLDataSource(new URL(MailSettings.inlineImage));
embedImage.setDataHandler(new DataHandler(ds));
embedImage.setHeader("Content-ID","");
multipart.addBodyPart(msgBodyPart);
multipart.addBodyPart(embedImage);
message.setContent(multipart);

La prima BodyPart ha il contenuto settato a stringa ed un tipèo di contenuto "txt/html". Notate che nell'html che stiamo settando l'IMG tag si riferisce a un content-id: questo p il nome dela parte del messaggio MIME che conterrà il logo GIF. Per incrporate l'immagine creaiamo un altro BodyPart e creiamo un data source JAF così che la libreria JAF possa lavorare sul menagement dell'immagine. Dobbimao quindi aggiundere al BodyPart un DataHandler usando questo DataSource così da permetergli di legger sia che punti ad un contenuto o ad un indirizzo URL. In fine dobbiamo settare il Content-ID nell'header del BodyPart cosi vi si può accedere come un immagine allegata. Queste BodyParts che abbiamo creato vengono quindi aggiunte ad un instanza di MimeMultipart e invece di chiamare setText() nel messaggio chiamiamo setContent() con questa instanza. La parte complicata sta nel gestire tutti questi content Id. Qui è stata ggiunta una sola immagine, ma c'à bisogno di una BodyPart e di un content id da inserire nell'HTML per ogni allegato.

JavaMail richiede un maggiore impegno da parte del programmatore rispeto alla ontroparte Common, ma concede anche un maggiore controllo del codice e della sicurezza.

Esempio di Classe preparata ad hoc.

Codice:

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Date;
import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessageRemovedException;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class MailJavaMail {

   public static void main(String[] args) {
      MailJavaMail mjm = new MailJavaMail();
      mjm.sendMail();
   }

   public MailJavaMail() {}

   public void sendMail() {
      Properties props = new Properties();
      props.put("mail.smtp.host", MailSettings.smtpHost);
      Session session = Session.getDefaultInstance(props, new ForcedAuthenticator());
      Message message = new MimeMessage(session);
      try {
         message.setFrom(new InternetAddress(MailSettings.fromAddress,
               MailSettings.fromName));
         message.setRecipient(Message.RecipientType.TO, new InternetAddress(
               MailSettings.toAddress));
         ArrayList ccs=new ArrayList();         
         for(String s:MailSettings.ccAddresses) ccs.add(new InternetAddress(s));         
         message.setRecipients(Message.RecipientType.CC,(InternetAddress[]) ccs.toArray(new InternetAddress[ccs.size()]));
         message.setSubject(MailSettings.messageSubject);
         message.setText(MailSettings.messageBody1);
         message.setSentDate(new Date());
         Transport.send(message);
      } catch (AddressException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      } catch (MessagingException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      } catch (UnsupportedEncodingException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }
   }
   class ForcedAuthenticator extends Authenticator {
      public PasswordAuthentication getPasswordAuthentication() {
         return new PasswordAuthentication(MailSettings.smtpUsername,
               MailSettings.smtpPassword);
      }
   }
}

Esempio di classe HtmlJavaMail

Codice:

import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Date;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.activation.URLDataSource;
import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

public class HtmlJavaMail {

   public static void main(String[] args) {
      HtmlJavaMail mjm = new HtmlJavaMail();
      mjm.sendMail();
   }

   public HtmlJavaMail() {}

   public void sendMail() {
      Properties props = new Properties();

      props.put("mail.smtp.host", MailSettings.smtpHost);
      props.put("mail.debug","true");
      Session session = Session.getDefaultInstance(props, new ForcedAuthenticator());

      Message message = new MimeMessage(session);

      try {
         message.setFrom(new InternetAddress(MailSettings.fromAddress,
               MailSettings.fromName));

         message.setRecipient(Message.RecipientType.TO, new InternetAddress(
               MailSettings.toAddress));

         message.setSubject(MailSettings.messageSubject);

         MimeMultipart multipart=new MimeMultipart();
         
         BodyPart msgBodyPart=new MimeBodyPart();
         msgBodyPart.setContent("<H1>Hi! From HtmlJavaMail</H1><img src=\"cid:logo\">","text/html");
         
         BodyPart embedImage=new MimeBodyPart();
         DataSource ds=new URLDataSource(new URL(MailSettings.inlineImage));
         embedImage.setDataHandler(new DataHandler(ds));
         embedImage.setHeader("Content-ID","<logo>");
         
         multipart.addBodyPart(msgBodyPart);
         multipart.addBodyPart(embedImage);
         
         message.setContent(multipart);

         message.setSentDate(new Date());

         Transport.send(message);

      } catch (AddressException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      } catch (MessagingException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      } catch (UnsupportedEncodingException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      } catch (MalformedURLException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }

   }

   class ForcedAuthenticator extends Authenticator {
      public PasswordAuthentication getPasswordAuthentication() {
         return new PasswordAuthentication(MailSettings.smtpUsername,
               MailSettings.smtpPassword);
      }
   }
}

_________________



Tornare in alto Andare in basso
Vedere il profilo dell'utente http://jteam.forumattivo.info
 
JavaMail - Package di gestione servizio e-mail
Vedere l'argomento precedente Vedere l'argomento seguente Tornare in alto 
Pagina 1 di 1
 Argomenti simili
-
» Come eliminare tutte le e-mail in pochissimi click da Hotmail
» Come inserire l'apice e/o il pedice su Word 2007
» Hotmail in versione cinese - qq.com
» Recensione sito web: Softonic.it
» Software lavatrice - Arduino

Permesso di questo forum:Non puoi rispondere agli argomenti in questo forum
L'angolo del N00b :: Java netBook :: Soluzioni-
Andare verso: