5

我有一个用于消息正文的 RichTextBox,我需要使用富文本正文创建一个新邮件。有我的代码我是如何试图意识到这一点的:

MemoryStream ms = new MemoryStream();
MemoEditBody.SaveDocument(ms, DevExpress.XtraRichEdit.DocumentFormat.Rtf);
byte[] RTFBody = ms.ToArray();
email.oMsg.RTFBody = RTFBody;                                

类型:

OutlookEMail email;
public MailItem oMsg;

问题:使用 2010 Outlook - 工作正常;使用 2007 Outlook - 此代码引发异常 ( AccessViolationException: Attempted to read or write protected memory) 有人可以建议如何使用 2007 Outlook 解决此问题吗?

PS使用:Visual Studio 2010 DevExpress

它在两台计算机上进行了测试,它们几乎相同(相同的窗口,相同的框架,只有一台有 Outlook 2007 另一个 2010),所以 80% 的问题出在 Outlook 版本中。

4

2 回答 2

4

我不确定您是否设法解决了您的问题,但我遇到了同样的问题。我正在使用 DevExpress RichEditControl 创建一个邮件合并 RTF 文件,该文件将用作 Outlook MailItem 的 RtfBody。但是,我得到了相同的 AccessViolationException。

我的解决方法不是最优雅的,是使用以下方法将 RTF 转换为 HTML:

http://www.codeproject.com/Articles/51879/Converting-RTF-to-HTML-in-VB-NET-the-Easy-Way

然后只需将消息 .BodyFormat 设置为 olFormatHTML 并将 .HTMLBody 设置为从上述函数返回的字符串。

于 2012-11-01T08:04:13.247 回答
3

原因是 MailItem.RTFBody 属性仅在 Outlook 2010 中添加,因此您试图调用不存在的东西。

据我所知,有两种潜在的解决方法。

  1. 如果 Outlook 使用 Word 作为编辑器,您可以使用以下方法提取邮件正文:

    Word.Document doc = app.ActiveInspector.WordEditor as Word.Document;
    

    ...然后您可以使用几乎任何 Word 对象模型来编辑/提取文本(例如doc.SaveAs(...)保存)。

    请注意,该WordEditor属性仅在IsWordMail方法返回true且该EditorType属性有效时才有效olEditorWord(请参阅http://msdn.microsoft.com/en-us/library/office/ff868196.aspx)。

  2. 您可以像上面 Foub 所说的那样首先将正文转换为 HTML,但这可能会丢失格式。

这两种解决方案都不是完美的,但根据我的经验,上述方法的组合大多数时候都有效。

于 2013-11-26T12:12:09.910 回答