Запуск приложения электронной почты (MAPI) из C # (с вложением) - PullRequest
6 голосов
/ 24 апреля 2009

В прошлом я использовал 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). Я не могу найти то, что является текущим «решением». Ни один из существующих ответов по переполнению стека, кажется, не покрывает это либо.

Edit:

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

Ответы [ 5 ]

5 голосов
/ 21 мая 2009

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

Вот фрагмент некоторых строк, которые мы запускаем на 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 внутри.

Удачи с этим.

2 голосов
/ 16 июля 2009

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

Я не уверен, что вам нужно, чтобы электронная почта открывалась в Outlook или вы просто хотите отправить электронное письмо с вложением из c # Я знаю, что вы писали открыто в 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);

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

1 голос
/ 24 апреля 2009

Метод lowtech, но с помощью обработчика mailto вы можете сделать это

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

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

0 голосов
/ 08 июля 2009

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

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

mailItem.Display(false);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...