_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
_
あなた自身の質問に答えたと思います。誰かがそれを必要とする場合、またはあなたがより多くの助けとしてそれを使いたい場合、私はここに私の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;
}
誰かがまだこの問題の解決策を探している場合は、この要件を処理するための単純化された真のブルー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
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
終了機能
私にとってはるかに簡単な答えは次のとおりです
外部アドレスを取得するには、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