OpenSharedItem para abrir archivos.MSG que muestran Error en Outlook C#
vsto outlook-addin (4)
Outlook administra su propio caché de elementos cuando abre y cierra mensajes. Su mejor opción sería usar un nombre de archivo generado al azar ( es decir, Path.GetRandomFilename
) al abrir a través de OpenSharedItem
para que no tenga problemas. También usaría una ruta temporal en lugar de la raíz c:/
( es decir, Path.GetTempPath
).
Puede probar y liberar la referencia de MailItem
( es decir, establecerla en nulo ), pero no hay garantía de que Outlook libere el elemento de su caché.
Estoy usando el siguiente código para abrir los mensajes de Outlook firmados / no firmados y mostrar el contenido en WebBrowser
control WebBrowser
.
Microsoft.Office.Interop.Outlook.Application app = new Microsoft.Office.Interop.Outlook.Application();
var item = app.Session.OpenSharedItem(msgfile) as Microsoft.Office.Interop.Outlook.MailItem;
string message = item.HTMLBody;
app.Session.Logoff();
Está funcionando bien la primera vez que se abre el archivo, pero después de cerrar el archivo de Outlook que intentaba volver a abrir el archivo muestra el siguiente error:
"No se puede abrir el archivo: C: / tion.msg. Es posible que el archivo no exista, que no tenga permiso para abrirlo o que esté abierto en otro programa. Haga clic con el botón derecho en la carpeta que contiene el archivo y luego en Propiedades para verificar tus permisos para la carpeta ".
Después de un tiempo, se está abriendo bien. Por este extraño comportamiento, ¿cuál podría ser el motivo y cómo rectificar el mensaje de error?
Puede usar Redención para eso - llame a RDOSession .GetMessageFromMsgFile.
Si necesita liberar el mensaje inmediatamente después de que haya terminado, use Marshal.ReleaseComObject ()
En caso de redención, también puede lanzar el objeto RDOMail a la interfaz IDisposable y llamar a IDisposable.Dispose ().
¿Funcionaría para usted alguna combinación de los métodos Quit [1], Close [2] o ReleaseComObject [3]? Mi código funcionó mejor, pero no perfecto después de que los usé. [4]
using Outlook = Microsoft.Office.Interop.Outlook;
.
.
.
var app = new Outlook.Application();
var item = app.Session.OpenSharedItem(msgfile) as Outlook.MailItem;
//Do stuff with the mail.
item.Close(OlInspectorClose.olDiscard);
app.Quit();
Marshal.ReleaseComObject(item);
Otra solución, según Microsoft - Ayuda y soporte técnico [5], es retrasar la apertura del archivo. Sin embargo, no me parece una buena solución ya que, como también dijo @SliverNinja, nunca se sabrá cuándo Outlook libera el bloqueo del archivo.
notas y referencias
- http://msdn.microsoft.com/en-us/library/microsoft.office.interop.outlook._application.quit.aspx , lea 2014-10-14, 16:19.
- http://msdn.microsoft.com/en-us/library/microsoft.office.interop.outlook._mailitem.close%28v=office.15%29.aspx , lea 2014-10-14, 16:19.
- http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.releasecomobject.aspx , lea 2014-10-14, 16:19.
- Por ejemplo, si abrí Outlook para un trabajo normal, el método Quit cerraría esa ventana también.
- http://support2.microsoft.com/kb/2633737 , lea 2014-10-08, 16:19.
Hola, tienes dos opciones.
- establecer el atributo de solo lectura en el archivo msg
o
deshabilite los siguientes permisos para los usuarios o grupos de usuarios en la carpeta principal:
- Escribir atributos
- Escribir atributos extendidos
el archivo msg ahora puede abrirse varias veces, pero está protegido contra escritura