【问题标题】:PDF Outlook Email attachment sometimes saved with no permissionsPDF Outlook 电子邮件附件有时在没有权限的情况下保存
【发布时间】:2015-05-08 04:55:51
【问题描述】:

使用以下代码循环浏览 Outlook 消息存储中的消息(getItem 对象)并将附件保存为文件:

try 
{
      foreach (Outlook.Attachment attach in getItem.Attachments)
      {
           if (attach.FileName == sItemName)
           {
                string sSaveFile = Path.GetTempPath() + "Attachment" + sItemType;
                if (System.IO.File.Exists(sSaveFile)) System.IO.File.Delete(sSaveFile);
                attach.SaveAsFile(sSaveFile);
                sContent = Common.GetFileContent2(sSaveFile);
           }
      }
 }
 catch (Exception Ex)
 {
      Common.LogError("GetUpdated", Ex, "Get text from Email attachment", "Error", false);
 }
 System.Runtime.InteropServices.Marshal.ReleaseComObject(getItem.Attachments);

我发现当另一个 PDF 文件出现时,有时无法删除提取的 PDF 文件。无法在资源管理器中查看提取的 PDF 文件的文件权限 - 属性的安全选项卡显示“您必须具有读取权限才能查看此对象的属性”。常规属性选项卡可以读取。

我在 Windows 8.1 中使用 Outlook 2007

【问题讨论】:

  • 代码中使用的是什么文件路径?您是否使用管理员权限运行 Outlook?
  • 保存文件夹的路径是用户Temp目录,即C:\User\AppData\Local\Temp。我已尝试按照其他有类似问题的人的建议重新安装 Office,但没有成功。 Outlook 未以任何权限运行。它使用Outlook.Application myApp = new Outlook.Application(); Outlook.NameSpace mapiNameSpace = myApp.GetNamespace("MAPI"); 调用。删除文件失败时没有可辨别的模式,并且仅发生在 PDF 中。大约 90 秒后,未经许可的 PDFS 消失
  • 我没有在代码中看到任何奇怪的东西。尝试在另一台 PC 上运行它。你得到相同的结果吗?有问题的 PC 上是否有任何防病毒软件?
  • 我有 Windows Defender (MsMpEng.exe) 作为 AV/反恶意软件。在另一台 PC 上运行很难,因为我在一台机器上只有 Visual Studio,但在另一台机器上运行的其他可执行文件(Win 7、Office 2010)没有显示任何问题
  • 很可能您的系统在某些方面已损坏。因为我无法在装有 Windows 8.1 的 PC 上重现该问题。您是否在 Outlook 2007 中安装了最新的更新和服务包?

标签: c# pdf outlook email-attachments


【解决方案1】:

我建议从审查代码开始并立即发布所有底层 COM 对象。使用完后,使用System.Runtime.InteropServices.Marshal.ReleaseComObject 释放 Outlook 对象。如果您的加载项尝试枚举存储在 Microsoft Exchange Server 上的集合中的 256 个以上的 Outlook 项目,这一点尤其重要。如果您不及时释放这些对象,您可能会达到 Exchange 对任何一次打开的最大项目数量的限制。然后在 Visual Basic 中将变量设置为 Nothing(在 C# 中为 null)以释放对对象的引用。您可以在 MSDN 的 Systematically Releasing Objects 文章中阅读更多相关信息。

例如:

foreach (Outlook.Attachment attach in getItem.Attachments)

附件属性返回附件类的一个实例,该实例应该在之后被释放。此外,在方法结束和 GC 运行之前,Attachment 类的每个实例都保持活动状态。

最后,我建议改用 for 循环。因此,您将能够立即释放每个对象。

【讨论】:

  • 知道为什么错误只出现在 pdf 附件中吗?正在处理的电子邮件存档包含带有 .doc、.docx 的消息。 .txt 和其他附件文件类型,但可以从所有这些文件中提取文本
猜你喜欢
  • 1970-01-01
  • 2013-08-30
  • 2015-05-02
  • 2021-06-26
  • 2017-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-06
相关资源
最近更新 更多