2011-12-19 14 views
6

Estoy trabajando en una aplicación web que se lanzará pronto, y ahora estoy tratando de encontrar la mejor manera de manejar el envío de correos electrónicos desde la aplicación. Entiendo completamente CÓMO enviar correos electrónicos desde la aplicación usando las clases MailMessage y SmtpClient, sin embargo mi pregunta es desde un ángulo diferente. Mi objetivo principal en mi trabajo antes de este proyecto era el soporte de aplicaciones antiguas que se habían desarrollado antes de tiempo. En estas aplicaciones, cuando necesitaban enviar correos electrónicos, codificaban con fuerza todos los mensajes en el mensaje real con todas las etiquetas HTML incrustadas directamente en el código C#.¿Cuál sería considerada la mejor manera de diseñar el correo electrónico desde una aplicación web C#?

La aplicación en la que estoy trabajando tendrá una plantilla para los correos electrónicos que se enviarán, como una especie de contenedor de estilo, y los diferentes mensajes se incorporarán a los divs de contenido principal de la plantilla. Me gustaría evitar la codificación rígida de estas plantillas en esta aplicación, así que he estado tratando de encontrar la mejor manera de diseñar mi proyecto. He pensado en usar una plantilla t4 y leer las diferentes t4 en la aplicación y aplicar un String.Format con los parámetros especificados para agregar nombres/correos electrónicos a los mensajes que se enviarán. Sin embargo, no estoy seguro de que esta sea la mejor manera de hacerlo.

Mi otra idea era definir una clase para cada tipo de mensaje, sin embargo, esto terminaría con la codificación de los mensajes de nuevo, lo que como he dicho, no quiero hacer.

Mi pregunta es, ¿cómo se ha acercado a esto en el pasado? ¿Qué funcionó, qué no y por qué motivos? He buscado todo en línea, pero el único contenido disponible es CÓMO enviar el mensaje o no he utilizado las palabras correctas de Google.

+0

¿Tiene acceso a una base de datos? Puede almacenar cada tipo de mensaje, los destinatarios, el sujeto, el cuerpo, etc. en una base de datos y crear una rutina de mantenimiento simple en la parte superior.También puede ingresar varias etiquetas dentro del cuerpo del correo electrónico para actuar como marcadores de posición para otro texto (como el nombre de un usuario). He hecho esto antes y funciona razonablemente bien. – hawkke

+0

La aplicación tiene una base de datos, y esta es una de las cosas que realmente había considerado hacer. Al principio tenía miedo de hacer esto, ya que no estaba seguro de que los mensajes se almacenaran en la base de datos, pero definitivamente es una buena idea que el mensaje se pueda actualizar en cualquier momento. Los destinatarios también están almacenados actualmente en la base de datos también. Gracias por el aporte, y definitivamente lo consideraré más ahora que sé que alguien más lo ha hecho bien. Todavía me pregunto si existe o no una mejor manera. – tostringtheory

+0

¿Qué has probado hasta ahora con respecto al código de chat que tienes para que alguien en línea aquí pueda ver y posiblemente ayudarte ...? Depende de lo que realmente está buscando El envío de correo electrónico no es una tarea difícil, ya que .NET le ofrece muchas opciones para usar System.Net.Mail o a través de la Aplicación Web usando System.Web.Mail también hay muchos ejemplos previos que puede buscar e investigar en este sitio o verificar codeproject.com muchos ejemplos geniales – MethodMan

Respuesta

2

lo hago de esta manera:

  • Código de la manera habitual con el modelo de vista y Razor Plantilla
  • Al crear la dirección de correo, utilice http://razorengine.codeplex.com/ a cargar y analizar la plantilla
  • Tenga en cuenta que no use Html y Url helper si desea enviar correos electrónicos en un hilo, ya que dependen de HttpContext que no tiene en ese caso. Crea tus propios ayudantes si es necesario.

