2017-06-07 9 views
1

Outlookを使用して複数の顧客に電子メールを送信したい。このために、受信者を反復し、メッセージ本文を作成し、最初のメッセージをプレビューとして表示するメソッドをプログラム内に持っています。Outlookで複数のメールを生成する

これは、その方法の簡易版である:Outlookのメッセージウィンドウが表示されたら、私は同じようにすぐに次のMailItemがあるべきように、ウィンドウを閉じるか、「送信」をクリックすると、どんなに

public void CreateMails(List<InfoMailRecipient> recipients) 
{ 
    Microsoft.Office.Interop.Outlook.Application outlook = new Microsoft.Office.Interop.Outlook.Application(); 
    foreach (InfoMailRecipient recipient in recipients) 
    { 
     MailItem mail = outlook.CreateItem(OlItemType.olMailItem); 
     mail.SentOnBehalfOfName = "Sending User"; 
     mail.BCC = recipient.EMailAddress; 

     mail.Subject = "TEST"; 
     mail.BodyFormat = OlBodyFormat.olFormatHTML; 
     mail.HTMLBody = "<html><body>test</body></html>"; 
     mail.Display(true); 
    } 
} 

私は例外 "RPCサーバーを利用できません"を作成しました。明らかにOutlookが終了しているため。私は

mail.Display(true); 

とちょうどすべてのメッセージが正常に送信され.Send();を呼び出す行を削除するとことが判明しました。しかし、Outlookは開いたままです。 foreachのループの後に私が.Quit()と呼んでも。

このOutlookインスタンスを適切に処理する方法を教えてください。

アップデート1 - マニュアルGC-コール

public void CreateMails(List<InfoMailRecipient> recipients) 
{ 
    Microsoft.Office.Interop.Outlook.Application outlook = new Microsoft.Office.Interop.Outlook.Application(); 
    foreach (InfoMailRecipient recipient in recipients) 
    { 
     MailItem mail = outlook.CreateItem(OlItemType.olMailItem); 
     mail.SentOnBehalfOfName = "Sending User"; 
     mail.BCC = recipient.EMailAddress; 

     mail.Subject = "TEST"; 
     mail.BodyFormat = OlBodyFormat.olFormatHTML; 
     mail.HTMLBody = "<html><body>test</body></html>"; 
     mail.Send(); 
    } 
    outlook.Quit(); 
    GC.Collect(); 
    GC.WaitForPendingFinalizers(); 
} 

Outlookが動作し続けます。

+0

すべての受信者がまったく同じメッセージを取得しますか? – mjwills

+0

いいえ、メッセージはパーソナライズされている必要があります –

+0

Display呼び出しを削除し、Quitへの呼び出しを追加してからGC.Collect()およびGC.WaitForPendingFinalizers()に呼び出しを追加できますか?この機能から抜け出すと、Outlookは終了しますか? – mjwills

答えて

0

これは機能しているようです - それがあなたにも役立つかどうかお知らせください。

public static void Main(string[] args) 
    { 
     CreateMails(new List<string>() {"emailaddresshere"}); 
     Console.WriteLine("finished"); 
     Console.ReadLine(); 
    } 

    public static void CreateMails(List<string> recipients) 
    { 
     Microsoft.Office.Interop.Outlook.Application outlook = new Microsoft.Office.Interop.Outlook.Application(); 
     foreach (string recipient in recipients) 
     { 
      MailItem mail = outlook.CreateItem(OlItemType.olMailItem); 
      mail.SentOnBehalfOfName = "Sending User"; 
      mail.BCC = recipient; 

      mail.Subject = "TEST"; 
      mail.BodyFormat = OlBodyFormat.olFormatPlain; 
      mail.HTMLBody = "Hello"; 
      mail.Send(); 
      System.Runtime.InteropServices.Marshal.ReleaseComObject(mail); // key change 
     } 
     GC.Collect(); 
     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 
     outlook.Application.Quit(); 
     outlook.Quit(); 
     System.Runtime.InteropServices.Marshal.ReleaseComObject(outlook); // key change 
     outlook = null; 
     GC.Collect(); 
     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 
    } 

https://ausdotnet.wordpress.com/category/technical/com-interop/How to close outlook after automating it in c#の読み取りを持っています。

+0

です!ありがとうございました。それはすでに 'outlook.Quit();で動作するようです。 Marshal.ReleaseComObject(outlook); ' –

+0

これはすばらしいニュースです! – mjwills

+0

時には時々そうではありません....私はオブジェクトをリリースしてプロセスを終了しました...決して気にしないでください... –

関連する問題