Private Function GetSMTPEmailAddress(mailItem As MailItem) As String
If mailItem.SenderAddressType = "EX" Then
Return GetEmailAddressForExchangeServer(loItem.Name)
Else
Return mailItem.Address
End If
End Function
Private Function GetEmailAddressForExchangeServer(ByVal emailName As String) As String
Dim loDummyMsg As MailItem = moMailItem.Application.CreateItem(OlItemType.olMailItem)
Dim loAddress As Recipient = loDummyMsg.Recipients.Add(emailName)
loAddress.Resolve()
Dim lsSmtpAddress As String = GetMAPIProperty(loAddress.AddressEntry.MAPIOBJECT, PR_SMTP_ADDRESS)
Return lsSmtpAddress
End Function
#Region "MAPI Interface ID'S"
' The Interface ID's are used to retrieve the specific MAPI Interfaces from the IUnknown Object
Private Const IID_IMAPISession As String = "00020300-0000-0000-C000-000000000046"
Private Const IID_IMAPIProp As String = "00020303-0000-0000-C000-000000000046"
Private Const IID_IMAPITable As String = "00020301-0000-0000-C000-000000000046"
Private Const IID_IMAPIMsgStore As String = "00020306-0000-0000-C000-000000000046"
Private Const IID_IMAPIFolder As String = "0002030C-0000-0000-C000-000000000046"
Private Const IID_IMAPISpoolerService As String = "0002031E-0000-0000-C000-000000000046"
Private Const IID_IMAPIStatus As String = "0002031E-0000-0000-C000-000000000046"
Private Const IID_IMessage As String = "00020307-0000-0000-C000-000000000046"
Private Const IID_IAddrBook As String = "00020309-0000-0000-C000-000000000046"
Private Const IID_IProfSect As String = "00020304-0000-0000-C000-000000000046"
Private Const IID_IMAPIContainer As String = "0002030B-0000-0000-C000-000000000046"
Private Const IID_IABContainer As String = "0002030D-0000-0000-C000-000000000046"
Private Const IID_IMsgServiceAdmin As String = "0002031D-0000-0000-C000-000000000046"
Private Const IID_IProfAdmin As String = "0002031C-0000-0000-C000-000000000046"
Private Const IID_IMailUser As String = "0002030A-0000-0000-C000-000000000046"
Private Const IID_IDistList As String = "0002030E-0000-0000-C000-000000000046"
Private Const IID_IAttachment As String = "00020308-0000-0000-C000-000000000046"
Private Const IID_IMAPIControl As String = "0002031B-0000-0000-C000-000000000046"
Private Const IID_IMAPILogonRemote As String = "00020346-0000-0000-C000-000000000046"
Private Const IID_IMAPIForm As String = "00020327-0000-0000-C000-000000000046"
#End Region
#Region "MAPI Properties"
' MAPI Properties
Public Const PR_TRANSPORT_MESSAGE_HEADERS As UInteger = 8192030
Public Const PR_BODY As UInteger = 268435486
Public Const PR_BODY_HTML As UInteger = 269680670
Public Const PR_HTML As UInteger = 269680898
Public Const PR_DISPLAY_NAME As UInteger = 805371934
Public Const PR_SUBJECT As UInteger = 3604510
Public Const PR_EMAIL_ADDRESS As UInteger = 805503006
'public const uint PR_NEG_EMAIL_ADDRESS = -2146496482;
Public Const PR_SMTP_ADDRESS As UInteger = 972947486
Public Const PR_ADDRTYPE As UInteger = 805437470
#End Region
#Region "structure and variables "
Private Structure SPropValue
Public ulPropTag As UInteger
Public dwAlignPad As UInteger
Public Value As Long
End Structure
' return codes
Private Const S_OK As Integer = 0
#End Region
#Region "MAPI Functions"
<DllImport("MAPI32.DLL", CharSet:=CharSet.Ansi, EntryPoint:="HrGetOneProp@12")> _
Private Shared Sub HrGetOneProp(ByVal pmp As IntPtr, ByVal ulPropTag As UInteger, ByRef ppProp As IntPtr)
End Sub
<DllImport("MAPI32.DLL", CharSet:=CharSet.Ansi, EntryPoint:="HrSetOneProp@8")> _
Private Shared Sub HrSetOneProp(ByVal pmp As IntPtr, ByVal pprop As IntPtr)
End Sub
<DllImport("MAPI32.DLL", CharSet:=CharSet.Ansi, EntryPoint:="MAPIFreeBuffer@4")> _
Private Shared Sub MAPIFreeBuffer(ByVal lpBuffer As IntPtr)
End Sub
<DllImport("MAPI32.DLL", CharSet:=CharSet.Ansi)> _
Private Shared Function MAPIInitialize(ByVal lpMapiInit As IntPtr) As Integer
End Function
<DllImport("MAPI32.DLL", CharSet:=CharSet.Ansi)> _
Private Shared Sub MAPIUninitialize()
End Sub
''' <summary>
''' Get a property from a passed MAPI object
''' </summary>
''' <param name="oMAPIObject"></param>
''' <param name="uiPropertyTag"></param>
''' <returns></returns>
Private Shared Function GetMAPIProperty(ByVal oMAPIObject As Object, ByVal uiPropertyTag As UInteger) As String
If oMAPIObject.Equals(Nothing) Then
'No MAPI Object
Return ""
End If
Dim sProperty As String = ""
Dim pPropValue As IntPtr = IntPtr.Zero
Dim IUnknown As IntPtr = IntPtr.Zero
Dim IMAPIProperty As IntPtr = IntPtr.Zero
Try
' initialize MAPI
MAPIInitialize(IntPtr.Zero)
' get the unknown object.
IUnknown = Marshal.GetIUnknownForObject(oMAPIObject)
'get the property
Dim guidIMAPIProp As New Guid(IID_IMAPIProp)
If Marshal.QueryInterface(IUnknown, guidIMAPIProp, IMAPIProperty) <> S_OK Then
'Failed to get IMAPIProperty
Return ""
End If
Try
' get the field from the MAPI Property
HrGetOneProp(IMAPIProperty, uiPropertyTag, pPropValue)
' Is the property actually there?
If pPropValue = IntPtr.Zero Then
Return ""
End If
' Get the value back
Dim propValue As SPropValue = DirectCast(Marshal.PtrToStructure(pPropValue, GetType(SPropValue)), SPropValue)
' convert to string
sProperty = Marshal.PtrToStringAnsi(New IntPtr(propValue.Value))
Catch ex As System.Exception
Throw ex
End Try
Finally
' CLEAN UP
If pPropValue <> IntPtr.Zero Then
MAPIFreeBuffer(pPropValue)
End If
If IMAPIProperty <> IntPtr.Zero Then
Marshal.Release(IMAPIProperty)
End If
If IUnknown <> IntPtr.Zero Then
Marshal.Release(IUnknown)
End If
MAPIUninitialize()
End Try
Return sProperty
End Function
#End Region