Invio Email in modo Asyncrono

venerdì 06 luglio 2012 - 16.56

mchieffi Profilo | Newbie

Lo scopo è di mandare una email di notifica a circa 300 utenti recuperati da un DB

1 problema metodo sincrono:
all'inizio recuperavo tutti i destinatari li accorpavo ad un unica email e la mandavo; questa da un problema di time-out

2 problema metodo sincrono:
ho risolto il 1 problema mandando l'email singolarmente ad ogni utente; questo provoca per 279 persone un'attesa di circa 2 min

A questo punto ho deciso di mandare l'email col metodo asincrono, ma ora ho questo errore:
{"Le operazioni asincrone non sono consentite in questo contesto. Per poter avviare un'operazione asincrona, una pagina deve avere l'attributo Async impostato su true e tale operazione può essere avviata in una pagina solo prima dell'evento PreRenderComplete."}

Cercando su internet la soluzione al problema è semplicissima basta dichiarare nella pagina ASPX:
<%@ Page Async="true" %>
Ovviamente la mia pagina di partenza è addannuncio.ASCX che non mi permette di aggiungere il suffisso @page

Suggerimenti????
Ti metto la routine di invio emali sotto

public static bool sendEmailnotifica(string to, string obj, string html, int priorita)

{


string from = ConfigurationManager.AppSettings["em_email"];

string from_name = ConfigurationManager.AppSettings["em_from_name"];

string smtp_server = ConfigurationManager.AppSettings["em_smtp_server"];

string username = ConfigurationManager.AppSettings["em_user_name"];

string password = ConfigurationManager.AppSettings["em_password"];

string immagine = HttpContext.Current.Server.MapPath("/srchome/img/logo.jpg");


// Command line argument must the the SMTP host.

SmtpClient client = new SmtpClient(smtp_server);

//mail che funziona senza logo interno

MailMessage Msg = new MailMessage();

//Imposto oggetto

Msg.Subject = obj;

//Imposta il mittente

Msg.From = new MailAddress(from, from_name);

//Imposto contenuto

Msg.Body = html;

//in HTML

Msg.IsBodyHtml = true;

AlternateView avHtml = AlternateView.CreateAlternateViewFromString(html, null, MediaTypeNames.Text.Html);

// Creiamo un oggetto LinkedResource per ogni immagine da

//inserire nell'email

LinkedResource pic1 = new LinkedResource(immagine, MediaTypeNames.Image.Jpeg);

pic1.ContentId = "Im1";

avHtml.LinkedResources.Add(pic1);

// Creiamo una vista alternativa per i client che non

//supportano la visualizzazione di contenuto HTML

//string testoAlternativo = "Non possibile visualizzare il contenuto HTML contenuto nel messaggio.";

//AlternateView avText = AlternateView.CreateAlternateViewFromString(testoAlternativo, null, MediaTypeNames.Text.Plain);

// Utilizziamo MailMessage.AlternateViews al posto di

//MailMessage.Body

//MailMessage m = new MailMessage();

Msg.AlternateViews.Add(avHtml);

//Msg.AlternateViews.Add(avText);

//Imposto il Server Smtp

SmtpClient Smtp = new SmtpClient(smtp_server);

//Possiamo impostare differenti metodi di spedizione.

//Imposta consegna diretta.

Smtp.DeliveryMethod = SmtpDeliveryMethod.Network;

//Alcuni Server SMTP richiedono l'accesso autenticato

NetworkCredential oCredential = new

NetworkCredential(username, password);

Smtp.UseDefaultCredentials = false;

Smtp.Credentials = new System.Net.NetworkCredential(username, password);

// Set the method that is called back when the send operation ends.

client.SendCompleted += new SendCompletedEventHandler(SendCompletedCallback);

string userState = "test message1";

//La propriet .To una collezione di destinatari,

//quindi possiamo addizionare quanti destinatari vogliamo.

string[] destinatari = to.Split(',');


if (destinatari.Length > 0)

{


for (int i = 0; i < destinatari.Length; i++)

{

if (destinatari[i] != "" && destinatari[i] != null)

{

//Msg.Bcc.Add(new MailAddress(destinatari[i], destinatari[i]));

Msg.Bcc.Add(new MailAddress("mchieffi@westsud.com", "mchieffi@westsud.com"));


//Spediamo la mail

Smtp.SendAsync(Msg, null);

//Smtp.Send(Msg);

Msg.Bcc.Clear();

}

}

}


return true;

}

Marco
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5