2009-08-17 4 views
11

Я пишу VSTO Outlook addin в C#, и мне нужно различать, предоставляется ли MailItem входящим или исходящим (или ни один из них, если это, например, черновик).Outlook MailItem: как отличить почту от входящей или исходящей?

Есть ли какой-нибудь надежный способ сделать это? Лучшее решение, которое я сейчас получаю, будет получать список получателей, cc и bcc, загружать адреса электронной почты из активных учетных записей и проверять, пересекаются ли эти два списка, но это кажется мне довольно хрупким, и я надеюсь, что есть лучшее решение ,

Вариант использования: Я хотел бы получить соответствующую дату для электронной почты, которая может быть получена либо в формате ReceivedTime, либо в SentOn, но для того, чтобы узнать, какой из них я должен использовать, я знал, была ли отправлена ​​или получена почта.

Спасибо за идеи :)

+0

Вы должны проверить все получатель, куб.см, и т.д, или вы можете просто посмотреть на отправителе? Если владелец аккаунта не отправил его, он поступает. –

+0

Не отправлено ли каждое полученное письмо? – Roland

ответ

0

Посмотрите на собственность .parent в MailItem в - исследовать свойства папки, чтобы определить, является ли папка Входящие, Исходящие, Черновики, Отправленные и т.д.

+0

Но что, если пользователь (или правила фильтрации почты) уже переместил почту в какую-либо общую папку (например, папку для проекта XYZ) с входящими и исходящими сообщениями электронной почты? В этом случае входящий/исходящий будет свойством, специфичным для электронной почты, а не папки. Приятная идея, однако, это не произошло со мной :). –

+0

Это очень хороший вопрос. У меня нет ответа на этот вопрос. –

-3

ли вы пытаетесь использовать свойство MailItem.Sent?

Истина для входящих и ложных для исходящих.

+0

Nope - см. Ответ Дэвида http://stackoverflow.com/questions/1285713/outlook-mailitem-how-to-distinguish-whether-mail-is-incoming-or-outgoing/2370543#2370543 –

2

Я пришел сюда с той же проблемой. Поскольку я буду явно предлагать, чтобы пользователь перемещал почту в какую-то папку в моей учетной записи, проверка родителя не помогла бы ...

Что касается MailItem.Sent: вы уверены, что MailItem.Sent работает таким образом? Я просто написал простой код для запуска как моих Inbox, так и SentItems, и почти для всех из них отправлено true. Я предполагаю, что это на самом деле просто указание, была ли отправлена ​​почта (= не тяга) ...

1

MailItem.sent также подходит для входящих.

Как насчет проверки MailItem.ReceivedByEntryID. Но я уверен, что это не удастся (ReceivedByEntryID будет null для писем в папке «Входящие»), если вы скажете, что импорт из Outlook Express или, возможно, какая-то другая почтовая программа

Итерация через почтовые учетные записи/senderemail может помочь, как вы сказали, но ее не дурачить (например, если вы переименовали адрес электронной почты)

+0

Спасибо! Это может сработать для большинства пользователей, так как я не думаю, что многие электронные пользователи импортировали свои электронные письма из Outlook Expres (и даже если бы они это сделали, большинство полезных операций по-прежнему будут включать только недавние письма, которые будут получены Outlook). –

0

Вы можете проверить, находится ли он внутри Outlook.OlDefaultFolders.olFolderInbox или olFolderOutbox, тогда должны быть другие методы, которые вы можете использовать, чтобы проверить, находится ли он в любой из этих папок!

Outlook.Application _application = new Outlook.Application(); 
Outlook.MAPIFolder folder = _application.GetNamespace("MAPI").GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox); 
+0

Я думаю, что это не сработало бы на отправленные/полученные письма, которые были перенесены в другую папку (например, с фильтром) - не так ли? –

1

Я решил эту проблему, добавив новый UserProperty после отправки электронной почты. Поэтому, когда мне нужно проверить, отправлено ли электронное письмо, я проверяю это свойство. Это работает, даже если электронная почта была перенесена из папки Sent. Конечно, это работает только для вновь созданных электронных писем, но вы можете добавить это свойство ко всем электронным письмам в папке «Отправленные» во время первого запуска. Единственная ошибка в том, что UserProperties печатается по умолчанию, но это может быть overridden.

+1

Это довольно тяжелое решение, но, вероятно, только одно здесь, которое может работать. Тем не менее, надстройка должна работать все время - иначе мы получим немаркированные полученные электронные письма - и при первом запуске. мы не смогли бы отметить отправленные электронные письма, которые были перемещены в другую папку. Возможно, можно будет просмотреть всю почту и посмотреть, является ли получатель одним из адресов электронной почты пользователя, но это может занять часы в большой учетной записи Exchange/IMAP ... –

