MokaByte 85 - Maggio 2004 
Un gestore di mailing list
di
Giovanni Bruni
Una mailing list è un "elenco di indirizzi", e nello specifico, elenco di indirizzi mail. Questo strumento permette di ricevere messaggi relativi ad un argomento, sia dagli utenti regolarmente iscritti ed interessati, sia dall'amministratore (moderatore) della lista. Lo scopo del suddetto sistema è quello di pubblicizzare un prodotto, oppure creare un gruppo di discussione in cui gli utenti possono criticare, confermare, commentare sull'argomento, dando vita a dei veri e propri dibattiti on-line

Come funziona il sistema
I requisiti fodamentail per la architettura del sistema sono i seguenti:

  • un indirizzo di posta elettronica;
  • un server per l'invio mail;
  • un list-server;

Schematicamente possiamo descrivere il flusso e la locazione del mailing list server come in figura 1:



Figura 1 - macro architettura del sistema


Il list-server è quello strumento che permette di creare, di modificare e di cancellare una singola mailing-list o gli indirizzi appartenenti ad essa. Il mailing-list server è invece il sistema che gestisce l'invio dei messaggi a tutti gli utenti della lista creata; il server di posta invia le mail.

 

Il mailing-list server
Il sistema che creeremo sarà in grado di ripristinare l'ultimo stato di invio nel caso di crash, per questo adotteremo la soluzione più intuitiva, cioè quello della serializzazione delle classi. Disponiamo di due modalità di invio: una in cui appena invocato un metodo si invia il messaggio alla mailng-list; un'altra in cui, oltre ai parametri precedenti, si specifica anche la data di invio (compresa l'ora/minuto). Ci sarà quindi una classe Timer, che permetterà di schedulare i Jobs (mailing-list con messaggi) e quindi inserirli nella coda di invio quando la data è "scaduta".
Infine l'invio di un messaggio consentirà a chi lo riceve di non vedere gli altri utenti della mailing-list.
Questo sistema (Figura 2) può essere implementato da tre classi principali:

  • una, che chiameremo MailingListServer, riceverà le chiamate da un list-server;
  • una, ListJobs, che gestirà le code di invio. Le code di invio saranno due: una che gestirà i Jobs, con data e/o ora (scheduledJobs), ed una che contiene i Jobs da inviare immediatamente (currentJobs);
  • ed infine una classe che spedirà le mail, e la chiameremo MailSender.
    Tutte le altre che creeremo, saranno di supporto alle classi appena citate.


Figura 2 - Architettura del codice

In questa parte dell'articolo, ci occuperemo solo della classe MailingListServer. Essa includerà certamente due metodi send descritti prima. Nel secondo metodo se un Job è "scaduto", quindi la data attuale è maggiore della data di inserimento del Job, dal Vector scheduledJobs viene passato al SortedSet currentJobs.
In questo sistema, c'è un thread che controlla la struttura currentJobs; quando un elemento è disponibile per essere processato, il thread lo estrae dal SortedSet e lo invia al MailSender,il quale provvederà a spedirlo.
Occorre costruire la struttura del messaggio (MailMessageInfo) e quella della mailing list(MailingListData). La struttura è abbastanza intuitiva:

  • String from;
  • String subject;
  • String message;
  • String attachmentPath;
  • String[] attachments.

Indicheremo con questi campi, rispettivamente, la mail da cui si invia, l'oggetto e il messaggio; con attachmentPath indicheremo il path in cui troveremo gli attachments ed infine l'array attachments comprenderà i nomi dei files.
MailinListData contiene le informazioni della mailing-list, quindi:

  • String name;
  • String[] addresses.

Nei due metodi send è da notare come si riceve in input un array di mailing-list. Questo vuol dire che è possibile inviare uno stesso messaggio a più mailing-lists. Quindi, particolare attenzione si farà quando si invierà il messaggio, visto che bisognerà almeno eseguire due cicli annidati, uno per scorrere le mailingl-lists, un altro per scorrere gli indirizzi dentro una mailing-list.
In questi metodi andremo ad inserire un Job o nel Vector scheduledJobs (se l'invio deve partire dopo una certa data) oppure nel SortedSet currentJobs (se l'invio deve essere immediato). Il Job è così composto:

  • Date beginDate;
  • MailMessageInfo mailMessageInfo;
  • MailingListData[] mailingListData;
  • Infine dentro i metodi send occorrerà notificare che è stato effettuato un inserimento nelle code di attesa.

Conclusione
Questa prima parte di una mini-serie di articoli permette di dare una nozione generale del sistema che andremo a sviluppare. Per questo motivo, nel prossimo, andremo ad analizzare più dettagliatamente la gestione delle code per l'invio delle mails. La seconda parte sarà un po' più complessa, ma una volta compreso il meccanismo, sarà facile da implementare!

 

Bibliografia e risorse
Java 2 Platform SE v.1.4.2 - http://java.sun.com/j2se/index.jsp

MokaByte® è un marchio registrato da MokaByte s.r.l. 
Java®, Jini® e tutti i nomi derivati sono marchi registrati da Sun Microsystems.
Tutti i diritti riservati. E' vietata la riproduzione anche parziale.
Per comunicazioni inviare una mail a info@mokabyte.it