Tutto ciò che ti serve è la libreria JavaMail, poi basta usarla.
Qui un esempio di classe per l'invio di PEC (l'ho anche commentata per JavaDoc):
codice:
import java.io.File;
import java.io.FileInputStream;
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
/**
* Questa classe permette di effettuare l'invio di mail tramite PEC
* (Posta Elettronica Certificata)
*
* La classe si occupa di gestire l'intera comunicazione con il server
* SMTP tramite SSL usando la libreria standard JavaMail.
*
* La classe è in grado di spedire mail con allegati.
*
* @author LeleFT
*/
public class MailerPecUtility {
/*
* UserAuthenticator: fornise un'implementazione concreta
* di Authenticator; permette, quindi, di fornire all'applicazione
* (in chiaro) l'utente e la password per l'accesso al server SMTP
*/
private class UserAuthenticator extends Authenticator {
private String user;
private String pass;
public UserAuthenticator(String user, String pass) {
this.user = user;
this.pass = pass;
}
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(user, pass);
}
}
/*
* Allegato: rappresenta un singolo file da allegare alla mail.
* Il singolo allegato è rappresentato da un file fisico
* e da un nome da visualizzare all'interno della mail.
*/
private class Allegato {
private String nomeAllegato;
private File fileAllegato;
public Allegato(String nomeAllegato, File fileAllegato) {
this.nomeAllegato = nomeAllegato;
this.fileAllegato = fileAllegato;
}
public String getNomeAllegato() { return nomeAllegato; }
public File getFileAllegato() { return fileAllegato; }
}
private String cfgFile; // Percorso al file properties di configurazione
private String subject; // L'oggetto della mail
private String txtMessage; // Il corpo della mail (plain text)
private ArrayList<String> toAddress; // Elenco dei destinatari (TO)
private ArrayList<String> ccAddress; // Elenco dei destinatari in copia (CC)
private ArrayList<Allegato> attachments; // Elenco degli allegati
private UserAuthenticator userAuthenticator; // Autenticatore per SMTP
public MailerPecUtility(String cfgFile) {
this.cfgFile = cfgFile;
subject = "";
txtMessage = "";
toAddress = new ArrayList<String>();
ccAddress = new ArrayList<String>();
attachments = new ArrayList<Allegato>();
}
/**
* Imposta l'oggetto della mail
*
* @param subject l'oggetto della mail
*/
public void setSubject(String subject) { this.subject = subject; }
/**
* Aggiunge un destinatario all'elenco dei destinatari di questa mail
*
* @param recipient l'indirizzo email del destinatario da aggiungere
*/
public void addRecipient(String recipient) { toAddress.add( recipient ); }
/**
* Aggiunge un destinatario in copia all'elenco dei destinatari in copia
*
* @param ccRec l'indirizzo email del destinatario in copia da aggiungere
*/
public void addCopyRecipient(String ccRec) { ccAddress.add( ccRec ); }
/**
* Aggiunge un allegato alla mail
*
* @param f un oggetto File che rappresenta il file da allegare
* @param newName il nome dell'allegato da visualizzare nella mail
*/
public void addAttachment(File f, String newName) {
attachments.add( new Allegato(newName, f) );
}
/**
* Imposta il contenuto testuale della mail (corpo del messaggio)
*
* @param txtMsg array di stringhe: ciascun elemento rappresenta una
* riga del corpo messaggio
*/
public void setTextMessage(String[] txtMsg) {
StringBuilder messaggio = new StringBuilder();
for(String str : txtMsg) messaggio.append(str + "\n");
this.txtMessage = messaggio.toString();
}
/**
* Effettua l'invio della mail
*/
public void sendMail() {
try {
// Ottengo le proprietà di sistema
Properties props = System.getProperties ();
// Proprietà specifiche lette dal file
Properties specProps = new Properties();
// Carico il file con le proprietà specifiche
specProps.load( new FileInputStream(cfgFile) );
// Aggiungo alle proprietà specifiche, tutte le proprietà generali di sistema
Set<String> keys = props.stringPropertyNames();
for(String key : keys) specProps.put(key, props.getProperty(key));
// Ottengo le informazioni per l'autenticazione e l'invio della mail
String user = specProps.getProperty("nomeutente");
String pass = specProps.getProperty("password");
String fromAddress = specProps.getProperty("from-address");
String personalName = specProps.getProperty("from-name");
// Rimuovo le proprietà appena lette dalle proprietà specifiche
specProps.remove("nomeutente");
specProps.remove("password");
specProps.remove("from-address");
specProps.remove("from-name");
// La porta da usare per la connessione al server SMTP
int port = Integer.parseInt(specProps.getProperty("mail.smtp.port") );
// Costruisco l'oggetto authenticator per effettuare l'autenticazione al server SMTP
userAuthenticator = new UserAuthenticator(user, pass);
// Ottengo una sessione SMTP
Session session = Session.getDefaultInstance(specProps, userAuthenticator);
// Costruisco l'oggeto mail
MimeMessage message = new MimeMessage( session );
// Imposto il mittente
InternetAddress iaFrom = new InternetAddress(fromAddress, personalName);
message.setFrom( iaFrom );
// Aggiungo i destinatari principali
for(String rec : toAddress) {
message.addRecipient(Message.RecipientType.TO, new InternetAddress(rec));
}
// Aggiungo i destinatari in copia
for(String rec : ccAddress) {
message.addRecipient(Message.RecipientType.CC, new InternetAddress(rec));
}
// Setto l'oggetto della mail
message.setSubject( subject );
// Creo il corpo del messaggio (il testo + gli allegati)
componiMessaggio( message );
// Salvo lo stato dell'oggetto mail
message.saveChanges();
// Dalla sessione SMTP ottengo il Transport che si occuperà di dialogare col server
Transport t = session.getTransport("smtps");
// Effettuo la connessione
t.connect(specProps.getProperty("mail.smtp.host"), port, user, pass);
// Invio il messaggio
t.sendMessage(message, message.getAllRecipients());
// Chiudo la connessione
t.close();
} catch (AddressException ae) {
System.out.println("Indirizzo che ha generato l'eccezione: " + ae.getRef());
System.out.println("Posizione occorrenza errore: " + ae.getPos());
System.out.println("Oggetto del messaggio: " + subject);
System.out.println("StackTrace dell'eccezione:");
ae.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/*
* Si occupa di comporre il messaggio: costruisce il corpo del messaggio
* (testo) e aggiunge tutti gli eventuali allegati
*/
private void componiMessaggio(MimeMessage message) throws Exception {
Multipart multipart = new MimeMultipart();
// Creo il corpo del messaggio con il testo
BodyPart bodyPart = new MimeBodyPart();
((MimeBodyPart) bodyPart).setText(txtMessage, "ISO-8859-15");
multipart.addBodyPart( bodyPart );
// Se ci sono allegati, li allego
for(Allegato al : attachments) {
bodyPart = new MimeBodyPart();
((MimeBodyPart) bodyPart).attachFile( al.getFileAllegato() );
bodyPart.setFileName( al.getNomeAllegato() );
multipart.addBodyPart( bodyPart );
}
// Aggiungo il Multipart al messaggio
message.setContent( multipart );
}
}
Un esempio del file di configurazione da passargli (i valori, ovviamente, dovrai metterli tu):
config/cfgpec.cfg
codice:
mail.smtp.host=server_smtp_della_pec
mail.smtp.socketFactory.port=465
mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
mail.smtp.auth=true
mail.smtp.port=465
mail.mime.charset=ISO-8859-15
nomeutente=nome_utente_da_usare_per_autenticazione
password=password_da_usare_per_autenticazione
from-address=indirizzo_email_del_mittente
from-name=nome_da_visualizzare_nel_campo_del_mittente
E qui un esempio di utilizzo della classe:
codice:
// Creo l'oggetto per l'invio della mail
MailerPecUtility mailer = new MailerPecUtility("config/cfgpec.cfg");
// Imposto l'oggetto della mail
mailer.setSubject("Oggetto della mail");
// Aggiungo un destinatario (TO)
mailer.addRecipient("topolino@topolinia.it");
// Aggiungo un destinatario in copia (CC)
mailer.addCopyRecipient("paperino@paperopoli.it");
// Aggiungo anche un allegato
mailer.addAttachment(new File("allegato.pdf"), "NomeAllegato.pdf");
// Invio la mail
mailer.sendMail();
Ciao.