如何查找MailItem.Display()

时间:2019-04-26 07:34:26

标签: c# winforms email outlook

我有以下要求:

  • 允许用户将电子邮件从Outlook拖放到数据网格
  • 准备一封回复邮件并显示它,以便用户可以查看和发送
  • 发送后,还要获取发送邮件并将其放入数据网格

我正在工作的拖放操作
准备重播电子邮件并将其显示给我也有工作的用户,使用以下代码:

MailItem mail = GetMailBySubject(dateReceived, subject);
if (mail != null)
{
    MailItem mailReply = mail.ReplyAll();
    // add text and stuff to mailReply...
    mailReply.Display();
}

这将在Outlook中打开一个窗口,就像用户单击Outlook中的答复一样。

现在我坚持第三个要求,
用户发送回复电子邮件后,我需要以某种方式在Outlook中找到此电子邮件以将其添加到我的datagrid中。

但是我不知道该怎么做。
我所拥有的只是用于准备回复的原始邮件。
是否只有这样才能找到答复,或者这可能是一种完全错误的方法?
更加困难的是,我必须显示回复电子邮件NON Modal,因此当用户单击“发送到Outlook”中时,我没有触发器。

供参考,这是GetMailBySubject的代码

private MailItem GetMailBySubject(DateTime dateReceived, string subject)
{
    MailItem Result = null;

    Microsoft.Office.Interop.Outlook.Application OutlookIns = new Microsoft.Office.Interop.Outlook.Application();
    Microsoft.Office.Interop.Outlook.NameSpace olNamespace = OutlookIns.GetNamespace("MAPI");
    MAPIFolder myInbox = olNamespace.GetDefaultFolder(OlDefaultFolders.olFolderInbox);

    Items items = myInbox.Items;
    int count = items.Count;
    MailItem mail = null;
    int i = 1; //DO NOT START ON 0

    while ((i < count) && (Result == null))
    {
        if (items[i] is MailItem)
        {
            mail = (MailItem)items[i];
            if ((mail.ReceivedTime.ToString("yyyyMMdd hh:mm:ss") == dateReceived.ToString("yyyyMMdd hh:mm:ss")) && (mail.Subject == subject))
            {
                Result = mail;
            }
        }
        i++;
    }

    return Result;
}

编辑
我按照建议尝试了此代码,但是Items.ItemAdd事件未触发。
所以我仍然必须做错事,但看不到

这是我的代码

MailItem mail = GetMailBySubject((DateTime)sentOn, msg.Subject);
if (mail != null)
{
    MailItem mailReply = mail.ReplyAll();
    mailReply.HTMLBody = GetDefaultReplyText() + Environment.NewLine + mailReply.HTMLBody;

    Guid guid = Guid.NewGuid();
    UserProperties mailUserProperties = null;
    UserProperty mailUserProperty = null;

    mailUserProperties = mailReply.UserProperties;
    mailUserProperty = mailUserProperties.Add("myproperty", OlUserPropertyType.olText);
    mailUserProperty.Value = guid.ToString(); ;
    // the code below gives error "The property cannot be parsed or has an invalid format"
    //mailReply.PropertyAccessor.SetProperty("myproperty", guid.ToString());

    mailReply.Display();
}


private MailItem GetMailBySubject(DateTime dateReceived, string subject)
{
    MailItem Result = null;

    Microsoft.Office.Interop.Outlook.Application OutlookIns = new Microsoft.Office.Interop.Outlook.Application();
    Microsoft.Office.Interop.Outlook.NameSpace olNamespace = OutlookIns.GetNamespace("MAPI");
    MAPIFolder myInbox = olNamespace.GetDefaultFolder(OlDefaultFolders.olFolderInbox);

    Items items = myInbox.Items;
    int count = items.Count;
    MailItem mail = null;
    int i = 1; //DO NOT START ON 0

    while ((i < count) && (Result == null))
    {
        if (items[i] is MailItem)
        {
            mail = (MailItem)items[i];
            if ((mail.ReceivedTime.ToString("yyyyMMdd hh:mm:ss") == dateReceived.ToString("yyyyMMdd hh:mm:ss")) && (mail.Subject == subject))
            {
                Result = mail;
                MAPIFolder mySent = olNamespace.GetDefaultFolder(OlDefaultFolders.olFolderSentMail);
                mySent.Items.ItemAdd += Items_SentMailItemAdd;
            }
        }
        i++;
    }
    return Result;
}

最后

private void Items_SentMailItemAdd(object Item)
{
    //throw new NotImplementedException();
    ; // this event is never fired
}

1 个答案:

答案 0 :(得分:1)

您可以在“已发送邮件”文件夹上使用Items.ItemAdd事件。要检查是否是您的消息,请在您创建和显示的消息上设置自定义属性。您可以使用MailItem.UserProperties.Add,但是这可以强制以TNEF格式发送邮件。为防止这种情况发生,您可以使用MailItem.PropertyAccessro.SetProperty来设置命名的MAPI属性,而无需使用UserProperties集合。您可以使用OutlookSpy设置测试用户属性并查看其DASL名称(供SetProperty使用)(选择消息,单击IMessage按钮,选择自定义属性,请参见DASL编辑框)。