【问题标题】:Receive embedded RTF objects in Outlook 2007(To,Bcc,Cc - Fields)在 Outlook 2007 中接收嵌入的 RTF 对象(收件人、密件抄送、抄送 - 字段)
【发布时间】:2015-01-26 08:49:35
【问题描述】:

我在使用 Outlook 2007 的富文本字段时遇到问题。我尝试读取 “收件人、密件抄送、抄送字段” 中的值(电子邮件地址)。我已经读到这个问题是已知的,并且您只能在保存 Outlook 中的 mailItem 时读取这些字段。 因此,我尝试使用窗口处理程序和 SendMessage 函数访问电子邮件地址。但它只会返回:

{\rtf1\ansi\ansicpg1252\deff0\deflang1031{\fonttbl{\f0\fswiss\fprq2\fcharset0 Tahoma;}} {*\generator Riched20 12.0.6606.1000;}\viewkind4\uc1 \pard\f0\fs17{\pict\wmetafile0

所以我认为 Outlook 将电子邮件地址替换为嵌入对象,并且该对象显示电子邮件地址。谁能帮助并告诉我如何访问该对象并获取电子邮件地址?

【问题讨论】:

    标签: email outlook rtf sendmessage richtext


    【解决方案1】:

    使用 MailItem.Recipients 集合 - 它将始终被填充。

    【讨论】:

      【解决方案2】:

      我知道这一点,但在 Outlook 2007 中存在错误或缺少功能。当您从收件人字段中删除(电子邮件地址)收件人时,mailItem 不会刷新其收件人集合。它仅在添加和解决收件人时刷新!

      所以我看到的唯一方法是读取 To-Field 的内容是..通过 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;}} {*\generator Riched20 12.0.6606.1000;}\viewkind4\uc1 \pard\f0\fs17 {\pict\wmetafile0

      所以 Outlook 将纯文本替换为对象,我需要接收 RTF 内容的所有信息!我认为此内容中的某处必须是电子邮件地址。 To - 字段类是:RichEdit20WPT

      【讨论】:

      • 在对 Recipients 集合进行任何更改后,您是否尝试调用 Save 方法?有帮助吗?
      • @Eugene Astafiev 是的,我已经尝试过了,是的,它有帮助。但在我看来,这不是应对收件人的干净方式。这导致了一种解决方法。因此,查看 (To;Cc,Bcc)-Rich Text Fields 变化的唯一方法是,我必须在字段中添加一个处理程序来检查字段中的更新,但在此之前我需要获取领域,这是我的问题。
      • Outlook 缓存并且不反映通过对象模型在 UI 中所做的更改。您需要保存项目以使更改可见并触发 ItemChange 事件。
      • 好的,谢谢。但这不是我想要的方式,也不能回答我的问题。我只想阅读富文本字段的内容或使用 SendMessage Api 访问此富文本字段的所有属性。
      • 你在说什么 SendMessage API?你能说得更具体点吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-27
      • 2013-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-19
      相关资源
      最近更新 更多