Pregunta

El uso de las funciones MAPI desde el código administrado es oficialmente compatible.Al parecer, MAPI utiliza su propia gestión de la memoria y los accidentes y quemaduras en código administrado (ver aquí y aquí)

Todo lo que quiero hacer es iniciar el cliente de correo electrónico predeterminado con el asunto, cuerpo, Y uno o más archivos adjuntos.

Así que he estado buscando en la MAPISendDocuments y parece que funciona.Pero no he sido capaz de reunir el coraje para usar la función en el código de producción.

Alguien ha utilizado mucho esta función?¿Tienes alguna historia de terror?

PS.No, yo No shellExecute Outlook.exe con argumentos de línea de comandos para archivos adjuntos.

PPS.Soporte de fijación es una requisito , por lo que Mailto:las soluciones no se corta para mí.

¿Fue útil?

Solución

Tener un ayudante de archivo EXE que se toma de la línea de comandos de parámetros (o el tubo a su StandardInput) que es lo que se requiere y de la llamada que desde la aplicación principal.Esto evita que el MAPI las cosas fuera de su aplicación principal espacio de proceso.OK, todavía estás mezclando y MAPI .La RED, pero en un periodo muy corto de proceso.La suposición es que MAPI y el CLR empiezan a causar problemas con la no-ejecución de los procesos.

Utilizamos Dmitry Streblechenko excelente La Redención De Los Objetos De Datos la biblioteca que nos permite escribir "calza" código de JScript y la invocación de que, lo que mantiene el CLR y MAPI mundos en procesos separados, sino en un apoyo de moda.

@Chris Fournier re.escribir una DLL no administradas.Esto no funciona porque el problema es la mezcla de MAPI y código administrado en el mismo proceso.

Otros consejos

MAPISendDocuments es obsoleta y no puede ser removido.Usted debe utilizar MAPISendMail lugar.Ver MAPI Simple

Proceso de llamada.Inicio en la Mailto:protocolo de (como se muestra a continuación) le dará una funcionalidad básica, pero no los archivos adjuntos.

Process.Start("mailto:name@domain.com?subject=TestCode&Body=Test Text");

Usted puede hacer este enfoque con apego caminos, pero esta opción sólo funciona con alguna versión anterior de outlook, tales como el 98.Supongo que esto es debido a la potencial securty riesgo.

Si alguien hace uso de outlook.exe se le dará advertencias de seguridad en outlook 2003 (y 2007 Depende de la configuración).

Usted debe ser capaz de hacer una DLL no administradas que realiza las operaciones que desea utilizar MAPI, y luego invocar a que el DLL desde el código administrado.Yo no escribiría una recta MAPI contenedor, pero algo que realiza todas las funciones que requieren de MAPI contenidas en los que no administrado DLL.Que probablemente sería la forma más segura de utilizar MAPI de código administrado.

Usted también podría usar Outlook Redención, que es apoyada desde código administrado;No estoy de inmediato seguro de si tiene una simple MAPISendDocuments reemplazo, pero Dmitry útil si usted tiene preguntas.

Como para "los accidentes y quemaduras", he aquí otra cita de un MS tipo de soporte, aquí

Es el tipo de cosa que va en su mayoría trabajan.Va a trabajar mientras estás escribiendo.A continuación, se va a trabajar mientras estás probando.Va a trabajar, mientras que su cliente es la evaluación de la misma.A continuación, tan pronto como el cliente implementa - BAM!Cuando todo se va a decidir a empezar a tener problemas.Y Microsoft no va a ayudar con eso, ya te dije que no lo hiciera en el primer lugar.:)

Esto lo he hecho usando el MAPISendMail función y varias clases internas para envolver algunos de los otros MAPI de las estructuras relacionadas.Tan largo como este es el único uso, es posible, aunque no trivial para hacerlo de forma segura, ya que requiere una especial atención a los diversos no administrado tipos de datos y la memoria de asignación/desasignación y GC.Aunque todavía no es compatible, estoy usando esto en el código de producción (aunque no ha enviado aún).

Cuando me preguntó Matt Stehle acerca de esto, la respuesta que recibí fue:

No sé realmente de una forma mucho mejor para hacer esto y los problemas que se encontró aquí sería probablemente reproducibles en un escenario compatible (es decir,En VB6 o no administrado C++).Sólo sé que si alguna vez se topó con un escenario eran un problema fue causado específicamente por esta función se llama desde .NETA que no tendríamos ninguna otra recomendación para usted, a continuación, a no usar .NET.

No es exactamente una bendición sobre su uso, pero también no diciendo que hay otras opciones para hacer esto desde código administrado.

El siguiente código no utiliza MAPI como tal, pero sí abrir la "redacción" de la ventana con diferentes archivos adjuntos.

(en realidad, es totalmente probado, pero me la excavación en una aplicación que creo que ha funcionado)

using Microsoft.Office;
using Microsoft.Office.Core;

...

Outlook.Application outlook = new Outlook.Application();
Outlook.MailItem mail = (Outlook.MailItem) outlook.CreateItem(Outlook.OlItemType.olMailItem);

mail.BodyFormat = Outlook.OlBodyFormat.olFormatRichText;
mail.HTMLBody = "stuff";
mail.Subject = "more stuff";
string file = File.ReadAllBytes(...);
mail.Attachments.Add(file, Outlook.OlAttachmentType.olByValue, 1, file)

mail.Display(false);

Para alguien con experiencia con MAPI, les tomaría menos tiempo para sacar el código para hacer exactamente lo que quieres de código no administrado (leer:llanura de C++) que escribiendo este post y la lectura de la respuesta (sin ánimo de ofender).

Tienes la suerte de la funcionalidad que usted necesita es limitado.Todo lo que usted necesita es un simple C++ utilidad para tomar los parámetros que usted necesita en la línea de comandos y la cuestión del derecho llamadas MAPI.Entonces, todo esto de la utilidad de su código administrado como era de ejecutar cualquier otro proceso.

HTH

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top