Lanzamiento de la aplicación de correo electrónico (MAPI) desde C# (con archivo adjunto)

StackOverflow https://stackoverflow.com/questions/784997

  •  16-09-2019
  •  | 
  •  

Pregunta

En el pasado he usado MapisendMail para lanzar Outlook (o cualquiera que sea la aplicación de correo electrónico MAPI deseada) de una aplicación C ++ con un archivo adjunto de archivo. (Similar a decir la funcionalidad de correo electrónico de envío de Microsoft Word).

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

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

Sé que Microsoft Word y Adobe Reader 9 pueden lanzar Outlook con un archivo adjunto en Vista.

Se preferiría la solución compatible con AC#, pero estaría contento con todo lo 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:

Conozco a Mapi y C# no funcionan juntos, por lo que tomaré una solución C/C ++ que funcione en Vista y Server 2008 cuando NO ejecutando como administrador. Consulte Adobe Reader 9 y Microsoft Word como ejemplos que funcionan.

¿Fue útil?

Solución

En el trabajo lo hemos hecho con éxito usando VSSTO.

Aquí hay un fragmento de algunas líneas que hemos ejecutado en Vista con Outlook 2007: (el código está en VB.NET).

Tenga en cuenta que el uso está bloqueado por seguridad al hacer ciertas cosas al objeto Outlook. (Para abordar, el cuerpo y otras propiedades marcadas como riesgos de seguridad). Utilizamos un componente de terceros (redención) para dar la vuelta a esta seguridad. Si no usa un administrador de seguridad de algún tipo, Outlook le dará a una pequeña ventana emergente que algo exterior está tratando de acceder a él y puede darle acceso en un período de tiempo.

La importación de la interfaz de Outlook.

Imports Outlook = Microsoft.Office.Interop.Outlook

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

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 puede ver, está usando MAPI en el interior para esto.

Suerte con ello.

Otros consejos

Realmente no necesita redención para VB como se sugiere anteriormente siempre que simplemente esté configurando propiedades en un correo electrónico y no las lea. 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 = "cjoy@spam_me_not.com"
        .Subject = "test"
        .Body = "Test Body"
        .Attachments.Add filename, Outlook.OlAttachmentType.olByValue
    End With

    objNewMail.Display

    'objNewMail.Send
End Sub

Método de Bit LowTech, pero utilizando el controlador Mailto puede hacer esto

System.Diagnostics.Process.Start("mailto:something@somewhere.com?subject=hello&attachment=c:\\chicken.xls");

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

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 desde C#. Sé que escribiste Open in Outlook, pero es posible que asumas que esta es la única forma de hacerlo. Si solo desea enviar un correo electrónico con un archivo adjunto, se puede hacer algo como a continuación.

#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.

Código C# para enviar correo electrónico a través de Outlook; No se producen advertencias de seguridad.

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

mailItem.Display(false);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top