WinForms

时间:2017-05-03 21:43:08

标签: c# winforms email outlook outlook-addin

我正在创建一个Outlook Add In,它有一个子表单。表单上有一个按钮,如果用户点击它,我想通过它生成一个mailitem。我想在电子邮件中自动填充一些信息,然后留给用户随意发送。

我的代码如下所示:

private void btnMailDocNotice_Click(object sender, EventArgs e)
    {
        string clientInfo = string.Empty;
        string matInfo = string.Empty;
        string author = string.Empty;
        string dType = string.Empty;
        string fLocation = string.Empty;
        string keyWords = string.Empty;
        string docName = string.Empty;

        clientInfo = this.mCboClient.Text + " " + lblClient;
        matInfo = this.mCboMatter.Text + " " + lblMatter;
        author = this.txtAuthor.Text;
        dType = this.mCboDocType.Text.ToUpper();
        fLocation = this.txtSavePath.Text;
        keyWords = this.txtKeyWords.Text;
        docName = this.txtDocName.Text;

        this.sendDocNotice = true;
        this.Hide();
        CreateMailItem(clientInfo, matInfo, author, dType, this.operatorCode.ToUpper(), fLocation, keyWords, docName);
        this.Show();
    }

private void CreateMailItem(string clientInfo, string matInfo, string author, string dType, string profiledBy, string fLocation, string keyWords, string docName)
    {
        this.DNoticeItem = (Outlook.MailItem)ThisAddIn.myApp.CreateItem(Outlook.OlItemType.olMailItem);
        this.DNoticeItem.Subject = "Document: " + docName;
        this.DNoticeItem.HTMLBody = "<span style=\"font-family:Calibri; font-size: 11pt;\">KeyWords: " + keyWords + "</span>";
        this.DNoticeItem.HTMLBody += "<br />Client: " + clientInfo;
        this.DNoticeItem.HTMLBody += "<br />Matter: " + matInfo;
        this.DNoticeItem.HTMLBody += "<br />Author: " + author;
        this.DNoticeItem.HTMLBody += "<br />Doc Type: " + dtClient;
        this.DNoticeItem.HTMLBody += "<br />Profiled by: " + profiledBy;
        this.DNoticeItem.HTMLBody += "<br />File://" + fLocation;
        this.DNoticeItem.Importance = Outlook.OlImportance.olImportanceNormal;
        this.DNoticeItem.Display(false);
    }

我遇到的问题是,它是在mailitem.display函数上触发一​​个异常,无论我使用true还是false(做一些研究表明,确定用户是否可以访问主Outlook窗口)而mailitem是开放的)。例外是“对话框已打开。请关闭它并再试一次”的COM异常。我已经尝试在创建邮件项的函数调用之前隐藏WinForm,然后在函数退出后再次显示它,但它不起作用。我已经尝试了一个版本的代码,我使用System.Diagnostics.Process.Start()尝试在将文件保存到磁盘后打开该文件,虽然它不会从添加中触发异常,但Outlook会提示具有来自ComException的相同消息的消息框的用户。我甚至尝试创建一个字段来查看是否应该起草doc通知电子邮件,并且在form.close()调用之后想到让代码处理它,认为close调用至少会处理对话框。锁定Outlook,我仍然得到相同的异常。

有没有办法实现我想要的?有没有人有什么建议?我现在有点困惑,并且会感谢任何人在这个问题上提供的任何帮助/指示/建议。如果这是一个重复的问题,我真诚地道歉 - 我找不到这个问题的好答案。提前谢谢您的时间。

1 个答案:

答案 0 :(得分:0)

首先,为什么不以无模式显示yoru自己的形式?

其次(这非常重要)使用如下代码

this.DNoticeItem.HTMLBody += "<br />Client: " + clientInfo;

每次运行这样的行时,都会检索HTMLBody,向其中添加一些内容(使HTML格式错误),然后再次设置HTMLBody并强制Outlook理解您的(格式错误的)HTML。这(假设Outlook可以解析并修复您的HTML)将导致返回的HTML与您设置的不同。

使用常规字符串构建HTML正文,并仅设置一次HTMLBody属性。