2009-04-24 59 views
6

En el pasado he utilizado MAPISendMail para iniciar Outlook (o la aplicación de correo MAPI deseada) desde una aplicación C++ con un archivo adjunto. (Similar a la funcionalidad Enviar correo electrónico de Microsoft Word).Lanzamiento de aplicación de correo electrónico (MAPI) desde C# (con datos adjuntos)

Necesito hacer el equivalente de una aplicación C# y hacer que funcione cuando se ejecuta en XP, Vista, Server 2008 (y Windows 7, supongo).

MAPISendMail no se ve en Vista/2008, ya que siempre devuelve MAPI_ E_FAILURE cuando se está ejecutando Outlook y MAPI no es compatible con el código administrado. Incluso después de comprobar esta solución: http://support.microsoft.com/kb/939718 No puedo conseguir que funcione de manera confiable.

Sé que Microsoft Word & Adobe Reader 9 puede iniciar Outlook con un archivo adjunto en Vista.

Sería preferible una solución compatible con C#, pero me complacería cualquier cosa que funcione (no tiene que usar MAPI). Parece que no puedo encontrar cuál es la "solución" actual. Ninguna de las respuestas existentes en Stack Overflow parece cubrir esto tampoco.

Editar:

Soy MAPI conscientes y C# no trabajan juntos, así que voy a tomar una solución de C/C++ que funciona en Vista y Server 2008 cuando NO ejecutar como administrador. Consulte Adobe Reader 9 & Microsoft Word como ejemplos que funcionan.

+0

Me temo que no tengo buenas noticias para ti. Esta publicación parece indicar que no debe usar MAPI o CDO con .net en absoluto: http://blogs.msdn.com/mstehle/archive/2007/10/03/fyi-why-are-mapi-and- cdo-1-21-not-supported-in-managed-net-code.aspx – JMarsch

+0

@JMarsch, sí, lea eso antes. Como mencioné en la pregunta, estoy contento con una respuesta que no funciona .NET. No puedo hacer que MAPISendMail funcione EN TODO bajo Vista o Server 2008. – Steven

+0

¿De verdad quiere simplemente enviar un correo electrónico con un archivo adjunto. ¿O el usuario final realmente necesita tener esto abierto en perspectiva? – PeteT

Respuesta

5

En el trabajo lo hemos logrado con éxito usando VSTO.

Aquí hay un fragmento de algunas líneas que tenemos ejecutándose en VISTA con Outlook 2007: (el código está en VB.net).

Tenga en cuenta que el uso está bloqueado de seguridad al hacer ciertas cosas en el objeto de Outlook. (para direcciones, cuerpo y otras propiedades marcadas como riesgos de seguridad). Usamos un componente de terceros (Redención) para sortear esta seguridad. Si no utiliza un administrador de seguridad de algún tipo, Outlook le mostrará una pequeña ventana emergente de que algo externo está tratando de acceder y le puede dar acceso en un período de tiempo.

La importación de la interfaz de Outlook.

Imports Outlook = Microsoft.Office.Interop.Outlook 

Este ejemplo es para darle un poco de dirección, no un ejemplo completo de trabajo.

dim MailItem As Microsoft.Office.Interop.Outlook.MailItem 

' Lets initialize outlook object ' 
MailItem = OutlookSession.Application.CreateItem(Outlook.OlItemType.olMailItem) 
MailItem.To = mailto 

MailItem.Subject = communication.Subject 
MailItem.BodyFormat = Outlook.OlBodyFormat.olFormatHTML 
MailItem.HTMLBody = htmlBody 

MailItem.Attachments.Add(filename, Outlook.OlAttachmentType.olByValue) 

' If True is supplied to Display it will act as modal and is executed sequential. ' 
SafeMail.Display(True) 

El OutlookSession en el ejemplo anterior proviene de esta propiedad:

