Resumé

NewsLetter Provider per ASP.Net

Cristian Merighi () 5,00

In questo articolo descrivo la struttura di un mio provider custom destinato alla gestione delle newsletter (inserimento, spedizione...) e dei relativi destinatari. Codice C# e markup web.config ne dimostrano l'utilizzo.
Questo articolo è da considerarsi obsoleto. Alcune funzionalità potrebbero non essere più disponibili e non è possibile aggiungere commenti.

Ci ho lavorato un po' attorno a questo progetto, forse impiegandoci più tempo del preventivato, ma tant'è... da una parte l'estate che ci rende tutti distratti e pigri dall'altra la necessità di spulciare i meandri delle meccaniche SMTP hanno contribuito a questo parto laborioso.
Tuttavia devo dire che ne è valsa la pena: adesso ho il mio "NewsLetter Provider" pronto ad essere riditribuito e riutilizzato nei futuri applicativi web che necessiteranno di questa feature...

Una volta per tutte ho ingegnerizzato un comune, ripetitivo componente di una comune applicazione standard.
Questa la struttura:

Business Entities (namespace Pacem.Providers.NewsLetter.Logic)

  • NewsLetter: l'oggetto principale, contenitore di diversi elementi News (vedi punto successivo) e caratterizzato in particolar modo dalle property Culture e Group. Tali proprietà risultano fondamentali allo scopo di individuare i destinatari per l'invio della newsletter stessa.
  • News: è il singolo elemento che costituisce il nucleo della NewsLetter. Le sue proprietà principali sono Title e Content (testo formattato).
    Completano la classe una singola immagine (esposta come array di byte) ed un link per eventuali approfondimenti.
    Ok, non cominciate con domande del tipo «perché 'sta struttura?»... vi risponderei così «perché no?», in base alla mia esperienza questa è la configurazione più comune e che meglio si adegua alle richieste dei clienti con cui mi è capitato di lavorare.
  • Recipient: il destinatario, con il suo bell'indirizzo e-mail e un codice randomico autogenerato utile per un'eventuale richiesta di cancellazione dall'elenco dei recipients.

Providers and Managers (Pacem.Providers.NewsLetter namespace)

  • NewsLetterProvider (classe abstract/MustInherit): eredita da ProviderBase e comprende un'implementazione base per la composizione e la spedizione asincrona delle e-mail, espone anche alcuni eventi che permettono un buon monitoraggio del processo.
    Il cuore del processo consiste nella serializzazione xml dell'istanza-NewsLetter (comprensiva di tutti i "figli" News) e della sue seguente trasformazione attuata utilizzando un custom (configurabile) xslt stylesheet.
  • NewsLetter (classe static): è la classe manager designata a parsare (grazie all'API ProvidersHelper) la relativa custom section del file di configurazione e a restituire istanze di tipo NewsLetterProvider.
  • SqlNewsLetterProvider: prima (ed al momento unica) implementazione di NewsLetterProvider basata su una struttura Sql 2005 ad hoc, completa i metodi abstract della classe genitrice utilizzando i miei "CRUD agents": i Generic Adapters. Funzionano da dio B-). Peccato che con Linq saranno - con ogni probabilità - da buttare.

Per meglio illustrare i concetti testé esposti ecco il class diagram della struttura:

Il markup nel web.config appare sotto la forma seguente:

 <sectionGroup name="system.web"> 
    <section name="newsletter"
    type="Pacem.Providers.NewsLetter.NewsLetterSection, Pacem.Providers" />
<!-- 
    [omitted markup]
-->
 <system.web> 
    <newsletter defaultProvider="SqlNewsLetterProvider"> 
        <providers> 
            <add name="SqlNewsLetterProvider" 
            type="Pacem.Providers.NewsLetter.SqlNewsLetterProvider" 
            unsubscribePageAbsoluteUrl="http://www.pacem.it/unsubscribe.aspx" 
            smtpHost="127.0.0.1" port="25" 
            defaultCredentials="true" defaultConfigurationSettings="false" 
            connectionStringName="ConnectionString" /> 
        </providers> 
    </newsletter>
<!-- 
    [omitted markup]
-->

Di seguito il codice C# utilizzato per testare una spedizione:

protected void SendMail()
{
    // use the newsletter manager to get an instance of the default provider
    Pacem.Providers.NewsLetter.NewsLetterProvider provider = Pacem.Providers.NewsLetter.NewsLetter.GetDefaultProvider();
    // a dummy way to get a newsletter instance
    Pacem.Providers.NewsLetter.Logic.NewsLetter newsletter = provider.GetNewsLetterByID(1);
    
    provider.EmailSentProgress += new Pacem.Providers.NewsLetter.NewsLetterProvider.EmailSentEventHandler(provider_EmailSentProgress);
    provider.EmailSentCompleted += new EventHandler(provider_EmailSentCompleted);
    provider.SendNewsLetter(newsletter);
}

void provider_EmailSentProgress(object sender, Pacem.Providers.NewsLetter.EmailSentProgressEventArgs e)
{
    litReport.Text += string.Format("{0}/{1} - {2} (error occurred: {3}) (cancelled: {4})\n", e.Progress, e.Total, e.LastSent, e.Error != null, e.Cancelled);
    if (e.Error != null) litReport.Text += e.Error.Message + "\n[" + e.Error.ToString() + "]\n\n";
}

void provider_EmailSentCompleted(object sender, EventArgs e)
{
    litReport.Text += "sending completed\n";
}

Il conseguente risultato nel browser:

E una delle e-mail pervenute:

Non mi resta che implementare, lato interfaccia, dei WebControls che si basano su questa struttura per poter agevolmente gestire la creazione/spedizione delle newsletter e l'iscrizione/cancellazione dei destinatari, proprio nell'ottica del provider à la .Net 2.0...

Chiedo scusa, codice non disponibile: molte delle classi delle mie altre librerie sono necessarie perché il codice di questo provider possa funzionare e non penso sia il caso di esporle tutte.
Se però ritenete utile visionare l'implementazione base del provider e le business entities nell'ottica di una re-implementazione clonata di questa struttura, fatemene domanda inserendo un commento qui sono, pubblicherò il codice relativo.

Take care. Bye.

Feedbacks

  • Re: ASP.Net NewsLetter Provider

    Filippo Bua martedì 6 maggio 2008 5,00

    E' da alcuni giorni che sto cercando una soluzione simile per la realizzazione di un sistema di invio newsletter in asp .net c#. Le sarei grato se potesse pubblicare il codice relativo alla sua implementazione

  • Re: ASP.Net NewsLetter Provider

    CMerighi mercoledì 7 maggio 2008 0,00

    Ciao Filippo (scusa se parto con il "tu" ma, se rispondo ad un post via web, è più forte di me), quest'articolo scritto nello scorso agosto è ancora piuttosto attuale anche per me: stiamo (io e una ditta per cui sono consulente) prendendo coscienza di diverse problematiche relative all'invio massivo (decine di migliaia di recipients per spedizione) di newsletter utilizzando tecnologia ASP.NET. Quando sviluppai questo Provider il mio obiettivo era semplicemente quello di rendere riutilizzabile una funzionalità piuttosto usuale nell'ambito degli applicativi web (la newsletter appunto) e di renderla utilizzabile nell'area amministrazione del sito da un cliente standard. Poi ci siamo scontrati con le necessità di clienti che fanno di tale funzionalità il proprio core business e qui si sono resi necessari accorgimenti dei più svariati riguardanti: clients di posta (le AlternateViews non funzionano bene dappertutto), servizio SMTP (problemi dovuti alla massa di dati in uscita ed ai permessi associati), hardware (immagina 800kb di allegato e moltiplicalo per decine di migliaia di e-mail ferme nella cartella di uscita della posta o "rimbalzate" dai client) e così via... Il succo del discorso è 1.Non abbiamo terminato di sviluppare tutte le funzionalità necessarie per monitorare e gestire tutte queste eventualità ed allo stesso tempo renderle fruibili in autonomia per un utente standard (che deve tenere schermate attive in modalità connessa per diverse ore!). 2.Non è detto che la tecnologia ASP.NET sia quella ottimale (un servizio windows sarebbe di certo più adatto). 3.E' fondamentale un server ben carrozzato e che possa sopportare i colpi inferti nelle modalità di cui sopra. Allo stato attuale non mi sento di pubblicare nulla in merito (non so sinceramente se mai ne pubblicherò), l'idea di base però l'ho trovata io stesso molto comoda e perciò ho deciso di scrivere questo articolo, per mettere la pulce nell'orecchio ad altri sviluppatori. Ci sono poi numerosi esempi sull'implementazione di custom providers su

feedback
 

Syndicate

Autore

Cristian Merighi facebook twitter google+ youtube

Ultimi articoli

Top rated

Archivio

Dove sono?

Autore

Cristian Merighi facebook twitter google+ youtube

Le mie letture

Feeds