2009-01-16 23 views
5

El caso de uso es simple. En un momento determinado de tiempo, tengo que ser capaz de mostrar al usuario el diálogo familiarizado Redactar correo electrónico (Outlook u otro) con¿Cómo puedo abrir el cuadro de diálogo redactar/crear correo utilizando el cliente de correo electrónico predeterminado del usuario?

  • campos como el de, a, tema ya llena con valores determinados determinada aplicación.
  • El correo electrónico también tendrá un archivo adjunto junto con él.

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

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

aplicación Gestionado, C#, .Net 3.0 o superior

Actualización # 1: Sí parece mailto apoyo eliminado debido a que los archivos adjuntos (como un riesgo para la seguridad?). Intenté

Debe incluir la firma ShellExecute as described here. Todo lo que tengo de esto fue un 5 SE_ERR_ACCESSDENIED y 2 sólo para algunos 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()); 

La misma MailtoLink funciona perfectamente con Process.Start ... pero siempre y cuando no has de mencionar adjuntos.

System.Diagnostics.Process.Start(sMailToLink); 

Las otras opciones están utilizando el modelo de objetos de Outlook para hacer esto .. pero me han dicho que esto requiere que añadir referencias de ensamblado en base a la versión exacta de Outlook instalado. 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.

Respuesta

2

Probablemente no la manera más eficiente o más elegante, pero el bombardeo de un enlace "mailto:" hará lo que quiera, creo.

EDIT: Disculpa, omite un "no" muy importante.

+0

sí encontraron esta vía google. Sin embargo, ShellExecute no quiere hablar conmigo ahora mismo. :) – Gishu

1

¿Podría ser que utilizó el protocolo mailto:?

Se puede hacer casi todo lo que resaltas, pero estoy bastante seguro de que no puedes hacer archivos adjuntos.

Microsoft MailTo Documentation

+0

Sí, parece que sí. un poco OT ... w.r.t a este ejemplo, de alguna manera fue mucho más fácil en VB6 que en .net. – Gishu

10

Puede crear un objeto de proceso y lo han llamado "mailto:? [email protected] subject = Mi + Nueva + 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"); 
+0

thx pero no datos adjuntos :( – Gishu

2

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

Consulte también: MAPI and managed code experiences?

+0

Sí, estaba pensando lo mismo ... quiero decir que el todopoderoso .NET Framework no puede obtener un diálogo Enviar correo electrónico. ¿Qué tan difícil podría ser? :) Eso fue hace una hora. – Gishu

0

que estés haciendo la suposición de que van a tener instalado un cliente de correo electrónico, por supuesto.

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

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

+0

Hacer rodar un formulario de redacción propio es el primer paso en un camino largo y complicado. Podría estar bien para una aplicación web, pero en el escritorio, las demandas se harán con razón para muchas cosas. Múltiples direcciones de correo electrónico, soporte de libreta de direcciones, copias de mensajes en cajas de salida, administración de cuentas, y me quedé sin chars. – Ishmaeel

0

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

enfoque ligeramente diferente implica crear una plantilla de correo electrónico y luego suministrarla al Process.Start:

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 controlador de correo electrónico predeterminado:

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

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

detalles adicionales están disponibles en este post: Information integration - simplest approach for templated emails

PD: al final me iba para el escenario un poco más compleja:

  • interfaz definida IEmailIntegraton
  • Código anterior entró en la DefaultEmailIntegration
  • Implementaciones añadidas para OutlookEmailIntegration (automatización) y theBat! integración de correo electrónico (usando su formato de plantilla).
  • usuarios permitidos de la SmartClient seleccionar su escenario desde el desplegable (alternativamente, esto podría haber sido implementado como "Compruebe el sistema para el controlador de correo electrónico predeterminado y decidir de forma automática")
-1

se puede utilizar una 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 el archivo (es decir, descargar) si el usuario abre el archivo (.msg) el diálogo de redactar mensaje se abre 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(); 
    } 

después transmiten el archivo que creó decir "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(); 
Cuestiones relacionadas