Public ReadOnly Property OutlookSession() As Outlook.NameSpace 
     Get 
      If Not OutlookApplication Is Nothing Then 
       Return OutlookApplication.GetNamespace ("MAPI") 
      Else 
       Return Nothing 
      End If 
     End Get 
    End Property 

Como se puede ver que está utilizando MAPI en el interior de este.

Buena suerte con eso.

+0

Con Outlook 2007 en Vista, si tiene un programa antivirus activo en ejecución, no recibirá las solicitudes de seguridad de Outlook. – CoderDennis

+0

Voy a probar esto y ver si funciona, gracias. – Steven

1

método de bits de baja tecnología, pero utilizando el controlador mailto puede hacerlo

System.Diagnostics.Process.Start("mailto:[email protected]?subject=hello&attachment=c:\\chicken.xls"); 

Nota: Como se ha señalado esto puede no funcionar en todos los clientes, ya que no es parte de la mailto URL spec. Lo más importante (al menos en mi mundo) es que Outlook 2007 no lo admite, mientras que las versiones anteriores sí lo soportan.

+3

Lamentablemente, los archivos adjuntos no funcionan a través de mailto. – Steven

+0

@Steven, el uso depende del cliente de correo. Outlook 2007, por ejemplo, no lo admite, mientras que las versiones anteriores sí lo admiten. –

+0

@Steven, actualicé la respuesta para reflejar esto, ya que creo que es una respuesta útil con los riesgos identificados. –

1

No estoy seguro de si necesita el correo electrónico para abrir en Outlook o si solo desea enviar un correo electrónico con un archivo adjunto de C#. Sé que escribió abierto en perspectiva, pero puede suponer que esta es la única forma de hacerlo. Si solo desea enviar un correo electrónico con un archivo adjunto, puede hacerlo de la siguiente manera.

#using System.Net.Mail; 

SmtpClient smtpClient = new SmtpClient(host, port); 

MailMessage message = new MailMessage(from, to, subject, body); 
Attachment attachment = new Attachment(@"H:\attachment.jpg"); 
message.Attachments.Add(attachment); 

System.Net.NetworkCredential SMTPUserInfo = new System.Net.NetworkCredential(username, password); 
smtpClient.UseDefaultCredentials = false; 
smtpClient.Credentials = SMTPUserInfo; 
smtpClient.Send(message); 

También puede hacerlo sin el bit de autenticación dependiendo de su servidor de correo electrónico.

0

Código de C# para enviar correos electrónicos a través de Outlook; no hay advertencias de seguridad.

var outlook = new ApplicationClass(); 
MailItem mailItem = (MailItem)outlook.Session.Application.CreateItem(Outlook.OlItemType.olMailItem); 

mailItem.Display(false); 
2

Usted realmente no necesita redención para VB como se sugirió anteriormente, siempre y cuando usted es simplemente configurando las propiedades en un correo electrónico y no leerlos. Aquí hay una función VB simple para mostrar/enviar un correo electrónico a través de Outlook con un archivo adjunto. (Este código hace referencia a la biblioteca de objetos de Microsoft Outlook 12.0, por ejemplo, "C: \ Archivos de programa \ Microsoft Office \ Office12 \ MSOUTL.OLB").

Sub DoMail() 
    Set objOL = CreateObject("Outlook.Application") 
    Set objNewMail = objOL.CreateItem(olMailItem) 

    Dim filename As String 
    filename = "C:\\temp\\example.txt" 

    With objNewMail 
     .To = "[email protected]_me_not.com" 
     .Subject = "test" 
     .Body = "Test Body" 
     .Attachments.Add filename, Outlook.OlAttachmentType.olByValue 
    End With 

    objNewMail.Display 

    'objNewMail.Send 
End Sub 
+0

Un comentario más. Si está trabajando en C++ visual, MFC tiene un método para enviar un correo electrónico con un documento adjunto utilizando MAPI. El método es CDocument :: OnFileSendMail(). Este código también es fácil de adaptar para crear su propio "envío de correo electrónico con adjunto" a través de MAPI. –

Cuestiones relacionadas