Programmazione.it v6.4
Ciao, per farti riconoscere devi fare il login. Non ti sei ancora iscritto? Che aspetti, registrati adesso!
Info Pubblicità Collabora Autori Sottoscrizioni Preferiti Bozze Scheda personale Privacy Archivio Libri Corsi per principianti Forum
Greenpeace
Allegato
MailBee.NET, componentistica per la posta elettronica
Scritto da Paolo De Nictolis il 26-04-2006 ore 11:30
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
  1. <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.
Formato: ZIP (Compressed Archive File)
Dimensione: 503.49 KB
Codice per il download:  
Tutti gli allegati vengono testati, pertanto se non riesci ad aprire un file PDF perché il tuo viewer dice che il file è corrotto, installa l'ultima versione di Adobe Reader, disponibile sia per Windows, che per Mac OS X e Linux/Unix. Nel caso il problema persista segnala l'errore alla redazione usando l'apposita icona (quella che raffigura uno scarafaggio) della toolbar qui sotto.
Precedente: Come scoprire cambiamenti indesiderati nel registry di Windows XP
Successiva: Le distribuzioni Linux: introduzione (1/12)
Copyright Programmazione.it™ 1999-2013. Alcuni diritti riservati. Testata giornalistica iscritta col n. 569 presso il Tribunale di Milano in data 14/10/2002. Pagina generata in 2.757 secondi.