2015-01-26 5 views
0

У меня проблема с текстовыми полями Outlook 2007. Я пытаюсь прочитать значения (адреса электронной почты) в «To, Bcc, Cc Fields ". Я прочитал, что проблема известна и что вы можете читать поля только в том случае, если файл MailItem в Outlook сохранен. Итак, я попытался получить доступ к адресам электронной почты с помощью обработчика окна и функции SendMessage. Но это только возвращает:Получать встроенные объекты RTF в Outlook 2007 (To, Bcc, Cc - Fields)

{\ rtf1 \ ANSI \ ansicpg1252 \ deff0 \ deflang1031 {\ fonttbl {\ f0 \ fswiss \ fprq2 \ fcharset0 Tahoma;}} {* \ генератор Riched20 12.0.6606.1000;} \ viewkind4 \ uc1 \ пард \ f0 \ FS17 {\ пикт \ wmetafile0

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

ответ

0

Используйте коллекцию MailItem.Recipients - она ​​будет заполнена в любое время.

0

Я знаю это, но в Outlook 2007 есть ошибка или отсутствует функция. Когда вы удаляете получателя (адреса электронной почты) из поля, mailItem не обновляет коллекцию получателей. Он обновляется только при добавлении и разрешении получателя!

Таким образом, единственный способ, по которому я вижу, это прочитать содержимое поля To-Field is..via SendMessage.

private int EditStreamProc(MemoryStream dwCookie, IntPtr pbBuff, int cb, out int pcb) 
    { 
     pcb = cb; 
     byte[] buffer = new byte[cb]; 
     Marshal.Copy(pbBuff, buffer, 0, cb); 
     dwCookie.Write(buffer, 0, cb); 
     return 0; 
    } 

    private delegate int EditStreamCallback(MemoryStream dwCookie, IntPtr pbBuff, int cb, out int pcb); 

    [StructLayout(LayoutKind.Sequential)] 
    private struct EDITSTREAM 
    { 
     public MemoryStream dwCookie; 
     public int dwError; 
     public EditStreamCallback pfnCallback; 
    } 

    [DllImport("user32.dll", CharSet = CharSet.Auto)] 
    private static extern IntPtr SendMessage(IntPtr hwnd, uint msg, uint wParam, ref EDITSTREAM lParam); 

    private const int WM_USER = 0x0400; 
    private const int SF_RTF =3; 
    private const int EM_STREAMOUT = WM_USER + 74; 


    public string ReadRTFContentInOL2007(IntPtr handle) 
    { 
     string result = String.Empty; 
     using (System.IO.MemoryStream stream = new MemoryStream()) 
     { 
      EDITSTREAM editStream = new EDITSTREAM(); 
      editStream.pfnCallback = new EditStreamCallback(EditStreamProc); 
      editStream.dwCookie = stream; 

      SendMessage(handle, EM_STREAMOUT, SF_RTF, ref editStream); 

      stream.Seek(0, SeekOrigin.Begin); 
      using (StreamReader reader = new StreamReader(stream)) 
      { 
       result = reader.ReadToEnd(); 
      } 
     } 
     return result; 
    } 

Когда адреса электронной почты будут решены, то я получаю это:

{\ rtf1 \ ANSI \ ansicpg1252 \ deff0 \ deflang1031 {\ fonttbl {\ f0 \ fswiss \ fprq2 \ fcharset0 Tahoma;} } {* \ генератор Riched20 12.0.6606.1000;} \ viewkind4 \ uc1 \ пард \ f0 \ FS17 {\ пикт \ wmetafile0

Так прогноз заменяет обычный текст с объектом, и мне нужно, чтобы получить всю информацию о RTF Content! Я думаю, что где-то в этом контенте должен быть адрес электронной почты. To - Field Class: RichEdit20WPT

+0

Вы пытались вызвать метод Save после внесения каких-либо изменений в коллекцию получателей? Помогает ли это? –

+0

@Eugene Astafiev Да, я пробовал это и да, это помогает. Но это не чистый способ справиться с получателями, на мой взгляд. Это приводит к обходу. Таким образом, единственный способ увидеть изменения в текстовых полях (To; Cc, Bcc) -Rich - это добавить обработчик в поля, которые проверяют наличие обновлений в полях, но до этого мне нужно получить содержимое поля, и это моя проблема. –

+0

Outlook кэширует и не отражает изменения, внесенные в пользовательский интерфейс через объектную модель. Вам нужно сохранить элемент, чтобы получить видимые изменения и события ItemChange. –

 Смежные вопросы

  • Нет связанных вопросов^_^