EWS - определите, является ли электронная почта ответной или переадресованной
Я использую управляемый API-интерфейс Exchange Web Services 2.2 для мониторинга входящих сообщений пользователей и должен определить, является ли электронная почта новым элементом, ответом или перенаправленным сообщением.
Я видел различные статьи на SO, такие как, как заметить, является ли почта переадресованной почтой? и есть ли способ определить, является ли электронная почта ответом / ответом, используя ews C#? которые оба помогают в их конкретных случаях, но я все еще не могу понять, как отличить ответ от перенаправленного элемента.
В первой статье каждый раз добавляются дополнительные 5 байтов (вперед или ответ), поэтому я не знаю, каким было последнее действие.
Вторая статья предлагает использовать InReplyTo
однако, когда я проверяю свойство для переадресованных сообщений, оно содержит адрес электронной почты отправителя (не ноль).
Я видел другие статьи, такие как эта или эта, которые предлагают использовать расширенные свойства для проверки значений в PR_ICON_INDEX, PR_LAST_VERB_EXECUTED и 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
}
}
3 ответа
PR_ICON_INDEX, PR_LAST_VERB_EXECUTED и PR_LAST_VERB_EXECUTION_TIME будут работать только для того, чтобы сообщить вам, действовал ли получатель с сообщением в своей папке "Входящие". Например, если пользователь ответил или перенаправил сообщение в свою папку "Входящие", эти свойства будут установлены для сообщения в папке "Входящие". В сообщении, на которое ответили или перенаправили, эти свойства не будут установлены. Я бы посоветовал вам использовать заголовок In-Reply-To Transport, который должен быть установлен в любом сообщении, на которое вы отвечаете или пересылаете, оно должно содержать интернет-сообщение о сообщении, на которое был отправлен ответ или, например, переадресовано.
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);
}
}
}
}
}
Помимо префикса "Тема", который обсуждался в другой ссылке, я не знаю никаких других свойств, которые будут различать ответ или пересылку.
Ура Глен
Чтобы определить, был ли это ответ на электронное письмо, вы можете использовать объекты EmailMessage InReplyTo
свойство, например:
EmailMessage mail = ((EmailMessage)Item.Bind(service, new ItemId(UniqueId)));
if (mail.InReplyTo == null)
return;
else
..your code
Лучший способ полагаться на 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();
}
}