Invio Email con Java Mail

DOMANDA:

Come posso inviare un'email in Java?


RISPOSTA:

Java mette a disposizione la libreria javax.mail che permette, con estrema facilità, di inviare un'email anche utilizzando il protocollo SMTPs (SMTP + SSL). Nel codice seguente vi mostro come farlo con SMTPs (ad esempio utilizzando Gmail), ma basterà seguire i commenti per modificarlo in semplice SMTP (ad esempio per l'utilizzo con l'account base di Email.it).

Invio di Email con protocollo SMTPs :
package invioemail;

import java.util.Date;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.NoSuchProviderException;
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 EmailSender {
  private String user;
  private String password;
  private String host;
  private String mittente;
  private String destinatario;
  private String oggetto;
  private String allegato;

  /**
  * Costruttore completo, richiede i parametri
  * di connessione al server di posta
  * @param user
  * @param password
  * @param host
  * @param mittente
  * @param destinatari
  * @param oggetto
  * @param allegati
  */
  public EmailSender(String user, String password, String host, 
                     String mittente, String destinatario, 
                     String oggetto, String allegato){

    this.user = user;
    this.password = password;
    this.host = host;
    this.mittente = mittente;
    this.destinatario = destinatario;
    this.oggetto = oggetto;
    this.allegato = allegato;
  }

  // Metodo che si occupa dell'invio effettivo della mail
  public void inviaEmail() {
    int port = 465; //porta 25 per non usare SSL

    Properties props = new Properties();
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.user", mittente);
    props.put("mail.smtp.host", host);
    props.put("mail.smtp.port", port);

    // commentare la riga seguente per non usare SSL 
    props.put("mail.smtp.starttls.enable","true");
    props.put("mail.smtp.socketFactory.port", port);

    // commentare la riga seguente per non usare SSL 
    props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
    props.put("mail.smtp.socketFactory.fallback", "false");

    Session session = Session.getInstance(props, null);
    session.setDebug(true);

    // Creazione delle BodyParts del messaggio
    MimeBodyPart messageBodyPart1 = new MimeBodyPart();
    MimeBodyPart messageBodyPart2 = new MimeBodyPart();

    try{
      // COSTRUZIONE DEL MESSAGGIO
      Multipart multipart = new MimeMultipart();
      MimeMessage msg = new MimeMessage(session);

      // header del messaggio
      msg.setSubject(oggetto);
      msg.setSentDate(new Date());
      msg.setFrom(new InternetAddress(mittente));

      // destinatario
      msg.addRecipient(Message.RecipientType.TO,
      new InternetAddress(destinatario));

      // corpo del messaggio
      messageBodyPart1.setText("Saluti dal Blog di Lancill! Vieni a trovarmi su http://lancill.blogspot.it");
      multipart.addBodyPart(messageBodyPart1);

      // allegato al messaggio
      DataSource source = new FileDataSource(allegato);
      messageBodyPart2.setDataHandler(new DataHandler(source));
      messageBodyPart2.setFileName(allegato);
      multipart.addBodyPart(messageBodyPart2);

      // inserimento delle parti nel messaggio
      msg.setContent(multipart);

      Transport transport = session.getTransport("smtps"); //("smtp") per non usare SSL
      transport.connect(host, user, password);
      transport.sendMessage(msg, msg.getAllRecipients());
      transport.close();

      System.out.println("Invio dell'email Terminato");

    }catch(AddressException ae) {
      ae.printStackTrace();
    }catch(NoSuchProviderException nspe){
      nspe.printStackTrace();
    }catch(MessagingException me){
      me.printStackTrace();
    }
  }
}

Questa la classe di Test (sostituite i parametri del costruttore con i vostri dati di configurazione):
package invioemail;

public class TestEmail {
  public static void main(String[] args) {

    EmailSender email = new EmailSender(
                    "username",
                    "password", 
                    "smtp.gmail.com",
                    "indirizzo@mittente.it", 
                    "indirizzo@destinatario.it", 
                    "OGGETTO: Invio automatico email da Java", 
                    "C:\\nomeAllegato.jpg"
                  );

    email.inviaEmail();
  }
}
A questo punto non resta che controllare nella vostra casella di posta se l'invio è avvenuto correttamente.

Naturalmente se volete inserire destinatari multipli o allegati multipli, basterà, in un ciclo for, ripetere le relative istruzioni!

Nel prossimo post vi mostrerò come ricevere in automatico le email!



Commenti

  1. Questo esempio funziona anche se si è dietro un proxy?

    RispondiElimina
    Risposte
    1. Ciao, se la connessione sulla macchina su cui deve girare il codice è configurata correttamente e il proxy ha le porte interessate aperte, la risposta è si!
      Nel caso sia impossibile configurare il proxy sulla macchina è necessario settare da codice i vari parametri. Approfitto della tua domanda per preparare, appena possibile, un post dedicato all'invio di email dietro un proxy. Ciao! :o)

      Elimina
    2. Ciao Fabrizio, Grazie per la risposta.

      Non posso agire sulla configurazione del proxy, in quanto mi collego dall'ufficio e la mia macchina si collega attraverso la lan, che purtroppo è dietro un proxy, e gli unici parametri che possiedo sono l'indirizzo, lo user e la pass, che quest ultima deve essere cambiata ogni settimana!!

      Ciao

      Elimina
    3. Ciao, scusa il ritardo, riguardo al tuo problema ti devo segnalare questo link: http://www.oracle.com/technetwork/java/javamail/faq/index.html#proxy, purtroppo non sono buone notizie. Se il tuo proxy supporta connessioni anonime e SOCKS v4 o v5 c'è speranza di bypassarlo (come specifica la FAQ).

      Elimina
  2. Questo commento è stato eliminato dall'autore.

    RispondiElimina
  3. e come devo fare se voglio realizzare una gui con lo stesso codice?

    RispondiElimina
    Risposte
    1. Devi far "scatenare" questo pezzo di codice nel momento in cui viene generato un evento legato all'oggetto grafico che realizzi.

      Elimina
  4. Ciao , ho usato questo codice su una gui (e ha funzionato).
    Poi , mi sono accorto che L'allegato è obbligatorio e quindi , se la stringa è vuota , ti esce il messaggio di errore.
    Potresti dirmi qual è il codice per rendere l'allegato opzionale?

    RispondiElimina
  5. ciao, ho provato il codice dal mio computer di casa, wifi con tre, account libero e funziona correttamente,
    ma in ufficio, dove la connessione internet è dietro un proxy non va. siete riusciti a bypassare il proxy?
    ciao

    RispondiElimina
    Risposte
    1. Prova con:
      String host = "smtp.gmail.com";
      String port = "587";

      JavaMailSender sender = new JavaMailSender(host, port);

      /** Activate this line for proxy authentication and change the settings with your details */
      // sender.addProxy("10.10.10.10", "8080");

      /** Activate this line if you need to see more details */
      // sender.setDebug(true);


      fonte: http://www.admfactory.com/send-emails-using-javamail/

      Elimina
  6. L'username sarebbe l'inidirizzo email? perhe quando vado a inserirlo mi da errore di autenticazione.
    Come posso risolvere?

    RispondiElimina
    Risposte
    1. Ciao, l'username può essere un nome utente o l'email completa, dipende dal provider che stai utilizzando.

      Elimina

Posta un commento

Post popolari in questo blog

Arrotondamento e troncamento in Java

Eclipse: Shortcuts (scorciatoie) da tastiera

Strutture dati: List, Set, Map

Creare un eseguibile Java