Resumé

ASP.Net NewsLetter Provider

Cristian Merighi () 5.00

In this article I show the structure of a provider of mine for newsletter management (insertion, sending...) and relevant recipients. C# code and web.config markup demonstrate the use.
This article is obsolete. Some functionalities might not work anymore. Comments are disabled.

I've been working a bit around this project of mine, maybe a spent more time than I thought, but it is summer here in Italy and people (me included) become lazy and lack in willingness to work.
Anyway it worthed the time: now I have my "NewsLetter Provider" ready to be distributed and reused across the future websites that will ask this kind of feature...

Once for all I've engineered a repetitive, common piece of usual, standard application.
Here's the structure:

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

  • NewsLetter: the comprehensive object containing several news and characterized expecially by its Culture and Group properties.
    Culture and (Target) Group are important in order to identify the matching recipients.
  • News: a single element of information that build the core of the newsletter. Its main properties are Title and Content (which is free text).
    A single image (exposed as array of bytes) and a relevant link complete the class.
    Please don't bother me with your "why this kind of structure?"... the answer is "why not?", based on my experience this is the most common structure I've been facing.
  • Recipient: the ...recipient! which comes with its e-mail address and a security code for unsubscription purposals.

Providers and Managers (Pacem.Providers.NewsLetter namespace)

  • NewsLetterProvider (abstract/MustInherit class): inherits from ProviderBase and provides base implementations for composing and sending e-mail messages the asynchronous way with relevant event exposed to better control the process.
    The core of the process consists in getting the (xml)serialized newsletter with all its ChildNews and trasforming it through a custom xslt stylesheet.
  • NewsLetter (static class): it's the manager designated to parse (thanks the the ProvidersHelper API) the custom section in the configuration file and to return providers' instances.
  • SqlNewsLetterProvider: first (and only so far) implementation of NewsLetterProvider based on an ad-hoc Sql 2005 structure of tables, it implements the abstract methods of the base class exploiting my "CRUD agents" the Generic Adapters. They work like in heaven B-)

The following class diagram better explains the concepts:

Here's a sample web.config markup related to my provider mechanism:

 <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]
-->

And a bit of C# code to accomplish the task:

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";
}

Here's the result in the browser:

Here's the resulting e-mail:

What still remains to do: implementing a bunch of custom WebControls based on this structure, so that I can easily manage newsletters' creation/sending and recipients' (un)subscriptions, as it should in a .Net 2.0+ scenario...

Sorry, no code provided: many classes of my libraries are needed in order to make this provider work, so I don't think it is the case to expose all this libraries.
If you think that the base implementation code and the business entities could be helpful in order to clone or re-implement this structure just put your comment below, I'll provide the relevant code.

Take care. Bye.

Feedbacks

  • Re: ASP.Net NewsLetter Provider

    Filippo Bua Tuesday, May 06, 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 Wednesday, May 07, 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

Author

Cristian Merighi facebook twitter google+ youtube

Latest articles

Top rated

Archive

Where am I?

Author

Cristian Merighi facebook twitter google+ youtube

I'm now reading

Feeds