C#/.NET 4.8程序中实现Outlook邮件拖放功能的问题求助
C#/.NET 4.8程序中实现Outlook邮件拖放功能的问题求助
大家好,我现在在开发一个C#/.NET 4.8的应用,想实现从Outlook拖拽邮件到程序内处理的功能。目前拖拽附件是正常的,因为能直接获取到文件流;但拖拽邮件本身的时候就卡壳了——我本来以为会得到.msg格式的文件数据,结果检查拖放事件的Data对象时,只拿到了RenPrivateSourceFolder相关的信息,完全没有实际的邮件内容。
我也尝试用Outlook的COM Interop DLL来处理,但是依然拿不到邮件数据。下面是我写的代码片段:
拖放事件处理代码
void Import_DragDrop(object sender, DragEventArgs e) { try { if (e.Data.GetDataPresent("FileGroupDescriptor")) { var obj = e.Data.GetData("RenPrivateMessages"); if (obj is object[] items && items.Length > 0) // 这里items总是为空数组 { InitOutlook(); for (int i = 0; i < items.Length; i++) { var mailItemComObject = items[i]; var mailItem = mailItemComObject as Outlook.MailItem; if (mailItem != null) { string tempPath = System.IO.Path.Combine(System.IO.Path.GetTempPath(), mailItem.Subject + "." + i); mailItem.SaveAs(tempPath, Outlook.OlSaveAsType.olMSG); MessageBox.Show("Saved mail to " + tempPath); } } } } } catch (Exception ex) { // 省略了异常处理逻辑 } }
初始化Outlook实例的方法
之前遇到Outlook已运行时创建实例失败的问题,所以写了带重试的初始化逻辑:
private static void InitOutlook() { Outlook.Application outlookApp = null; int retries = 3; while (retries-- > 0) { try { outlookApp = (Outlook.Application)Marshal.GetActiveObject("Outlook.Application"); break; } catch (COMException ex) when ((uint)ex.HResult == 0x800401E3) { System.Threading.Thread.Sleep(500); } } if (outlookApp == null) { // 省略了实例创建失败的后续处理 } }
后来我还尝试了用GroupDescriptorW来获取数据,以及用开源项目OpenMcdf来解析,但是都没有成功拿到邮件内容。
有没有大佬能指点一下?不管是基于Outlook Interop的方案,还是其他不需要依赖Outlook的方法,我都很感激!
内容来源于stack exchange
相关产品推荐
相关产品推荐

