与收件箱和发送的项目相关的c# Outlook

本文关键字:Outlook 项目 收件箱 | 更新日期: 2023-09-27 18:06:55

我正在开发一个软件,我可以从outlook中检索收件箱和发送的项目。我想做的是将收件箱中的电子邮件与回复联系起来(如果有人给那封电子邮件发了回复)。该列表应按以下顺序显示

Sender@abc.com进入受试者接收时间sender@abc.com回复主题发送时间

我打算做的是检索一个数据表中的收件箱项目和另一个数据表中的发送项目。它根据发件人电子邮件和主题逐个读取电子邮件,然后在发送的项目中搜索发件人和电子邮件,如果匹配,则将其合并到第三个数据表中。

还有其他更好的方法吗?

代码如下:

 private DataTable GetInboxItems()
    {
        DataTable inboxTable;
        //try
        //{
        filter = "[ReceivedTime] >= '" + dtpStartDate.Value.ToString("dd/MM/yyyy 12:00 AM") + "' and [ReceivedTime] <= '" + dtpEndDate.Value.ToString("dd/MM/yyyy  11:59 PM") + "'";
        Outlook.Application outlookApp = GetApplicationObject();
        Outlook.Folder root = outlookApp.Session.DefaultStore.GetRootFolder() as Outlook.Folder;
        EnumerateFolders(root);
        //string filter = "[ReceivedTime] > '" + dtpStartDate.Value.ToString("dd/MM/yyyy") + "'";
        //inbox
        Outlook.MAPIFolder inboxFolder = outlookApp.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
        inboxTable = CreateTable();
        int count = 0;

        if (inboxFolder.Items.Count > 0)
        {
            var restrictedItems = inboxFolder.Items.Restrict(filter);
            restrictedItems.Sort("[ReceivedTime]", true); //descending
            //foreach (var item in inboxFolder.Items)
            foreach (var item in restrictedItems)
            {
                var mail = item as Outlook.MailItem;
                if (mail != null)
                {
                    //try
                    //{
                    DataRow row = inboxTable.NewRow();
                    //row["sn"] = (++count).ToString();
                    row["sn"] = mail.EntryID + " " + mail.ReceivedByEntryID;
                    row["MailType"] = "Inbox";
                    row["SenderName"] = mail.SenderName;
                    row["SenderEmail"] = mail.SenderEmailAddress;
                    row["ReceivedDate"] = mail.ReceivedTime;
                    row["Subject"] = mail.Subject;
                    row["Body"] = mail.Body != null ? (mail.Body.Length > 25 ? mail.Body.Substring(0, 25) : mail.Body) : null;
                    //row["Body"] = mail.Body != null ? mail.Body : "";
                    row["MailSize"] = mail.Size.ToString();
                    string attachments = null;
                    if (mail.Attachments.Count > 0)
                    {
                        foreach (var attachment in mail.Attachments)
                        {
                            if (((Outlook.Attachment)attachment) != null)
                                //attachments = ((Outlook.Attachment)attachment).FileName + " " + ((Outlook.Attachment)attachment).Size.ToString() + ", ";
                                attachments += (((Outlook.Attachment)attachment).Size / 1024).ToString() + " KB, ";
                        }
                    }

                    row["AttachmentCount"] = mail.Attachments.Count;
                    if (attachments != null)
                        row["AttachmentSize"] = attachments.Substring(0, attachments.Length - 2);
                    inboxTable.Rows.Add(row);
                }
                //catch (Exception ex)
                //{
                //    return null;
                //}
            }
        }
        return inboxTable;
    }

与收件箱和发送的项目相关的c# Outlook

我在outlook插件中做了这些东西

没有100%的方法使它…
问题是,会话ID并不总是由其他软件保存。所以你需要使用一组数据将电子邮件链接到他们的答案:
-消息id:这在电子邮件标题中可用。Sent items没有这个:/
- in - reply - to:这也在邮件头
-主题ID

对于主题ID,我按以下顺序检索值(取第一个可用的):
——MailItem。ConversationIndex:每个回复向会话索引添加字节
-引用头

然后,我使用topicID将电子邮件链接到他们的回复,电子邮件与回复具有相同的前X字符。原始邮件主题id = abc,回复= abcdef对于所有不能使用会话id链接的邮件,我尝试使用Message-ID &在回复ID

问题将特别来自outlook发送的电子邮件(没有Message-ID),然后用户回复没有Reference/ConversationIndex头…您将无法将这两个邮件链接在一起。

希望有帮助

EDIT:下面是一些代码。我复制/粘贴了来自不同类/方法的代码来创建单个方法,因此它可能无法编译。更像是伪代码

public SimpleTree<MailData> CreateTree(List<MailData> mails)
{
    mails.Sort((m1, m2) => m1.TopicId == m2.TopicId ? m2.CreationDate.CompareTo(m1.CreationDate) : m1.TopicId.CompareTo(m2.TopicId));
    var tree = new SimpleTree<MailData>();
    var i = 0;
    while (i < mails.Count)
    {
        var node = tree.Children.Add(mails[i]);
        var topicId = mails[i].TopicId;
        var start = i + 1;
        while (start < mails.Count 
            && !string.IsNullOrEmpty(topicId) 
            && !string.IsNullOrEmpty(mails[start].TopicId) 
            && mails[start].TopicId.StartsWith(topicId))
        {
            node.Children.Add(mails[start]);
            start++;
        }
        i = start;
    }
    // Handle email where TopicId are different, but ParentId is filled with correct value
    for (int j = tree.Children.Count - 1; j >= 0; j--)
    {
        var child = tree.Children[j];
        if (child.Children.Count == 0 && !string.IsNullOrEmpty(child.Value.ParentId))
        {
            var parentNode = tree.FindNode(s => s != null && s.MessageId == child.Value.ParentId);
            if (parentNode != null && parentNode != child)
                parentNode.Children.Add(child);
        }
    }
    return tree;
}

MailData是一个包含3个字段的类,如前所述:

  • MessageID(来自Message-ID报头)
  • ParentId (from In-Reply-To header)
  • TopicId(来自ConversationIndex或Reference header)

SimpleTree<>是一个创建树的类,它实际上是一个带有子节点的节点。这里没有什么特别的或与电子邮件有关的。value属性指向与节点关联的数据(这里是MailData)

我们的目标是对TopicId进行排序,这样我们就可以在一个循环中构造树然后检查树根中的所有邮件检查是否可以将它们移动到另一个邮件业务MessageId/ParentId

只要记住它创建了一个一级树,就像:

  • 邮件
    • 回复AA
    • 回复AAA
  • 邮件B
    • 回复BB
    • 回复BBB

但是你需要这样写:

  • 邮件
    • AA回复
      • 回复AAA
  • 邮件B
    • 回复BB
      • 回复BBB