打开多个Outlook窗口使用C#发送电子邮件

时间:2017-05-24 19:48:33

标签: c# multithreading sendmail

我需要打开几个以前填充了ticulo和电子邮件正文的Outlook窗口,以便以后的用户通知发件人。我需要打开几个窗口(我走一个网格知道有多少个窗口)。 我试图用线程执行此操作但发生错误消息说:Outlook无法执行此操作,因为对话框已打开。请关闭它并再试一次“ 如何打开多个竞争窗口?

测试电话

 private void button2_Click(object sender, EventArgs e)
{
    int qtdEventos = dgvDescEvento.RowCount;
    Thread[] Threads = new Thread[qtdEventos];
    try
    {
        cEmail testeEmail = new cEmail();
        for (int i = 0; i < qtdEventos; i++)
        {
            Threads[i] = new Thread(new ThreadStart(new cEmail().Monta));
        }
        foreach (Thread t in Threads)
        {
            t.Start();
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Outlook = Microsoft.Office.Interop.Outlook;

namespace NavEventos.Class
{
    class cEmail
    {
        private Outlook.Application outlookApp;
        public cEmail()
        {
            outlookApp = new Outlook.Application();
        }

        public void Monta()
        {
            string pTitulo = "Title";
            string pAssunto = "Body test";
            Outlook._MailItem oMailItem = (Outlook._MailItem)outlookApp.CreateItem(Outlook.OlItemType.olMailItem);
            Outlook.Inspector oInspector = oMailItem.GetInspector;

            Outlook.Recipients oRecips = (Outlook.Recipients)oMailItem.Recipients;

            #region MONTA ASSUNTO
            oMailItem.Subject = pTitulo;
            #endregion

            #region MONTA CORPO DO E-MAIL
            oMailItem.Body = pAssunto;
            #endregion

            oMailItem.Display(true);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

你可能不喜欢这个......但你不应该尝试。 ;(

正如您所看到的,Outlook COM界面正在努力阻止您这样做,这是Outlook自动化库的一个限制,即以模式方式显示邮件项目。

这是有充分理由的,您的用户在您的LOB应用程序中,然后您的代码希望他们阅读Outlook中的电子邮件,您已使用COM自动化库进行了Outlook。现在,工具栏中的Outlook图标正在闪烁,因为已打开一个新的电子邮件模式窗口,但此对话框可能已在您当前的LOB应用程序后面打开。

现在,用户需要将上下文切换到Outlook以查看对话框并阅读电子邮件。

如果您可以同时查看是否需要打开这些电子邮件,那么您和outlook com自动化将会很好地相处:)

否则,请考虑为Outlook编写插件并将您的电子邮件管理例程移动到Outlook本身。在那里你可以非常有创意,听起来你真的需要一个主 - 详细的界面风格,比如主Outlook浏览器,所以你有一个这些电子邮件的列表,当用户点击它们时,它们会显示在预览检查器中

  

也许解决方案是使用您的逻辑将这些消息移动到   Outlook中的特定文件夹,然后使用Outlook自动化来实现此目的   文件夹中的当前活动窗口,然后用户可以决定   他们想要采取行动的电子邮件。