Запуск приложения электронной почты (MAPI) с C # (с вложением)

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

  •  16-09-2019
  •  | 
  •  

Вопрос

В прошлом я использовал MAPISendMail для запуска Outlook (или любого другого желаемого почтового приложения MAPI) из приложения на C ++ с вложенным файлом.(Аналогично, скажем, функции отправки электронной почты в Microsoft Word).

Мне нужно сделать эквивалент из приложения на C # и заставить его работать при запуске на XP, Vista, Server 2008 (и Windows 7, я полагаю).

MAPISendMail недоступен в Vista / 2008, поскольку он всегда возвращает MAPI_ E_FAILURE при запуске Outlook, а MAPI не поддерживается в управляемом коде.Даже после проверки этого исправления:http://support.microsoft.com/kb/939718 Я не могу заставить его надежно работать.

Я знаю, что Microsoft Word и Adobe Reader 9 могут запускать Outlook с вложением в Vista.

Было бы предпочтительнее решение, совместимое с C #, но я был бы доволен всем, что работает (не обязательно использовать MAPI).Кажется, я не могу найти, каково текущее "решение".Ни один из существующих ответов на тему переполнения стека, похоже, также не охватывает это.

Редактировать:

Я знаю, что MAPI и C # не работают вместе, поэтому я выберу решение на C / C ++, которое работает в Vista и Server 2008, когда НЕ запуск от имени администратора.Смотрите Adobe Reader 9 и Microsoft Word в качестве примеров, которые работают.

Это было полезно?

Решение

На работе мы успешно сделали это с помощью VSTO.

Вот фрагмент некоторых строк, которые мы запускаем в VISTA с Outlook 2007:(код находится в разделе VB.net).

Обратите внимание, что использование заблокировано системой безопасности при выполнении определенных действий с объектом outlook.(для адреса, тела и других свойств, помеченных как представляющие угрозу безопасности).Мы используем сторонний компонент (Redemption), чтобы обойти эту защиту.Если вы не используете какой-либо менеджер безопасности, outlook выдаст небольшое всплывающее окно о том, что что-то извне пытается получить к нему доступ, и вы можете предоставить ему доступ через некоторое время.

Импорт интерфейса Outlook.

Imports Outlook = Microsoft.Office.Interop.Outlook

Этот пример предназначен для того, чтобы дать вам некоторое направление, а не для полного рабочего примера.

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)

OutlookSession в приведенном выше примере исходит из этого свойства:

    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

Как вы можете видеть, для этого используется MAPI inside.

Удачи вам с этим.

Другие советы

На самом деле вам не нужно использовать redemption для VB, как предлагалось выше, если вы просто устанавливаете свойства в электронном письме, а не читаете их.Вот простая функция VB для отображения / отправки электронного письма через Outlook с вложением.(Этот код ссылается на библиотеку объектов Microsoft Outlook 12.0, например"C:\Program Файлы\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

Немного низкотехнологичный метод, но с помощью обработчика mailto вы можете сделать это

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

Примечание:Как уже указывалось, это может работать не на всех клиентах, поскольку это не является частью спецификация URL-адреса mailto.Самое главное (по крайней мере, в моем мире), что Outlook 2007 не поддерживает это, в то время как более старые версии поддерживали.

Я не уверен, нужно ли вам открывать электронное письмо в Outlook или вы просто хотите отправить электронное письмо с вложением из c #.Я знаю, что вы написали open в Outlook, но, возможно, вы предполагаете, что это единственный способ сделать это.Если вы просто хотите отправить электронное письмо с вложением, это можно сделать примерно так, как показано ниже.

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

Вы также можете сделать это без бита аутентификации, в зависимости от вашего почтового сервера.

Код на C # для отправки электронной почты через Outlook;никаких предупреждений безопасности не появляется.

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

mailItem.Display(false);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top