2011-12-28 2 views
9

У меня есть надстройка VSTO Outlook 2007. Я пытаюсь получить адрес электронной почты отправителя, когда новое письмо приходит в папку «Входящие».
Для этого я использую следующий код:Outlook 2007 vsto надстройка. Получить адрес электронной почты отправителя

void inboxItems_ItemAdd(object Item) 
{  
    Outlook.MailItem mailItem = Item as Outlook.MailItem; 

    if (mailItem != null) 
     string emailAdress = mailItem.SenderEmailAddress; 
} 

Проблема заключается в том, когда электронная почта приходит из того же домена, emailAdress содержит адрес LDAP как

/O = ПЕРВАЯ ОРГАНИЗАЦИЯ/OU = ПЕРВАЯ ГРУППА АДМИНИСТРАТИВНОГО/CN = Получатели/CN = АДМИНИСТРАТОР

в то время как я хочу, чтобы получить SMTP-адрес, как

[email protected]

Мой вопрос заключается в том, чтобы получить SMTP отправителя адрес электронной почты из внутреннего домена?

P. S.
В Outlook 2010 эту проблему можно решить, используя свойство Sender. Но она не поддерживается в 2007

item.Sender.GetExchangeUser().PrimarySmtpAddress 
+0

Если вы заинтересованы, пожалуйста, сделайте для этого: http: //stackoverflow.com/documentation/outlook-addin/commit –

ответ

15

В Outlook 2007 вы можете сделать это следующим образом:

private string GetSmtpAddress(Outlook.MailItem oItem) 
{ 
    Outlook.Recipient recip; 
    Outlook.ExchangeUser exUser; 
    string sAddress; 

    if (oItem.SenderEmailType.ToLower() == "ex") 
    { 
     recip = Globals.ThisAddIn.Application.GetNamespace("MAPI").CreateRecipient(oItem.SenderEmailAddress); 
     exUser = recip.AddressEntry.GetExchangeUser(); 
     sAddress = exUser.PrimarySmtpAddress; 
    } 
    else 
    { 
     sAddress = oItem.SenderEmailAddress.Replace("'", ""); 
    } 
    return sAddress; 
} 
+0

Есть ли аналогичный метод для получения адреса отправителя в визуальном базовом? – ASM2701

+1

Да @ ASM2701, вы можете точно так же в VB.NET. Синтаксис VB отличается от C# one, не имеет точек с запятой или фигурных скобок, но вы должны быть в состоянии понять это без каких-либо больших проблем. – GTG

+0

Если вам интересно, пожалуйста, сделайте следующее: http: //stackoverflow.com/documentation/outlook-addin/commit –

1

Здесь я представляю метод, который может быть использован, чтобы получить адрес электронной почты отправителя пропускания элемент электронной почты в качестве ссылки. Метод, которым он сам будет определять погоду по типу адреса электронной почты отправителя, является SMTP или Exchange. Если это Exchange, он преобразует адрес электронной почты в SMTP. Вот код.

internal static string GetSenderEmailAddress(ref Outlook.MailItem oM) 
    { 
     Outlook.PropertyAccessor oPA = null; 
     Outlook.AddressEntry oSender = null; 
     Outlook.ExchangeUser oExUser = null; 

     string SenderID; 
     string senderEmailAddress; 

     try 
     {     
      if (oM.SenderEmailAddress.Contains("@") && oM.SenderEmailAddress.Contains(".com")) //Handing smtp email addresses 
      { 
       senderEmailAddress = oM.SenderEmailAddress; 
      } 
      else //Handing exchange email addresses 
      { 
       // Create an instance of PropertyAccessor 
       oPA = oM.PropertyAccessor; 
       // Obtain PidTagSenderEntryId and convert to string 
       SenderID = oPA.BinaryToString(oPA.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x0C190102")); 
       // Obtain AddressEntry Object of the sender 
       oSender = Globals.ObjNS.GetAddressEntryFromID(SenderID); 

       oExUser = oSender.GetExchangeUser(); 
       senderEmailAddress = oExUser.PrimarySmtpAddress; 
      } 
      Debug.DebugMessage(3, "OutlookHelper : GetSenderEmailAddress() : Completed"); 
      return senderEmailAddress; 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
      return null; 
     } 
     finally 
     { 
      if (oExUser != null) Marshal.ReleaseComObject(oExUser); 
      if (oSender != null) Marshal.ReleaseComObject(oSender); 
      if (oPA != null) Marshal.ReleaseComObject(oPA); 
     } 
    } 
0

Вы можете использовать инспектор, чтобы получать текущую электронную почту, как следует.

Outlook.Inspector inspector = Globals.ThisAddIn.Application.ActiveInspector(); 
      if (inspector != null) 
      { 
       Outlook.MailItem mi = inspector.CurrentItem as Outlook.MailItem; 

       //Then identify whether email sender is exchange user or normal user 
       string senderEmail=null; 
       if (mi.SenderEmailType == "EX") 
       { 
       senderEmail = mi.Sender.GetExchangeUser().PrimarySmtpAddress;      
       } 
       else 
       { 
       senderEmail=mi.SenderEmailAddress; 
       } 
      } 

вы получите письмо отправителя в переменной senderEmail.