2012-07-04 18 views
12

Chcę używać wysyłania wiadomości e-mail za pośrednictwem programu Outlook zgodnie z opisem here. Działa dobrze, o ile już otworzyłem program Outlook. Jeśli na przykład program Outlook jest zminimalizowany, a ja wykonuję swój kod, mogę wysłać wiadomość e-mail. Ale jeśli program Outlook jest zamknięty, a następnie uzyskać wyjątek:Można wysyłać tylko wiadomości e-mail za pośrednictwem programu Outlook, jeśli program Outlook jest otwarty.

{System.Runtime.InteropServices.COMException (0x80004004): Operation aborted (Exception from HRESULT: 0x80004004 (E_ABORT)) 
    at Microsoft.Office.Interop.Outlook._MailItem.get_Recipients() 
    at OutlookExample.Form1.btnSendEmail_Click(Object sender, EventArgs e) in C:\Users\abc\Documents\Visual Studio 2008\Projects\OutlookExample\OutlookExample\Form1.cs:line 28} 

Oto kod:

using Outlook = Microsoft.Office.Interop.Outlook; 

... 

private void btnSendEmail_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     Outlook.Application oApp = new Outlook.Application(); 
     Outlook.MailItem oMsg = Outlook.MailItem)oApp.CreateItem(Outlook.OlItemType.olMailItem); 
      oMsg.HTMLBody = "Hello, here is your message!"; 
      oMsg.Subject = "This is a test message"; 
      Outlook.Recipients oRecips = (Outlook.Recipients)oMsg.Recipients; 
      Outlook.Recipient oRecip = (Outlook.Recipient)oRecips.Add("[email protected]"); 
      oRecip.Resolve(); 
      oMsg.Send(); 
      oRecip = null; 
      oRecips = null; 
      oMsg = null; 
      oApp = null; 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.ToString()); 
    } 
} 

Dlaczego to nie działa?

Edycja: Tutaj jest rozwiązanie

using Outlook = Microsoft.Office.Interop.Outlook; 

... 

private void btnSendEmail_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     Outlook.Application oApp = new Outlook.Application(); 

     // These 3 lines solved the problem 
     Outlook.NameSpace ns = oApp.GetNamespace("MAPI"); 
     Outlook.MAPIFolder f = ns.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox); 
     System.Threading.Thread.Sleep(5000); // test 

     Outlook.MailItem oMsg = Outlook.MailItem)oApp.CreateItem(Outlook.OlItemType.olMailItem); 
      oMsg.HTMLBody = "Hello, here is your message!"; 
      oMsg.Subject = "This is a test message"; 
      Outlook.Recipients oRecips = (Outlook.Recipients)oMsg.Recipients; 
      Outlook.Recipient oRecip = (Outlook.Recipient)oRecips.Add("[email protected]"); 
      oRecip.Resolve(); 
      oMsg.Send(); 
      oRecip = null; 
      oRecips = null; 
      oMsg = null; 
      oApp = null; 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.ToString()); 
    } 
} 
+5

nie używaj Outlook. Zamiast tego użyj System.Net.Mail. – SLaks

+0

Dobre pytanie. Pewnie, że nie jesteś jeszcze zalogowany? – BugFinder

+0

SLaks, szkoda. Niestety utrzymuję kod VB6 i właśnie replikowałem problem w C#. –

Odpowiedz

12

Poniższy kod jest niezawodnie pracował przez kilka miesięcy dla mnie:

  app = new Microsoft.Office.Interop.Outlook.Application(); 
      Microsoft.Office.Interop.Outlook.NameSpace ns = app.GetNamespace("MAPI"); 
      f = ns.GetDefaultFolder(OlDefaultFolders.olFolderInbox); 
      Thread.Sleep(5000); // a bit of startup grace time. 

jeśli perspektywy były otwarte Używa go, jeśli nie jej otworzył . Oczywiście, jeśli twoja perspektywa wymaga zalogowania, twój kod na to nie pozwoli. Niektóre systemy utrudniają automatyczne logowanie.

+0

To zadziałało, dziękuję. –

10

I nie podoba mi się pomysł wykorzystania Thread.Sleep przez 5 sekund, więc znalazłem inne rozwiązanie, które pracowały dla mnie:

Wszystko czego potrzebujesz to dostać Inspektor obiektów na nowo utworzony

Outlook.Application oApp = new Outlook.Application(); 
Outlook.MailItem oMsg = (Outlook.MailItem)oApp.CreateItem(Outlook.OlItemType.olMailItem); 
Outlook.Inspector oInspector = oMsg.GetInspector; 

Odpowiedź została opublikowana w Google groups pierwotnie dla programu Outlook 2007 (ale to działało na mnie z Outlook 2010)

+0

Dzięki. Świetna robota :) –

+0

Jak jednak ten obiekt inspektora pomaga? To nie jest nigdzie używane lub czegoś brakuje? –

+0

Wyglądało na to, że Outlook zwraca Inspektora dopiero po prawidłowym zainicjowaniu. To jest podstęp. Nie musisz tego używać. – Woodman

Powiązane problemy