Por ejemplo, si tiene un modelo de vista Car en su aplicación que se muestra en alguna parte, usted podría también utilizar este modelo de vista como @Model en una plantilla de la maquinilla de afeitar para el correo electrónico.

+0

Gracias por el enlace. Esto está definitivamente más cerca de lo que estaba buscando de una manera. ¿Estoy en lo cierto al suponer que tienes la plantilla como un archivo separado, o es difícil codificarlo como se muestra en su página de inicio? – tostringtheory

+0

Por supuesto, no hay codificación difícil, para cada correo electrónico tengo un archivo cshtml. Entonces, también podría usar esto como una vista previa de correo electrónico en su aplicación. – Marc

+0

Hmmm .. Esto es definitivamente una ventaja para poder obtener una vista previa de un mensaje. Me gusta mucho la idea de esta funcionalidad. – tostringtheory

0

He tenido que hacer esto en un par de ocasiones. Originalmente utilicé el motor de plantillas ASP.Net basado en una publicación de blog de Rick Strahl. Funcionó, pero siempre hubo algún problema al que me estaba golpeando la cabeza.

Cambié al uso del motor de plantillas NVelocity y me pareció una forma muy simple de crear y mantener plantillas de correo electrónico. Hay una serie de otros motores de plantillas y sospecho que la próxima vez podría examinar seriamente el Razorengine.

El código para la fusión de los valores en la plantilla:

private string Merge(ManualTypeEnum manualType, Object mergeValues) 
{ 
    var body = ""; 
    var templateFile = string.Format("{0}MailTemplate.vm", manualType); 
    var velocity = new VelocityEngine(); 
    var props = new ExtendedProperties(); 
    props.AddProperty("file.resource.loader.path", Config.EmailTemplatePath); 
    velocity.Init(props); 
    var template = velocity.GetTemplate(templateFile); 
    var context = new VelocityContext(); 
    context.Put("Change", mergeValues); 
    using (var writer = new StringWriter()) 
    { 
     template.Merge(context, writer); 
     body = writer.ToString(); 
    } 
    return body; 
} 

Los valores para fusionar se pasan como un objeto anónimo, y puede incluir varios tipos incluyendo listas etc por ejemplo

var emailBody = Merge(newDocument.ManualType, new 
{ 
    ManualType = newDocument.ManualType.ToString(), 
    Message = change.Message, 
    NewTitle = newDocument.Title ?? "", 
    NewVersion = newDocument.Version ?? "", 
    Contact = From, 
    Changes = change.ToList(), 
}); 
+0

Hmm .. Parece que puedo hacer esto con un archivo, pero puedo ver la combinación del motor Razor con la base de datos, para obtener la información de un datarow y luego transformarla. ¿Qué pasa con la separación de preocupaciones? ¿Crees que esto sería mezclarlos demasiado? – tostringtheory

+0

Se trata de contexto. La aplicación que usa el código anterior era vieja y poco fiable cuando llegué a ella, y usar una base de datos para almacenar plantillas habría sido excesiva para el volumen/complejidad de los correos electrónicos que se envían. Considere que una plantilla es solo una cadena, luego puede almacenar esa cadena en un archivo o una base de datos, cualquiera que tenga sentido para su aplicación. Uno de los beneficios de usar plantillas Razor es el soporte de Visual Studio, por lo que obtendrá coloreado de sintaxis, etc. Si los almacena en una base de datos, agrega un par de pasos adicionales cada vez que quiera modificarlos, es decir, extraer, cambiar, actualizar. –

+0

Muy cierto. Sin embargo, almacenarlo en la base de datos probablemente sea más fácil en mi situación.Por supuesto, puedo tener el archivo en mi pc y actualizar el código de db cuando sea necesario. Se tarda una eternidad en implementar un cambio en azul, y dudaría en volver a implementarlo solo por un pequeño cambio como ese. – tostringtheory

Cuestiones relacionadas