Inviare mail con JavaMail
Un semplice processo che rimane in attesa di modifiche su una cartella e invia una mail se viene aggiunto un file. Utile per monitorare dei download o dei log, per esempio
JavaMail è un completo set di api per controllare i protocolli e-mail (pop3, imap, smtp).
Noi vedremo come sia semplice inviare una mail testuale, utilizzando questa possibilità per monitorare una directory. Partiamo dal codice del metodo che ci permette di inviare una e-mail:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public void postMail( String recipients[ ], String subject, String message , String from) throws MessagingException{ Properties props = new Properties(); //indicare l'indirizzo del server smtp che si intende usare props.put("mail.smtp.host", "192.168.1.1"); Session session = Session.getDefaultInstance(props, null); Message msg = new MimeMessage(session); InternetAddress addressFrom = new InternetAddress(from); msg.setFrom(addressFrom); InternetAddress[] addressTo = new InternetAddress[recipients.length]; for (int i = 0; i < recipients.length; i++) { addressTo[i] = new InternetAddress(recipients[i]); } msg.setRecipients(Message.RecipientType.TO, addressTo); msg.setSubject(subject); msg.setContent(message, "text/plain"); Transport.send(msg); } |
Il codice non necessita di troppi commenti, si tratta di settare come proprietà do sessione l’indirizzo del server smtp a cui rivolgersi e creare un messaggio, su cui settare tutte le proprietà necessarie: mittente, destinatari, subject e body della mail. Quindi il metodo statico Transport.send(msg)provvederà all’invio.
Utilizziamo ora questo metodo per inviare una mail se il contenuto di una data directory è cambiato. Dobbiamo semplicemente controllare periodicamente se i files contenuti nella cartella sono gli stessi o se qualcuno è stato aggiunto o rimosso.
Il metodo File.list() ci restituisce un array con i nomi dei files contenuti nella cartella, un semplice confronto fra array (per comodità convertiti in vettori) ci fornisce i cambiamenti. Ovviamente invieremo la mail solo in caso di effettivo cambiamento.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
public static void main(String[] args) { MailAlerter ma = new MailAlerter(); File folder = new File(foldername); if (!folder.isDirectory()) { System.out.println("[" + foldername + "] is not a directory."); return; } Vector oldFiles = new Vector(Arrays.asList(folder.list())); while (true) { try { Vector deleted = new Vector(); Vector newFiles = new Vector(Arrays.asList(folder.list())); while (!oldFiles.isEmpty()) { String element = (String) oldFiles.firstElement(); oldFiles.removeElementAt(0); if (newFiles.contains(element)) { newFiles.remove(element); } else { deleted.add(element); } } String message = "Folder " + foldername + " changed!"; message += " Added files:"; for (int i = 0; i < newFiles.size(); i++) { message = message + " " + (String) newFiles.elementAt(i); } message += " Deleted files:"; for (int i = 0; i < deleted.size(); i++) { message = message + " " + (String) deleted.elementAt(i); } if ((!deleted.isEmpty()) || (!newFiles.isEmpty())) { ma.postMail(recipients, "[MailAlerter] Folder changed", message, from); System.out.println("Folder changed, mail sent."); } else { System.out.println("Folder not changed: " + (folder.list()).length); } oldFiles = new Vector(Arrays.asList(folder.list())); //aspettiamo 10 minuti fra un controllo e l'altro Thread.sleep(10 * 60 * 1000); } catch (Exception e) { System.out.println("Error: " + e); } } } |
Un processo da avviare e lasciare in background, per sapere anche da remoto cosa succede alla nostra cartella dei downloads o di log.