Outlook MailItem:如何区分邮件是传入还是传出?

时间:2009-08-17 00:12:11

标签: c# outlook vsto mailitem

我在C#中编写VSTO Outlook插件,我需要区分,无论是MailItem是传入还是传出(或者两者都没有,例如草稿)。

有一些万无一失的方法吗?我现在的最佳解决方案是获取收件人,cc和bcc的列表,从活动帐户加载电子邮件地址,并检查这两个列表是否相交,但这对我来说似乎非常脆弱,我希望有更好的解决方案

使用案例:我想获得一封电子邮件的相关日期,可能是ReceivedTime或SentOn,但要知道我应该使用哪一个,我想知道邮件是发送还是收到。< / p>

感谢你的想法:)

10 个答案:

答案 0 :(得分:19)

来到此页面是因为我在VBA中遇到了同样的问题。检查父文件夹很麻烦,因为消息可以保存在多个文件夹中(因此您必须迭代多个文件夹)或者用户可能已经更改了文件夹。一个极端的例子:已删除的项目文件夹包含传入和传出的邮件项目。

我选择了另一个人(Adi Kini)的类似解决方案,我检查了ReceivedByName(我认为他选择了ReceivedEntryID)。对于已发送的消息,ReceivedByName属性始终为Null(“”),无论它在何处放置。此方法可以找到已拖动到收件箱的已发送项目!这似乎是一种相当可靠的检查方法。

看来,检查邮件是传入还是传出这样一个显而易见的事情,可能会让我们失望,这似乎很奇怪!

答案 1 :(得分:2)

我带着同样的问题来到这里。由于我明确建议用户将邮件移动到我的用例中的某个文件夹,因此检查Parent无助于...

关于MailItem.Sent:你确定MailItem.Sent以这种方式工作吗?我刚刚写了一个简单的代码来运行我的收件箱和SentItems,几乎所有这些代码都是真的。我认为这只是表明邮件是否已发送(=不是草稿)......

答案 2 :(得分:1)

MailItem.sent也适用于传入。

如何检查MailItem.ReceivedByEntryID。但我相信如果你说从outlook express或者其他一些电子邮件程序导入,这将失败(收件箱中的邮件的ReceivedByEntryID将为null)

通过邮件帐户/ senderemail迭代可能会有所帮助,但它不是万无一失(如果您重命名电子邮件地址)

答案 3 :(得分:1)

我通过在发送电子邮件后添加新的UserProperty来解决此问题。因此,当我需要检查是否发送了电子邮件时,我会检查此属性。即使电子邮件已从“已发送”文件夹中移出,此功能仍然有效。当然,这仅适用于新创建的电子邮件,但您可以在首次启动时将此属性添加到“已发送”文件夹中的所有电子邮件中。唯一的错误是默认情况下会打印UserProperties,但这可能是overridden

答案 4 :(得分:1)

这是我检查邮件类型的方式,即使将邮件移动到任何文件夹也能正常工作。此解决方案使用outlook 2007中提供的PROPERTY ACCESSOR。以下是代码

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
}

答案 5 :(得分:0)

查看MailItem的.Parent属性 - 检查文件夹属性以确定它是收件箱,发件箱,草稿,已发送的项目等。

答案 6 :(得分:0)

您可以检查它是否在Outlook.OlDefaultFolders.olFolderInboxolFolderOutbox内,然后应该有其他方法可以检查它是否在这些文件夹中的任何一个!

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

答案 7 :(得分: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

答案 8 :(得分:0)

我将 SenderName 与 CurrentUser 相矛盾,以区分收件箱或已发送文件夹中的电子邮件。

enter image description here

答案 9 :(得分:-3)

您是否尝试过MailItem.Sent属性?

传入是真的,传出是假的。