EWS -确定电子邮件是回复还是已转发

本文关键字:回复 转发 电子邮件 EWS | 更新日期: 2023-09-27 18:13:52

我正在使用Exchange Web Services Managed API 2.2来监视用户的收件箱,并且需要确定电子邮件是新项目、回复还是转发的消息。

我看过各种关于SO的文章,例如如何注意到邮件是否是转发邮件?是否有一种方法来确定电子邮件是否是使用ews c#的回复/响应?这两种方法在特定情况下都有帮助,但我仍然不知道如何区分回复和转发的项目。

在第一篇文章中,每次额外添加5个字节(转发或回复),所以我不知道最后一个动作是什么。

第二篇文章建议使用InReplyTo,但是当我检查转发的电子邮件的属性时,它包含原始发件人的电子邮件地址(非null)。

我看过其他类似的文章,它们建议使用扩展属性来检查PR_ICON_INDEX、pr_last_verb_performed和PR_LAST_VERB_EXECUTION_TIME中的值。

我的代码看起来如下,但从未返回lastVerbExecuted的值

var lastVerbExecutedProperty = new ExtendedPropertyDefinition(4225, MapiPropertyType.Integer);
var response = service.BindToItems(newMails, new PropertySet(BasePropertySet.IdOnly,  lastVerbExecutedProperty));
var items = response.Select(itemResponse => itemResponse.Item);
foreach (var item in items)
{
    object lastVerb;
    if (item.TryGetProperty(lastVerbExecutedProperty, out lastVerb))
    {
        // do something
    }
}

EWS -确定电子邮件是回复还是已转发

PR_ICON_INDEX, PR_LAST_VERB_EXECUTED和PR_LAST_VERB_EXECUTION_TIME只会告诉你收件人是否对收件箱中的消息采取了行动。例如,如果用户在其收件箱中回复或转发了消息,则在其收件箱中的消息上设置这些属性。在响应或转发的消息上不会设置这些属性。我建议你使用In-Reply-To Transport头,它应该设置在任何回复或转发的消息上,这应该包含被回复或转发的消息的互联网messageid。

        FindItemsResults<Item> fiRs = service.FindItems(WellKnownFolderName.Inbox, new ItemView(10));
        PropertySet fiRsPropSet = new PropertySet(BasePropertySet.FirstClassProperties);
        ExtendedPropertyDefinition PR_TRANSPORT_MESSAGE_HEADERS = new ExtendedPropertyDefinition(0x007D, MapiPropertyType.String);
        fiRsPropSet.Add(PR_TRANSPORT_MESSAGE_HEADERS);
        service.LoadPropertiesForItems(fiRs.Items, fiRsPropSet);
        foreach (Item itItem in fiRs)
        {
            Object TransportHeaderValue = null;
            if(itItem.TryGetProperty(PR_TRANSPORT_MESSAGE_HEADERS,out TransportHeaderValue)) {
                string[] stringSeparators = new string[] { "'r'n" };
                String[] taArray = TransportHeaderValue.ToString().Split(stringSeparators, StringSplitOptions.None);
                for (Int32 txCount = 0; txCount < taArray.Length; txCount++)
                {
                    if (taArray[txCount].Length > 12)
                    {
                        if (taArray[txCount].Substring(0, 12).ToLower() == "in-reply-to:")
                        {
                            String OriginalId = taArray[txCount].Substring(13);
                            Console.WriteLine(OriginalId);
                        }
                    }
                }
            }
        }

除了在另一个链接中讨论过的主题前缀外,我不知道还有什么其他的属性可以区分回复和转发。

干杯格伦

最好的方法是依赖扩展属性的ResponeCode

参考下面的脚本

private static int IsForwardOrReplyMail(ExchangeService service, EmailMessage messageToCheck)
    {
        try
        {
            // Create extended property definitions for PidTagLastVerbExecuted and PidTagLastVerbExecutionTime.
            ExtendedPropertyDefinition PidTagLastVerbExecuted = new ExtendedPropertyDefinition(0x1081, MapiPropertyType.Integer);
            ExtendedPropertyDefinition PidTagLastVerbExecutionTime = new ExtendedPropertyDefinition(0x1082, MapiPropertyType.SystemTime);
            PropertySet propSet = new PropertySet(BasePropertySet.IdOnly, EmailMessageSchema.Subject, PidTagLastVerbExecutionTime, PidTagLastVerbExecuted);
            messageToCheck = EmailMessage.Bind(service, messageToCheck.Id, propSet);
            // Determine the last verb executed on the message and display output.
            object responseType;
            messageToCheck.TryGetProperty(PidTagLastVerbExecuted, out responseType);
            if (responseType != null && ((Int32)responseType) == 104)
            {
                //FORWARD
                return 104;
            }
            else if (responseType != null && ((Int32)responseType) == 102)
            {
                //REPLY
                return 102;
            }

        }
        catch (Exception)
        {
            return 0;
            //throw new NotImplementedException();
        }
    }

要确定它是否为回复电子邮件,您可以使用EmailMessage objects InReplyTo属性,例如:

EmailMessage mail = ((EmailMessage)Item.Bind(service, new ItemId(UniqueId)));
if (mail.InReplyTo == null)
    return;
else
    ..your code