Outlook MailItem: как различать, является ли почта входящей или исходящей?

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

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

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

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

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

Вот как я проверяю тип почты, и он работает, даже если почта перемещается в любую папку. В этом решении используется PROPERTY ACCESSOR, доступный в 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
}

Ответ 6

Посмотрите на свойство MailItem.Parent - проверьте свойства папки, чтобы определить, являются ли они входящими, исходящими, черновиками, отправленными элементами и т.д.

Ответ 7

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

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

Ответ 8

Для простого отправленного/полученного управления по 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

Ответ 9

Вы пробовали свойство MailItem.Sent?

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