2010-03-10 12 views
6

Necesito enviar muchos correos electrónicos (probablemente cientos al día) según la programación. La forma en que pienso hacerlo es la siguiente, pero el problema es que mi campo de Cuerpo puede ser muy grande, y si lo agrego como cuerda, se pone feo.La forma correcta de enviar correos electrónicos desde el servicio de Windows

 SmtpClient client = new SmtpClient(); //host and port picked from web.config 
     client.EnableSsl = true; 

     MailMessage message = new MailMessage(); 

     message.Body = "test from winservice"; // HERE IS MY PROBLEM 
     message.IsBodyHtml = true; 
     message.From = new MailAddress("[email protected]"); 
     message.Subject = "My subject"; 
     message.To.Add(new MailAddress("[email protected]")); 
     try 
     { 
      client.Send(message); 
     } 
     catch (Exception) 
     { 

     } 

cuando tenía que hacerlo desde la página aspx i utilizado

MailDefinition message = new MailDefinition(); 

    message.BodyFileName = @"~\EmailTemplate\Template1.htm"; 
    ListDictionary replacements = new ListDictionary(); 
    replacements.Add("<% Name %>", this.txtName.Text); 
    replacements.Add("<% PhoneOrEmail %>", this.txtPhoneOrEmail.Text); 
    replacements.Add("<% Message %>", this.txtMessage.Text); 
    MailMessage msgHtml = message.CreateMailMessage(RECIPIENTS, replacements, new LiteralControl()); 

creo que es una solución elegante, pero yo no quiero hacer referencia a System.Web.UI.WebControls.MailDefinition porque estoy en winservice

Mis preguntas son:

  1. ¿Cuál es la mejor manera de enviar mensajes de correo electrónico a granel de winservice?
  2. ¿Es posible enviarlo desde la cuenta de gmail ? o me van a bloquear después de un tiempo?

gracias por cualquier ayuda.

+0

creo que Gmail tiene un límite de 500 destinatarios en un período de 24 horas. Sin embargo, desalentaría el uso de GMail para el correo electrónico masivo; puede violar sus TOS. –

+0

Gracias Ryan, Aquí hay una publicación que lo explica con más detalle http://www.labnol.org/internet/email/gmail-daily-limit-sending-bulk-email/2191/ Así que supongo que tendrá que dejar de usar Gmail para enviar correos electrónicos :( – UshaP

Respuesta

5

¿Por qué no usaría exactamente el mismo concepto que utiliza MailDefinition? Cargue el cuerpo de su archivo de plantilla, reemplace algunos marcadores con el texto de otra lista: ¿estilo de combinación de correspondencia?

Todo lo que está haciendo es un foreach sobre un conjunto de datos de información que se fusionará con la plantilla. Cargue sus datos de combinación, recorra los datos de combinación reemplazando los tokens en su plantilla con el registro de fusión actual. Establezca el cuerpo del mensaje como el mensaje actualmente construido. Adjunte el mensaje a la cola de mensajes o envíelo ahora, lo que elija.

No es ciencia de cohetes. Tienes el código para crear el mensaje, así que solo es un caso de cargar tus datos de combinación y recorrerlos. He simplificado para demostrar el concepto y yo he utilizado un archivo CSV para la fusión de datos y por supuesto que no hay ningún campo contiene comas:

message.IsBodyHtml = true; 
message.From = new MailAddress("[email protected]"); 
message.Subject = "My bogus email subject"; 

string[] lines = File.ReadAllLines(@"~\MergeData.csv"); 
string originalTemplate = File.ReadAllText(@"~\Template.htm"); 

foreach(string line in lines) 
{ 
    /* Split out the merge data */ 
    string[] mergeData = line.Split(','); 

    /* Reset the template - to revert changes made in previous loop */ 
    string currentTemplate = originalTemplate; 

    /* Replace the merge tokens with actual data */ 
    currentTemplate = currentTemplate.Replace("[[FullNameToken]]", mergeData[0]); 
    currentTemplate = currentTemplate.Replace("[[FirstNameToken]]", mergeData[1]); 
    currentTemplate = currentTemplate.Replace("[[OtherToken]]", mergeData[2]); 

    /*... other token replacements as necessary. 
    * tokens can be specified as necessary using whatever syntax you choose 
    * just make sure that there's something denoting the token so you can 
    * easily replace it */ 

    /* Transfer the merged template to the message body */ 
    message.Body = currentTemplate; 

    /* Clear out the address from the previous loop before adding the current one */ 
    message.To.Clear(); 
    message.To.Add(new MailAddress(mergeData[3])); 
    client.Send(message); 
} 
+0

Estaba pensando que hay otra forma en lugar de cargar htm como cadena y reemplazar tokens. Pero supongo que no. Gracias por su respuesta. – UshaP

+0

@UshaP - Hay muchas maneras de cargar el htm, pero no siempre se reduce a "cuál es la forma más inteligente de hacer algo". Por lo general, el enfoque más simple es el mejor. Podría (como alguien más sugirió) cargar el htm como un documento XML y usar XPath para consultar y establecer los valores. Yo diría que es una exageración total y ser demasiado inteligente por ser inteligente para esta situación en particular. – BenAlabaster

+0

Quizás es una pregunta trivial pero no puedo entender cómo tomar mi ruta de htm dinámicamente. Tengo un servicio de Windows que hace referencia al proyecto BL Class Library y allí puse mi archivo htm. File.ReadAllText i está buscando en 'C: \ Windows \ system32 \ .. – UshaP

0

Una respuesta simple es la siguiente:

message.Body = File.ReadAllText(@"~\EmailTemplate\Template1.htm"); 

No estoy seguro acerca de sus puntos específicos, pero estoy seguro de que alguien va a responder a los :)

0

¿Qué hay de malo en usar

"messageBody".Replace("<% Name %>", curr.Name).Replace(....)...
?

En cuanto a sendign de gMail, puede hacerlo a través de SMTP, pero no le permiten falsificar otra dirección "de", por lo que los destinatarios lo verán como procedente de la dirección de gMail.

0

Usaría un motor de plantillas. StringTemplate por ejemplo.

+3

Vaya, ese sitio web es duro para los ojos. –

Cuestiones relacionadas