1

Вот как я проверяю тип почты, и он работает, даже если почта перемещена в любую папку. Это решение использует доступа к свойствам, которые доступны в Outlook 2007. Ниже приведен код

string PR_MAIL_HEADER_TAG = "http://schemas.microsoft.com/mapi/proptag/0x007D001E"; 

Outlook.PropertyAccessor oPropAccessor = mItemProp.PropertyAccessor; 

string strHeader = (string)oPropAccessor.GetProperty(PR_MAIL_HEADER_TAG); 

if (strHeader == "") 
{ 
    // MAIL IS OF TYPE SENTBOX 
} 
else 
{ 
    // MAIL IS OF TYPE INBOX 
} 
+1

не работает в ol 2010 atleast – Kumar

+0

работает с обменять почтовые учетные записи, но не с imap/smtp - проверено с ol 2016 – Lakedaimon

17

пришел на эту страницу, потому что у меня была такая же проблема в VBA. Проверка родительских папок громоздка, так как сообщение может содержать несколько папок в глубину (и, следовательно, вам нужно перебирать несколько папок), или пользователь может изменить папку. Крайний пример: папка удаленных элементов содержит как входящие, так и исходящие почтовые отправления.

Я выбрал аналогичное решение для другого человека (Adi Kini) выше, где я проверяю ReceivedByName (я думаю, он выбрал ReceivedEntryID). Свойство ReceivedByName всегда равно Null ("") для отправленного сообщения, где бы оно ни находилось. Этот метод может найти отправленный элемент, который был перенесен в папку «Входящие» !. Это довольно надежный метод проверки.

Кажется странным, что такая очевидная прямолинейная вещь, как проверка того, является ли почта входящей или исходящей, может нас трогать!

+0

Обратите внимание, что ни «ReceivedByName», ни «ReceivedEntryID» не будут иметь значение, если элемент почты был получен общедоступной папкой с назначенным адресом. – cremor

0

Для простого отправления/получения контроля по SMTP-адресу я предлагаю подход адресной проверки. Это может быть сделано следующим образом:

'Get mail address sender 
     Dim mailSender As String = GetSenderSMTPAddress(outMailItem) 

'Get current user mail address 
     Dim mailUser As String = OutlookMail2DocScriba.GetUserSMTPAddress(oNameSpace.CurrentUser.AddressEntry) 

     'If sender and current user matches is a sended mail, otherwise received 
     If String.Compare(mailSender, mailUser, True) = 0 Then 
      Return "Sended" 
     Else 
      Return "Received" 
     End If 





    Public Shared Function GetSenderSMTPAddress(ByVal mail As Outlook.MailItem) As String 
      'http://msdn.microsoft.com/en-us/library/microsoft.office.interop.outlook.oladdresslisttype.aspx 

      If mail Is Nothing Then 
       Throw New ArgumentNullException() 
      End If 
      If mail.SenderEmailType = "EX" Then 
       Dim sender As Outlook.AddressEntry = Nothing 

       Try 
        sender = mail.Sender 
       Catch ex As Exception 
        'Se non è stato in grado di reperire il sender (Outlook 2007), 
        'ignoro l'eccezione e procedo. 
       End Try 

       If sender IsNot Nothing Then 
        Return GetUserSMTPAddress(sender) 
       Else 
        Return Nothing 
       End If 
      Else 
       Return mail.SenderEmailAddress 
      End If 
     End Function 

     Public Shared Function GetUserSMTPAddress(ByVal sender As Outlook.AddressEntry) As String 
      'Now we have an AddressEntry representing the Sender 
      'http://msdn.microsoft.com/en-us/library/office/ff868214(v=office.15).aspx 
      Const EXCHANGE_USER_ADDRESS_ENTRY As Int32 = 0 
      Const EXCHANGE_REMOTE_USER_ADDRESS_ENTRY As Int32 = 5 
      Dim PR_SMTP_ADDRESS As String = "http://schemas.microsoft.com/mapi/proptag/0x39FE001E" 

      If sender.AddressEntryUserType = EXCHANGE_USER_ADDRESS_ENTRY OrElse _ 
       sender.AddressEntryUserType = EXCHANGE_REMOTE_USER_ADDRESS_ENTRY Then 
       'Use the ExchangeUser object PrimarySMTPAddress 
       Dim exchUser As Object = sender.GetExchangeUser() 
       If exchUser IsNot Nothing Then 
        Return exchUser.PrimarySmtpAddress 
       Else 
        Return Nothing 
       End If 
      Else 
       Return TryCast(sender.PropertyAccessor.GetProperty(PR_SMTP_ADDRESS), String) 
      End If 
     End Function 

 Смежные вопросы

  • Нет связанных вопросов^_^