2014-06-23 15 views
8

Tôi đã cố gắng sử dụng mailItem.SenderEmailAddressmailItem.Sender.Address nhưng cả hai đều trả về một chuỗi mà trông như thế này:Làm cách nào để có địa chỉ email người gửi bằng Outlook.MailItem trong VB.NET?

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

ở đâu trong thực tế tôi muốn [email protected] được retrurned.

Bất kỳ ai có ý tưởng nào?

Cảm ơn bạn rất nhiều.

Chỉnh sửa: Tôi đã thực hiện một số thao tác; nó hoạt động hoàn hảo cho các địa chỉ email của SMTP SenderEmailType, nó không hoạt động cho các địa chỉ email Exchange.

Chỉnh sửa 2: Tôi đã thử mã được chỉ định here, nhưng tôi cho rằng đã lỗi thời vì nó ném lỗi "Không thể tạo thành phần Active-X".

EDIT 3: Đối với bất cứ ai bao giờ có vấn đề tương tự như tôi, tôi tìm thấy câu trả lời (trong C#, chuyển đổi sang VB.NET, vẫn hoạt động mặc dù):

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 

Trả lời

19

tôi thấy bạn đã trả lời câu hỏi của riêng bạn. Tôi sẽ gửi chức năng C# của tôi ở đây trong trường hợp bất cứ ai cần nó hoặc nếu bạn muốn sử dụng nó như là giúp đỡ nhiều hơn nữa. # Chức năng My C để làm những gì bạn làm như sau:

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; 
} 
+0

Điều này chỉ hoạt động với Outlook 2010 trở lên, phải không? – BlueMonkMN

6

VBA Solution cũng (Just dịch VB.net)

Private Function GetSenderSMTPAddress (mail Như 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 

End Function

+0

Sửa lỗi cho tôi là tôi đã sai, nhưng điều này chỉ hoạt động với Outlook 2010 trở lên vì Người gửi không phải là tài sản của MailItem trong Outlook 2007. – BlueMonkMN

+0

Cảm ơn bạn đời. Điều này khá hữu ích. – Neophile

6

Nếu ai đó vẫn đang tìm kiếm một giải pháp cho vấn đề này, đây là một phiên bản VBA đơn giản và chân thật xanh của mã để xử lý yêu cầu này.

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 
-1

Tạo hàm VBA nếu bạn muốn sử dụng nó để đơn giản. Cuộc gọi mẫu sẽ là Left(GetEmailAddress(mai) & Space(50), 50) trong đó mai được mong đợi là đối tượng MailItem. Sử dụng và thử nghiệm thành công trong Microsoft Outlook 2010

Public Function GetEmailAddress(mai As Object) As String 
    On Error Resume Next 
    Set ObjSelectedItem = mai 
    If TypeName(ObjSelectedItem) = "MailItem" Then 
     If ObjSelectedItem.SenderEmailType = "EX" Then 
      GetEmailAddress = ObjSelectedItem.Sender.GetExchangeUser.PrimarySmtpAddress 
     Else 
      GetEmailAddress = ObjSelectedItem.SenderEmailAddress 
     End If 
    Else 
     GetEmailAddress = "Not a MailItem" 
    End If 

    Set ObjSelectedItem = Nothing 
    End Function 
2

Đối với tôi một câu trả lời đơn giản hơn nhiều là như sau

ở đâu để có được một địa chỉ bên ngoài bạn có thể đã sử dụng SenderEmailAddress, sau đó cho một (tức là từ trao đổi) sử dụng địa chỉ người gửi nội bộ .GetExchangeUser.PrimartySmtpAdress thay vì

Nếu bạn muốn nó hoạt động cho cả địa chỉ bên trong và bên ngoài thì hãy thử nghiệm để xem địa chỉ đó là nội bộ hay bên ngoài trước. Đoạn mã mẫu bên dưới

If itm.SenderEmailType = "SMTP" Then 
     mailfrom = itm.SenderEmailAddress 
Else 
If itm.SenderEmailType = "EX" Then 
     mailfrom = itm.Sender.GetExchangeUser.PrimarySmtpAddress 
End If 
End If 
Các vấn đề liên quan