La
AfterLogic Corporation è un'azienda del New Jersey specializzata nello sviluppo di soluzioni di posta elettronica per uso professionale. Approfittando dell'uscita del .NET Framemork 2.0 la Casa ha sviluppato
MailBee.NET Objects 1.0, un set di componenti che riunisce ed aggiorna al nuovo framework Microsoft una serie di ActiveX precedentemente commercializzati per creare, ricevere/inviare ed effettuare il parsing di messaggi e-mail, utilizzando i protocolli POP3/SMTP e relative versioni sicure, con vari tipi di autenticazione: APOP, CRAM-MD5, NTLM, ecc.
Il pacchetto viene venduto a
100 dollari, con la possibilità di utilizzare i componenti nelle proprie applicazioni senza alcuna limitazione. Le funzionalità offerte sono distribuite fra i tre oggetti
Smtp,
Pop3 e
MailMessage, scritti in C#. MalBee.NET vanta il supporto di server SMTP e DNS multipli, la gestione degli errori ed il logging. Il prodotto è compatibile con (quasi) tutti i Windows sul mercato, dalla versione 98 in poi, richiede il .NET Framework 1.1 o 2.0, ed è possibile scaricarne una
versione di prova a 30 giorni; è possibile richiedere la chiave di attivazione direttamente al momento dell'installazione.
L'installer pesa meno di 2 MB ed il setup non presenta alcuna difficoltà. La documentazione è disponibile anche
online. Il processo di installazione copia, l'Assembly
MailBee.dll, il relativo manifesto in XML, la licenza e la documentazione suddetta, che fa riferimento ad un assembly "MailBee.NET.dll"; evidentemente, il naming e lo sviluppo della libreria hanno proceduto per strade parallele. Ognuna delle classi principali ha un metodo statico
LicenseKey in cui inserire il codice ottenuto all'acquisto; in alternativa, è possibile definirlo in maniera centralizzata negli
appSettings dei file di configurazione (
app.config,
web.config o
machine.config).
Il prodotto è utilizzabile anche dalle
versioni Express, gratuite, di Visual Studio; basta inserire nel progetto l'Assembly citato con un
Add Existing Item o un semplice
xcopy, per poi referenziarlo con
Add Reference, scegliendo il componente dalla scheda ".NET". Per sfruttare le funzionalità della libreria occorre importare ben cinque namespace, dettagliati nel file di help alla voce
Using MailBee.NET Objects in Your Projects; in alternativa, potete dare un'occhiata al codice delle applicazioni di esempio che ho sviluppato ed allegato all'articolo. Manca purtroppo un tutorial step by step; in compenso la documentazione delle classi è molto chiara, ed è presente una serie di interfacce per la gestione personalizzata delle eccezioni.
Il primo progetto che ho elaborato, in Visual Basic.NET, è stato naturalmente l'invio di un'e-mail con allegati. Per quanto riguarda la form di interfaccia, l'unica cosa rilevante è l'uso del controllo
OpenFileDialog, la cui proprietà
Multiselect deve essere impostata a
True, per allegare più file alla volta. Il nome dei file selezionati e riassunto nella textbox
txtAllegati, che viene popolata con un semplice ciclo For che prende i nomi dei file dalla proprietà
FileNames del controllo, che a sua volta restituisce un array di stringhe.
Ho utilizzato, naturalmente, i metodi della classe
MailBee.SmtpMail.Smtp. Dopo aver creato l'istanza mailer della classe, ho specificato il server SMTP tramite il metodo
Add della collection
SmtpServers, per poi connettermi tramite
Connect. Se il server SMTP supporta le
estensioni ESMTP e richiede l'autenticazione, sarà possibile sfruttare il metodo
Login. Il metodo ha anche vari parametri per la connessione ad un cluster in load balancing, ed una versione asincrona,
BeginConnect.
Creo poi un'istanza della classe
MailMessage e procedo a costruire il messaggio da inviare. E' banale sfruttare i metodi per aggiungere il mittente, i destinatari, l'oggetto ed il corpo dell'e-mail; è però interessante la possibilità offerta dalla proprietà
Display Name di
From di specificare il nome
friendly da mostrare al destinatario. La parte interessante è, naturalmente, l'aggiunta degli allegati, per la quale ho sfruttato il metodo
Add della proprietà
Attachments di
MailMessage; in alternativa, avrei potuto sfruttare il metodo
AddAttachment di
Smtp.
Di questo metodo esistono ben otto overload; io ho sfruttato il più semplice, quello che richiede solo una stringa con il percorso completo del file da allegare, che ho ricavato tramite un ciclo sulla collection
FileNames di
OpenFileDialog. Nel caso fosse necessario codificare gli allegati per l'invio, si possono usare vari metodi di
MailMessage, come
EncodeAllHeaders.
Ho poi sfruttato i metodi
SaveMessage e
Serialize di
MailMessage per salvare una copia dei messaggi inviati; quasi superfluo ricordare che occorre accertarsi di avere i permessi di scrittura sulla cartella utilizzata. Ancora, in un'applicazione reale è necessario del codice che verifichi se la cartella in cui salvare i messaggi esiste, e la crei in caso contrario: purtroppo la classe
MailMessage non gestisce questa situazione. Ancora, al posto di un semplice
System.DateTime.Now è meglio creare un sistema di naming costruito a partire dalle singole componenti della data, come "20060420": le impostazioni locali di Windows potrebbero infatti prevedere un formato non utilizzabile in un nome di file, come "4/20/2006".
L'invio vero e proprio avviene assegnando il messaggio finora composto alla proprietà
Message dell'oggetto che rappresenta il server SMTP, ed invocando il metodo
Send. Per la verità la libreria offre anche il metodo statico
QuickSend, che prevede vari overload dei quali ho commentato quello che accetta come parametro un'istanza di
MailMessage; in alternativa è presente una versione che accetta in input sette parametri, fra cui il nome di un file da allegare, mentre un terzo overload a quattro parametri non è utilizzabile se si hanno allegati da inviare.
Tramite QuickSend non vi è alcuna necessità di connettersi ad un server SMTP specifico; è il metodo stesso che si preoccupa di trovarne uno disponibile, tramite un DNS MX Lookup. Il problema di questo metodo è che, oggi come oggi, molti mail gateway hanno dei filtri antispam che rifiuteranno le e-mail provenienti da host sconosciuti: dubito per esempio che il vostro PC casalingo sia registrato in un record DNS.
Se si usa un server che supporta ESMTP, è possibile richiedere una conferma tramite la proprietà
Smtp.DeliveryNotification. Per la verità, l'uso del metodo
Send rende superfluo sia il
Connect che il
Disconnect finale, ma io reputo che il codice debba essere in primo luogo chiaro da leggere, e solo in seconda istanza ottimizzato.
Nel mio secondo progetto ho usato ASP.NET e la classe
MailBee.Pop3Mail.Pop3 per creare una webmail che si connettesse, fornendo le apposite credenziali, ad un account POP3 e mostrasse un elenco dei messaggi ricevuto, comprensivo di mittente, oggetto, dimensione, data di ricezione ed anteprima del testo. Inoltre, potendo sfruttare la nuova classe
ConfigurationManager di ASP.NET 2.0, ho stavolta incorporato nel
web.config la chiave di registrazione, oltre a vari parametri, soprattutto allo scopo di proteggere le credenziali di autenticazione.
Il codice è tutto nell'evento
Page_Load; poiché tale evento viene eseguito prima del rendering in HTML di default.aspx, ho dovuto incorporare in un metodo
StampaIntestazione() anche l'HTML statico per l'intestazione della pagina. Dopo aver "recuperato" dal web.config i parametri di connessione, creo un'istanza della classe
Pop3 e mi collego al server POP tramite i metodi
Connect e
Login; in particolare il metodo Login ha degli overload nel caso in cui il sistema di autenticazione fosse diverso dalla usuale coppia username/password. Se utilizzate un proxy server, disabilitatelo: per usare la classe Pop3
non basta spuntare la voce "Ignora server proxy per indirizzi locali".
L'oggetto
pop ha varie ed utili proprietà; dapprima usiamo
InboxMessageCount ed
InboxSize per conoscere il numero dei messaggi ricevuti, ed il loro "peso" in Kb. Se nella casella sono presenti dei messaggi, li inseriamo nella collection
MailMessageCollection tramite il metodo
DownloadMessageHeaders. Com'è facile immaginare, anche questo metodo ha diversi overload; ho scelto quello che accetta come parametri l'indice del messaggio di partenza, quello dell'ultimo messaggio (-1 sta per "tutti i messaggi"), ed un terzo parametro che indica quante righe dell'header scaricare: se ricevessi una lunga e-mail pubblicitaria mi piacerebbe individuare l'argomento "al volo", non credete?
E' consigliabile prendere almeno le prime 25 righe, poiché il messaggio potrebbe essere di tipo
multipart e presentare delle righe (relative ad allegati, immagini e così via) non significative. Nel caso in cui lo fossero, avremmo un'"anteprima" decisamente troppo lunga: per questo il codice che ho elaborato memorizza nella stringa
preview solo i primi 300 caratteri significativi.
Ho inserito le proprietà di ogni messaggio in una tabella costruita dinamicamente; se avete tempo di sperimentare, vi consiglio invece di costruire una classe "Messaggio", valorizzarne le proprietà ed usare uno dei nuovi controlli dati di ASP.NET 2.0, utilizzando le istanze della classe come Data Source. Per quanto riguarda la data di ricezione, è bene assicurarsi se essa è uguale a
DateTime.MinValue, che in pratica significa "non disponibile", in quanto alcuni mail server non la impostano (è il caso della screenshot allegata).
Ancora, la classe
MailMessage offre un metodo
BodyHtmlText, ma non è consigliabile utilizzarlo: a parte i problemi di Sicurezza derivanti dall'iniezione di codice, sarebbe molto facile danneggiare la formattazione della pagina; poiché infatti stiamo prendendo solo alcune linee del messaggio, potrei avere ad esempio un < html >< script > che si interrompe, facendo interpretare il resto dell'output HTML come un codice JavaScript.
Fortunatamente, MailBee.NET offre la capacità di convertire l'HTML in testo, che ho sfruttato nella riga di codice
<span style="font-size:1.0em"> email.Parser.HtmlToPlainMode = HtmlToPlainAutoConvert.IfNoPlain</span>
. Alla fine, naturalmente, viene invocato il metodo
Disconnect di Pop3.
Non pretendo sicuramente di avere esaurito tutte le potenzialità di questa libreria in due brevi esempi; per semplificare il discorso, per esempio, non ho nemmeno accennato al logging ed alla gestione delle eccezioni. Si tratta comunque, a mio parere, di una libreria utilissima, robusta, facile da usare e dal costo tutto sommato contenuto.
Inoltre mi è stato preannunciato che la versione 2.0 aggiungerà delle interessanti caratteristiche, quali una nuova classe
Imap, il supporto per SSL/TLS e per l'autenticazione integrata di Windows, la possibilità di mandare messaggi ad una coda SMTP di IIS, l'estrazione di allegati direttamente dal file
winmail.dat, miglioramenti nel parsing dei messaggi ed applicazioni di esempio in Visual Studio .NET 2003/2005.