una plantillas plantilla hacer correo configurar como abrir c# email

c# - plantillas - ¿Cómo puedo abrir el diálogo de redacción/creación de correo utilizando el cliente de correo electrónico predeterminado del usuario?



plantillas outlook 2016 (7)

¿Podría ser que utilizaste el protocolo mailto:?

Casi todo lo que destacas se puede hacer, pero estoy bastante seguro de que no puedes hacer archivos adjuntos.

Documentación de Microsoft MailTo

El caso de uso es simple. En un cierto momento, necesito poder mostrarle al usuario su diálogo de redacción de correo electrónico familiar (Outlook u otro) con

  • campos como from, to, Subject ya rellenos con ciertos valores determinados de la aplicación.
  • El correo electrónico también tendría un archivo adjunto junto con él.

El correo no se debe enviar a menos que el usuario lo apruebe explícitamente.

Lo hice una vez en los viejos días de VB6 ... no puedo entender cómo ahora ... Solo recuerdo que fue bastante fácil.

Aplicación administrada, C #, .net 3.0+

Actualización n. ° 1 : Sí, parece que el correo eliminó la compatibilidad con los archivos adjuntos (¿como riesgo de seguridad?). Lo intenté

Debe incluir la firma ShellExecute como se describe aquí . Todo lo que obtuve de esto fue un 5 SE_ERR_ACCESSDENIED y un 2 solo por alguna variedad

string sMailToLink = @"mailto:[email protected]?subject=Hey&body= yeah yeah yeah"; IntPtr result = ShellExecute(IntPtr.Zero, "open", sMailToLink, "", "", ShowCommands.SW_SHOWNORMAL); Debug.Assert(result.ToInt32() > 32, "Shell Execute failed with return code " + result.ToInt32());

El mismo MailtoLink funciona perfectamente con Process.Start ... pero mientras no menciones archivos adjuntos .

System.Diagnostics.Process.Start(sMailToLink);

Las otras opciones están usando el modelo de objetos de Outlook para hacer esto ... pero me han dicho que esto requiere que agregue referencias de ensamblaje basadas en la versión exacta de Outlook instalada. También esto explotaría si el usuario no prefiere MS por correo electrónico.

La siguiente opción es Mapi y algo llamado Mapi33 . El estado todavía EN PROGRESO. Oídos aún abiertos a sugerencias.


El proceso de inicio con mailto: argumentos es el enfoque más simple . Sin embargo, no permite nada más o menos complejo.

Un enfoque ligeramente diferente implica la creación de una plantilla de correo electrónico y luego alimentarla al Proceso . Inicio :

var client = new SmtpClient(); var folder = new RandomTempFolder(); client.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory; client.PickupDirectoryLocation = folder.FullName; var message = new MailMessage("[email protected]", "[email protected]", "Subject","Hi and bye"); // add attachments here, if needed // need this to open email in Edit mode in OE message.Headers.Add("X-Unsent", "1"); client.Send(message); var files = folder.GetFiles(); Process.Start(files[0].FullName);

Escenarios para el manejador de correo electrónico predeterminado:

  • Outlook Express se abre
  • Windows: Outlook: no se maneja de manera predeterminada, se llama a Outlook Express en su lugar
  • Windows: ¡El murciélago! - el mensaje se abre para verlo, presiona Shift-F6 y Enter para enviar

También probé con Mono y funcionó más o menos.

Detalles adicionales están disponibles en esta publicación: Integración de información : enfoque más simple para correos electrónicos con plantillas

PD: al final opté por un escenario un poco más complejo:

  • Interfaz definida IEmailIntegraton
  • El código anterior entró en DefaultEmailIntegration
  • Implementaciones añadidas para OutlookEmailIntegration (automatización) y theBat! integración de correo electrónico (usando su formato de plantilla).
  • Los usuarios permitidos de SmartClient para seleccionar su escenario desde el menú desplegable (o bien, esto podría haberse implementado como "Verificar el sistema para el controlador de correo electrónico predeterminado y decidir de forma automática")

Estás asumiendo que tendrán un cliente de correo electrónico instalado, por supuesto.

La opción que tomé en el pasado (en un entorno corporativo donde todo el mundo tiene al menos una versión de Outlook instalada) fue usar la interoperabilidad de Outlook; solo necesita hacer referencia a la versión más temprana que necesita para admitir.

Podría ver P / Invocar MAPISendDocuments (que trataría de evitar, personalmente), o la otra opción sería crear su propio formulario "redactar" y usar los objetos del espacio de nombres System.Net.Mail .


Probablemente no sea la manera más eficiente o elegante, pero creo que con un enlace "mailto:" hará lo que quieras.

EDITAR: Perdón, omite un "no" muy importante.


Puede crear un objeto de proceso y hacer que lo llame "mailto: [email protected]? Sujeto = Mi + Nuevo + Sujeto". Esto hará que el sistema actúe sobre el correo con su controlador predeterminado, sin embargo, mientras que usted puede configurar los temas, no podrá manejar la adición de un archivo adjunto. Confieso que no estoy del todo seguro de cómo harías para forzar un archivo adjunto sin escribir algún complemento de correo.

El código de proceso es:

System.Diagnostics.Process.Start("mailto:[email protected]?subject=My+New+Subject");


puede usar un truco si tiene la intención de usar Outlook [este código se basa en Outlook 2010 [v14.0.0.]] Crear Outlook MailItem y transmitir archivo (es decir, descargar) si el usuario abre el archivo (.msg) se abre el diálogo de redactar mensaje automáticamente

aquí está el código ...

Microsoft.Office.Interop.Outlook.Application outapp = new Application(); try { _NameSpace np = outapp.GetNamespace("MAPI"); MailItem oMsg = (MailItem)outapp.CreateItem(OlItemType.olMailItem); oMsg.To = "[email protected]"; oMsg.Subject = "Subject"; //add detail oMsg.SaveAs("C://Doc.msg", OlSaveAsType.olMSGUnicode);//your path oMsg.Close(OlInspectorClose.olSave); } catch (System.Exception e) { status = false; } finally { outapp.Quit(); }

luego transmite el archivo que creaste di "Doc.msg"

string filename ="Doc.msg";//file name created previously path = "C://" + filename; //full path ; Response.ContentType="application/outlook"; Response.AppendHeader("Content-Disposition", "filename=/"" + filename + "/""); FileInfo fl = new FileInfo(path); Response.AddHeader("Content-Length", fl.Length.ToString()); Response.TransmitFile(path,0,fl.Length); Response.End();


Como mailto no admite archivos adjuntos, y como MAPI no es compatible con código administrado, lo mejor es escribir (o hacer que alguien escriba) un pequeño programa no administrado para llamar a las funciones MAPI a las que puede llamar con argumentos de línea de comandos. Lástima que .NET no tenga una alternativa más limpia.

Ver también: MAPI y experiencias de código administrado?