Pergunta

No passado, usei o MapisendMail para iniciar o Outlook (ou qualquer que fosse o aplicativo de email MAPI desejado) de um aplicativo C ++ com um anexo de arquivo. (Semelhante para dizer que a funcionalidade de e -mail de envio da Microsoft Word).

Preciso fazer o equivalente a partir de um aplicativo C# e fazer com que ele funcione ao executar no XP, Vista, Server 2008 (e Windows 7, suponho).

O MapisendMail é um não no Vista/2008, pois sempre retorna MAPI_ e_failure quando o Outlook está em execução e o MAPI não é suportado no código gerenciado. Mesmo depois de verificar esta correção:http://support.microsoft.com/kb/939718Não consigo fazer isso para funcionar de maneira confiável.

Sei que o Microsoft Word & Adobe Reader 9 pode lançar o Outlook com um anexo no Vista.

A solução compatível com AC# seria preferida, mas eu ficaria feliz com qualquer coisa que funcione (não precisa usar o MAPI). Não consigo encontrar qual é a "solução" atual. Nenhuma das respostas existentes no Stack Overflow também parece cobrir isso.

Editar:

Estou ciente do MAPI e C# não trabalham juntos, então vou tomar uma solução C/C ++ que funcione no Vista e no Server 2008 quando NÃO correndo como administrador. Consulte o Adobe Reader 9 & Microsoft Word como exemplos que funcionam.

Foi útil?

Solução

No trabalho, fizemos isso com sucesso usando o VSTO.

Aqui está um trecho de algumas linhas que temos no Vista com o Outlook 2007: (o código está no vb.net).

Observe que o uso está bloqueado na segurança ao fazer certas coisas no objeto Outlook. (para abordar, o corpo e outras propriedades marcadas como riscos de segurança). Usamos um componente de terceiros (resgate) para contornar essa segurança. Se você não usar algum tipo de gerente de segurança, o Outlook dará um pouco de pop -up que algo fora está tentando acessá -lo e você pode dar acesso em um período de tempo.

A importação da interface do Outlook.

Imports Outlook = Microsoft.Office.Interop.Outlook

Este exemplo é dar -lhe alguma direção, não um exemplo completo de trabalho.

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)

A perspectiva do exemplo acima vem desta propriedade:

    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 você pode ver, está usando o MAPI para isso.

Boa sorte com isso.

Outras dicas

Você realmente não precisa de redenção para o VB, conforme sugerido acima, desde que esteja simplesmente definindo propriedades em um e-mail e não as lendo. Aqui está uma função VB simples para mostrar / enviar um e-mail via Outlook com um anexo. (Este código faz referência à biblioteca de objetos do Microsoft Outlook 12.0, por exemplo, "C: Arquivos de Programas 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 Bit LowTech, mas usando o manipulador de correio, você pode fazer isso

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

Observação: Como apontado, isso pode não funcionar em todos os clientes, pois não faz parte do Mailto URL Spec. O mais importante (pelo menos no meu mundo) é o Outlook 2007 não o apóia, enquanto as versões mais antigas o fizeram.

Não tenho certeza se você precisa do email para abrir no Outlook ou se deseja apenas enviar um email com um anexo da C#. Eu sei que você escreveu o Open in Outlook, mas pode estar assumindo que essa é a única maneira de fazê -lo. Se você deseja apenas enviar um email com um anexo, ele pode ser feito algo como abaixo.

#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);

Você também pode fazer isso sem o bit de autenticação, dependendo do seu servidor de e -mail.

Código C# para enviar email através do Outlook; Nenhum aviso de segurança ocorre.

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

mailItem.Display(false);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top