Estoy trabajando en un sitio que enviará una cantidad significativa de correos electrónicos. Quiero configurar tanto el texto del encabezado como el pie de página, o tal vez incluso plantillas para permitir a los usuarios editar fácilmente estos correos electrónicos si lo necesitan.
Si incrusto el HTML dentro de los literales de cadena C #, es feo y tendrían que preocuparse por escapar. La inclusión de archivos planos para el encabezado y el pie de página podría funcionar, pero algo al respecto simplemente no se siente bien.
Lo ideal sería usar una .ASPX
página como plantilla de alguna manera, luego decirle a mi código que sirva esa página y usar el HTML devuelto para el correo electrónico.
¿Existe una manera fácil y agradable de hacer esto? ¿Existe una mejor manera de resolver este problema?
Actualizado:
agregué una respuesta que le permite usar una página .aspx estándar como plantilla de correo electrónico. Simplemente reemplace todas las variables como lo haría normalmente, use enlace de datos, etc. Luego solo capture la salida de la página, ¡y listo! ¡Tienes tu correo electrónico HTML!
ACTUALIZADO CON AVISO !!!:
Estaba usando la clase MailDefinition en algunas páginas aspx bien, pero al intentar usar esta clase durante un proceso de servidor que se estaba ejecutando, falló. Creo que fue porque el método MailDefinition.CreateMailMessage () requiere un control válido para hacer referencia, aunque no siempre hace algo. Debido a esto, recomendaría mi enfoque usando una página aspx, o el enfoque de Mun usando una página ascx, que parece un poco mejor.
new System.Web.UI.Control()
como en:mailDefinition.CreateMailMessage("[email protected]", iDictionaryReplacements, new System.Web.UI.Control())
.Respuestas:
Ya hay un montón de respuestas aquí, pero me encontré con un gran artículo sobre cómo usar Razor con plantillas de correo electrónico. Razor se introdujo con ASP.NET MVC 3, pero no se requiere que MVC use Razor. Este es un procesamiento bastante hábil de hacer plantillas de correo electrónico
Como identifica el artículo, "Lo mejor de Razor es que, a diferencia de su predecesor (formularios web), no está vinculado con el entorno web, podemos alojarlo fácilmente fuera de la web y usarlo como motor de plantillas para diversos fines".
Generación de correos electrónicos HTML con RazorEngine - Parte 01 - Introducción
Aprovechando las plantillas de Razor fuera de ASP.NET: ¡Ya no son solo para HTML!
Plantillas de correo electrónico más inteligentes en ASP.NET con RazorEngine
Control de calidad de Stackoverflow similar
Creación de plantillas con la nueva API RazorEngine
Usando Razor sin MVC
¿Es posible usar Razor View Engine fuera de asp.net?
fuente
También puede intentar cargar un control y luego convertirlo en una cadena y configurarlo como el cuerpo HTML:
Luego puede construir su correo electrónico como de costumbre:
Su control de usuario podría contener otros controles, como un encabezado y pie de página, y también aprovechar la funcionalidad como el enlace de datos.
fuente
Podrías probar la clase MailDefinition
fuente
Si desea pasar parámetros como nombres de usuario, nombres de productos, ... etc., puede usar el motor de plantillas de código abierto NVelocity para producir su correo electrónico / HTML final.
Un ejemplo de plantilla NVelocity ( MailTemplate.vm ):
Generando el cuerpo del correo por MailTemplate.vm en su aplicación:
El cuerpo del correo resultante es:
Para editar las plantillas, tal vez pueda usar FCKEditor y guardar sus plantillas en archivos.
fuente
El componente de correo electrónico Mail.dll incluye el motor de plantillas de correo electrónico:
Aquí está la descripción general de la sintaxis:
Y el código que carga la plantilla, llena los datos del objeto c # y envía un correo electrónico:
Puede obtener más información en la publicación de blog del motor de plantillas de correo electrónico .
O simplemente descargue el componente de correo electrónico Mail.dll y pruébelo.
Tenga en cuenta que este es un producto comercial que he creado.
fuente
Si la flexibilidad es uno de sus requisitos previos, XSLT podría ser una buena opción, que es completamente compatible con .NET framework y podría incluso permitir que el usuario edite esos archivos. Este artículo ( http://www.aspfree.com/c/a/XML/XSL-Transformations-using-ASP-NET/ ) puede ser útil para empezar (msdn tiene más información al respecto). Como dijo ScarletGarden, NVelocity es otra buena opción, pero prefiero XSLT por su compatibilidad con el marco .NET "integrado" y su plataforma independiente.
fuente
IXmlSerializable
interfaz a mis clases. En unas pocas líneas puedo hacer que mi clase entregue un correo electrónico.Creo que también podrías hacer algo como esto:
Cree una página .aspx y colóquela al final del método OnLoad o llámela manualmente.
No estoy seguro de si hay problemas potenciales con esto, pero parece que funcionaría. De esta manera, podría usar una página .aspx con todas las funciones, en lugar de la clase MailDefinition que solo admite reemplazos de texto.
fuente
Page
, al menos cuando usé un método de extensión genérico para la representación. Así cambié aUserControl
; mira mi respuesta a continuación. Hasta ahora parece estar funcionando bien ... Me interesaría saber cómo lo resolvió en ese momento.Seguro que puedes crear una plantilla html y te recomendaría también una plantilla de texto. En la plantilla, puede poner [BODY] en el lugar donde se colocaría el cuerpo y luego puede leer la plantilla y reemplazar el cuerpo con el nuevo contenido. Puede enviar el correo electrónico utilizando .Nets Mail Class. Solo tiene que repetir el envío del correo electrónico a todos los destinatarios después de crear el correo electrónico inicialmente. Funcionó como un encanto para mí.
fuente
Aquí hay una alternativa más que usa transformaciones XSL para plantillas de correo electrónico más complejas: Envío de correo electrónico basado en HTML desde aplicaciones .NET .
fuente
Tenga cuidado al hacer esto, los filtros de SPAM parecen bloquear el html generado por ASP.net, aparentemente debido a ViewState, así que si va a hacer esto, asegúrese de que el Html producido esté limpio.
Personalmente, consideraría el uso de Asp.net MVC para lograr los resultados deseados. o NVelocity es bastante bueno en esto
fuente
Fácilmente podría construir una WebRequest para acceder a una página ASPX y obtener el HTML resultante. Con un poco más de trabajo, probablemente pueda hacerlo sin WebRequest. Un PageParser y un Response.Filter le permitirían ejecutar la página y capturar la salida ... aunque puede haber algunas formas más elegantes.
fuente
Tenía un requisito similar en 1 de los proyectos en los que tenía que enviar una gran cantidad de correos electrónicos cada día, y el cliente quería un control completo sobre las plantillas html para diferentes tipos de correos electrónicos.
Debido a la gran cantidad de correos electrónicos que se enviarán, el rendimiento fue una preocupación principal.
lo que se nos ocurrió fue contenido estático en el servidor sql donde se guarda el marcado completo de la plantilla html (junto con marcadores de posición, como [UserFirstName], [UserLastName] que se reemplazan con datos reales en tiempo de ejecución) para diferentes tipos de correos electrónicos
luego cargamos estos datos en la caché de asp.net, por lo que no leemos las plantillas html una y otra vez, sino solo cuando realmente se modifican
le dimos al cliente un editor WYSIWYG para modificar estas plantillas a través de un formulario web de administración. cada vez que se realizan actualizaciones, restablecemos la caché de asp.net.
y luego teníamos una tabla separada para los registros de correo electrónico, donde se registraban todos los correos electrónicos que se enviarían. esta tabla tenía campos llamados emailType, emailSent y numberOfTries.
simplemente ejecutamos un trabajo cada 5 minutos para tipos de correo electrónico importantes (como registro de nuevo miembro, contraseña olvidada) que deben enviarse lo antes posible
ejecutamos otro trabajo cada 15 minutos para tipos de correo electrónico menos importantes (como correo electrónico de promoción, correo electrónico de noticias, etc.)
de esta manera no bloquea su servidor enviando correos electrónicos sin parar y procesa los correos por lotes. una vez que se envía un correo electrónico, configura el campo emailSent en 1.
fuente
Tenga en cuenta que las soluciones aspx y ascx requieren un HttpContext actual, por lo que no se pueden usar de forma asincrónica (por ejemplo, en subprocesos) sin mucho trabajo.
fuente
Creo que la respuesta fácil es MvcMailer. Es el paquete NuGet que le permite usar su motor de visualización favorito para generar correos electrónicos. Vea el paquete NuGet aquí y la documentación del proyecto
¡Espero eso ayude!
fuente
DotLiquid es otra opción. Usted especifica valores de un modelo de clase como
{{ user.name }}
y luego, en tiempo de ejecución, proporciona los datos en esa clase y la plantilla con el marcado, y fusionará los valores por usted. Es similar a usar el motor de plantillas de Razor de muchas maneras. Admite cosas más complejas como bucles y varias funciones como ToUpper. Lo bueno es que son "seguros" para que los usuarios que crean las plantillas no puedan bloquear su sistema o escribir código inseguro como lo haría en razor: http://dotliquidmarkup.org/try-onlinefuente
Si puede permitir que ASPNET y los usuarios asociados tengan permiso para leer y escribir un archivo, puede usar fácilmente un archivo HTML con
String.Format()
marcadores de posición estándar ({0}
,{1:C}
, etc.) para lograr esto.Simplemente lea el archivo, como una cadena, usando clases del
System.IO
espacio de nombres. Una vez que tengas esa cadena, pásala como primer argumento aString.Format()
y proporcione los parámetros.Mantenga esa cadena alrededor y úsela como el cuerpo del correo electrónico, y básicamente ya está. Hacemos esto en docenas de sitios (ciertamente pequeños) hoy, y no hemos tenido problemas.
Debo señalar que esto funciona mejor si (a) no está enviando millones de correos electrónicos a la vez, (b) no está personalizando cada correo electrónico (de lo contrario, consume una tonelada de cadenas) y (c ) el archivo HTML en sí es relativamente pequeño.
fuente
Configure el mensaje de correo electrónico IsBodyHtml = true
Tome su objeto que contiene el contenido de su correo electrónico. Serialice el objeto y use xml / xslt para generar el contenido html.
Si desea hacer AlternateViews, haga lo mismo que jmein solo use una plantilla xslt diferente para crear el contenido de texto sin formato.
una de las principales ventajas de esto es que si desea cambiar su diseño, todo lo que tiene que hacer es actualizar la plantilla xslt.
fuente
Mire SubSonic (www.subsonicproject.com). Están haciendo exactamente esto para generar código: la plantilla es ASPX estándar y genera c #. El mismo método sería reutilizable para su escenario.
fuente
Usaría una biblioteca de plantillas como TemplateMachine . esto le permite en su mayoría poner su plantilla de correo electrónico junto con el texto normal y luego usar reglas para inyectar / reemplazar valores según sea necesario. Muy similar a ERB en Ruby. Esto le permite separar la generación del contenido del correo sin vincularlo demasiado a algo como ASPX, etc., luego, una vez que se genera el contenido con esto, puede enviarlo por correo electrónico.
fuente
Me gusta la respuesta de Raj. Programas como ListManager y frameworks como DNN hacen cosas similares, y si se requiere una edición fácil por parte de usuarios no técnicos, los editores WYSIWYG para modificar HTML almacenado en SQL es una forma sencilla y sencilla de realizar y puede acomodar fácilmente la edición de encabezados independientemente de los pies de página. etc, además de usar tokens para insertar valores dinámicamente.
Una cosa a tener en cuenta si usa el método anterior (o cualquiera, en realidad) es ser estricto y cuidadoso con los tipos de estilos y etiquetas que permite que los editores inserten. Si cree que los navegadores son quisquillosos, espere hasta que vea cuán diferente los clientes de correo electrónico hacen lo mismo ...
fuente
Similar a la respuesta de Canavar, pero en lugar de NVelocity, siempre uso " StringTemplate ", que cargo la plantilla desde un archivo de configuración, o cargo un archivo externo usando File.ReadAllText () y establezco los valores.
Es un proyecto de Java, pero el puerto C # es sólido y lo he usado en varios proyectos (solo lo usé para plantillas de correo electrónico usando la plantilla en un archivo externo).
Las alternativas siempre son buenas.
fuente
A continuación, se muestra una forma sencilla de utilizar la clase WebClient :
Entonces llámalo así:
Por supuesto, su CSS deberá estar alineado para mostrar los estilos de la página web en la mayoría de los clientes de correo electrónico (como Outlook). Si su correo electrónico muestra contenido dinámico (por ejemplo, nombre del cliente), le recomendaría utilizar QueryStrings en su sitio web para completar los datos. (por ejemplo, http://www.yourwebsite.com?CustomerName=Bob )
fuente
@bardev proporciona una buena solución, pero desafortunadamente no es ideal en todos los casos. El mío fue uno de ellos.
Estoy usando WebForms en un sitio web (juro que nunca volveré a usar un sitio web, qué PITA) en VS 2013.
Probé la sugerencia de Razor, pero siendo el mío un sitio web no obtuve el importante IntelliSense que ofrece el IDE en un proyecto MVC. También me gusta usar el diseñador para mis plantillas, un lugar perfecto para un UserControl.
Nix en Razor de nuevo.
En su lugar, se me ocurrió este pequeño marco (consejos de sombrero para @mun para UserControl y @imatoria para Strong Typing). Casi el único problema potencial que puedo ver es que debe tener cuidado de mantener su nombre de archivo .ASCX sincronizado con su nombre de clase. Si te desvías, obtendrás un error de tiempo de ejecución.
FWIW: En mis pruebas, al menos a la llamada RenderControl () no le gusta un control de página, así que fui con UserControl.
Estoy bastante seguro de que he incluido todo aquí; avíseme si dejé algo fuera.
HTH
Uso:
Clase base:
Clase "Fábrica":
Clase de plantilla:
Encabezado ASCX:
Pie de página ASCX:
Plantilla ASCX:
Código de plantilla ASCX Archivo:
Ayudantes:
fuente
Solo lanzo la biblioteca que estoy usando a la mezcla: https://github.com/lukencode/FluentEmail
Representa los correos electrónicos con RazorLight , usa el estilo fluido para crear correos electrónicos y admite varios remitentes listos para usar . También viene con métodos de extensión para ASP.NET DI. Fácil de usar, poca configuración, con texto sin formato y soporte HTML.
fuente