gpt4 book ai didi

c# - vsto + 无法从 RTF 电子邮件中获取附件的文件名

转载 作者:太空宇宙 更新时间:2023-11-03 11:17:19 25 4
gpt4 key购买 nike

我正在保存邮件中的附件。我首先检查正文格式,以便我只获得真正的附件。请忽略下面的 if else 语句,仅将注释作为下一个语句。一旦我解决了我的问题,我就会编码。现在,我的问题是在获取 RichText 正文格式邮件附件的文件名时出现此错误。一切都很好,采用纯文本和 HTML 格式。

“currentMailItem.Attachments[1].FileName”引发了“System.Runtime.InteropServices.COMException”类型的异常 base {System.Runtime.InteropServices.ExternalException}: {“Outlook 无法对此类附件执行此操作。”

public static void SaveData(MailItem currentMailItem)
{
if (currentMailItem != null)
{
string PR_ATTACH_METHOD = "http://schemas.microsoft.com/mapi/proptag/0x37050003";
string PR_ATTACH_FLAGS = "http://schemas.microsoft.com/mapi/proptag/0x37140003";

if (currentMailItem.Attachments.Count > 0)
{
for (int i = 1; i <= currentMailItem.Attachments.Count; i++)
{
var attachMethod = currentMailItem.Attachments[i].PropertyAccessor.GetProperty(PR_ATTACH_METHOD);
var attachFlags = currentMailItem.Attachments[i].PropertyAccessor.GetProperty(PR_ATTACH_FLAGS);

if (currentMailItem.BodyFormat == OlBodyFormat.olFormatPlain)
//no attachment is inline
else if (currentMailItem.BodyFormat == OlBodyFormat.olFormatRichText)
{
if (attachMethod == 6)
//attachment is inline
else
//attachment is normal
}
else if (currentMailItem.BodyFormat == OlBodyFormat.olFormatHTML)
{
if (attachFlags == 4)
//attachment is inline
else
//attachment is normal
}
currentMailItem.Attachments[i].SaveAsFile(@"C:\TestFileSave\" + currentMailItem.Attachments[i].FileName);
}
}
}
}

最佳答案

对于 RTF 格式,您嵌入了 OLE 对象,RTF 正文使用这些对象来显示附件预览并就地编辑它。您可以按附件类型 (Attachment.Type == olAttachmentType.olOLE (6)) 过滤掉此类附件,也可以使用以下任一方式提取附件数据

  1. 扩展 MAPI(仅限 C++ 或 Delphi)- 调用 IAttach::OpenProperty(PR_ATTACH_DATA_OBJ, IID_IStorage, ...) 将附件数据打开为 IStorage然后从其中一个 IStorage 流中提取文件数据。确切的流名称和格式取决于用于创建它的特定应用程序(Word、Adobe、Paintbrush、Excel 等)。可以看到OutlookSpy中的数据(我是它的作者):选择带有这样附件的邮件,单击 OutlookSpy 功能区上的 IMessage 按钮,转到 GetAttachmentTable 选项卡,双击附件,选择 PR_ATTACH_DATA_OBJ 属性,右键单击,选择 OpenProperty,选择 IID_IStorage。

  2. Redemption (任何语言——我也是它的作者):它的RDOAttachment对象足够智能,可以在您调用 SaveAsFile 或访问 FileName 属性时提取 OLE 附件的实际文件数据。

关于c# - vsto + 无法从 RTF 电子邮件中获取附件的文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12278411/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com