web-dev-qa-db-ja.com

VB.NETのOutlook.MailItemを使用して送信者のメールアドレスを取得するにはどうすればよいですか?

_mailItem.SenderEmailAddress_と_mailItem.Sender.Address_を使用してみましたが、どちらも次のような文字列を返します。

/O=DOMAINNAME/OU=EXCHANGE ADMINISTRATIVE GROUP (FYDIBOHI43SPCLT)/CN=RECIPIENTS/CN=JOE BLOGGS8C3

実際には、どこに_[email protected]_を再表示させたいか。

誰かアイデアはありますか?

どうもありがとうございました。

編集:私はいくつかの発掘を行いま​​した。 「SenderEmailType」SMTPの電子メールアドレスに対しては完全に機能しますが、Exchangeの電子メールアドレスに対しては機能しません。

編集2:指定されたコード here を試しましたが、「Active-Xコンポーネントを作成できません」エラーがスローされるため、古くなっていると思います。

EDIT 3:私と同じ問題を抱えている人のために、私は答えを見つけました( VB.NETに変換されたC#は引き続き機能します):

_Private Function GetSenderSMTPAddress(mail As Outlook.MailItem) As String
    Dim PR_SMTP_ADDRESS As String = "http://schemas.Microsoft.com/mapi/proptag/0x39FE001E"
    If mail Is Nothing Then
        Throw New ArgumentNullException()
    End If
    If mail.SenderEmailType = "EX" Then
        Dim sender As Outlook.AddressEntry = mail.Sender
        If sender IsNot Nothing Then
            'Now we have an AddressEntry representing the Sender
            If sender.AddressEntryUserType = Outlook.OlAddressEntryUserType.olExchangeUserAddressEntry OrElse sender.AddressEntryUserType = Outlook.OlAddressEntryUserType.olExchangeRemoteUserAddressEntry Then
                'Use the ExchangeUser object PrimarySMTPAddress
                Dim exchUser As Outlook.ExchangeUser = 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
        Else
            Return Nothing
        End If
    Else
        Return mail.SenderEmailAddress
    End If
End Function
_
13
ubergorp

あなた自身の質問に答えたと思います。誰かがそれを必要とする場合、またはあなたがより多くの助けとしてそれを使いたい場合、私はここに私のC#関数を投稿します。あなたがすることを行うための私のC#関数は次のようになります:

 private string getSenderEmailAddress(Outlook.MailItem mail)
{
 Outlook.AddressEntry sender = mail.Sender;
 string SenderEmailAddress = "";

  if (sender.AddressEntryUserType == Outlook.OlAddressEntryUserType.olExchangeUserAddressEntry || sender.AddressEntryUserType == Outlook.OlAddressEntryUserType.olExchangeRemoteUserAddressEntry)
    {
        Outlook.ExchangeUser exchUser = sender.GetExchangeUser();
        if (exchUser != null)
        {
            SenderEmailAddress = exchUser.PrimarySmtpAddress;
        }
    }
    else
    {
        SenderEmailAddress = mail.SenderEmailAddress;
    }

    return SenderEmailAddress;
}
26
Alex Harvey

誰かがまだこの問題の解決策を探している場合は、この要件を処理するための単純化された真のブルーVBAバージョンのコードを次に示します。

Public Sub GetCurrentItem()
    On Error Resume Next
    Set ObjSelectedItem = Outlook.ActiveExplorer.Selection.Item(1)
    If TypeName(ObjSelectedItem) = "MailItem" Then
        If ObjSelectedItem.SenderEmailType = "EX" Then
            MsgBox (ObjSelectedItem.Sender.GetExchangeUser.PrimarySmtpAddress)
        Else
            MsgBox (ObjSelectedItem.SenderEmailAddress)
        End If
    Else
        MsgBox ("No items selected (OR) Selected item not a MailItem.")
    End If
    Set ObjSelectedItem = Nothing
End Sub
9
prgSRR

VBAソリューションも(VB.netを翻訳しただけ)

プライベート関数GetSenderSMTPAddress(mail As Outlook.MailItem)As String

If mail Is Nothing Then
    GetSenderSMTPAddress = vbNullString
    Exit Function
End If
If mail.SenderEmailType = "EX" Then
    Dim sender As Outlook.AddressEntry
    Set sender = mail.sender
    If Not sender Is Nothing Then
        'Now we have an AddressEntry representing the Sender
        If sender.AddressEntryUserType = Outlook.OlAddressEntryUserType.olExchangeUserAddressEntry Or sender.AddressEntryUserType = Outlook.OlAddressEntryUserType.olExchangeRemoteUserAddressEntry Then
            'Use the ExchangeUser object PrimarySMTPAddress
            Dim exchUser As Outlook.ExchangeUser
            Set exchUser = sender.GetExchangeUser()
            If Not exchUser Is Nothing Then
                 GetSenderSMTPAddress = exchUser.PrimarySmtpAddress
            Else
                GetSenderSMTPAddress = vbNullString
            End If
        Else
             GetSenderSMTPAddress = sender.PropertyAccessor.GetProperty(PR_SMTP_ADDRESS)
        End If
    Else
        GetSenderSMTPAddress = vbNullString
    End If
Else
    GetSenderSMTPAddress = mail.SenderEmailAddress
End If

終了機能

6
Gerry Wilton

私にとってはるかに簡単な答えは次のとおりです

外部アドレスを取得するには、SenderEmailAddressを使用した可能性があります。次に、内部(つまりExchangeからの)アドレスの場合は、代わりにSender.GetExchangeUser.PrimartySmtpAdressを使用します。

内部アドレスと外部アドレスの両方で機能するようにする場合は、最初にアドレスが内部アドレスか外部アドレスかを確認するテストを行います。以下のコードスニペットの例

If itm.SenderEmailType = "SMTP" Then
        mailfrom = itm.SenderEmailAddress
Else
If itm.SenderEmailType = "EX" Then
        mailfrom = itm.Sender.GetExchangeUser.PrimarySmtpAddress
End If
End If
4
larcy