如何将Mailitem从文件保存到Outlook

时间:2019-07-16 09:00:55

标签: c# .net file outlook

当前,我正在编写一个控制台应用程序,该应用程序可以删除所有现有邮件,并且必须从.msg文件中获取新邮件(因此它将重置Outlook邮件)。 我想将导入文件从.msg文件复制到Outlook收件箱,但是我似乎找不到合适的方法。

我尝试了在这里和互联网上找到的各种方法,以及通过mail.move(inbox)“工作”最多的方法。这样会将邮件添加到收件箱中,但还会引发异常-System.Runtime.InteropServices.COMException:“无法移动项目。”,我无法摆脱它。

private static void FillInbox(NameSpace ns)
    {
        MAPIFolder inbox = ns.GetDefaultFolder(OlDefaultFolders.olFolderInbox);
        MailItem mail = ns.OpenSharedItem($@"W:\CopyThis.msg");
        mail.Move(inbox);
     }

您能帮助我获得更好的方法吗?一个不会引发异常的东西?

2 个答案:

答案 0 :(得分:0)

您可以尝试使用Application类的CreateItemFromTemplate方法,该方法从Outlook模板(.oft)创建新的Microsoft Outlook项目并返回新项目。在针对Outlook 2010及更高版本的测试中,我尝试将.msg文件的路径传递给CreateItemFromTemplate方法,它的工作原理很吸引人。因此,您可以将.msg.oft文件用作模板。

using System.Runtime.InteropServices;
// ...
private void CreateItemBasedOnTemplate(Outlook.Application Application)
{
    Outlook.NameSpace ns = null;
    Outlook.MAPIFolder containerFolder = null;
    Outlook.MailItem item = null;
    Outlook.MailItem movedItem = null;
    try
    {
        ns = Application.GetNamespace("MAPI");
        containerFolder = ns.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
        item = Application.CreateItemFromTemplate(@"D:\MyTemplate.msg", containerFolder) 
            as Outlook.MailItem;
        // the item was created in the Drafts folder regardless
        // that is why we move it to the Inbox folder
        movedItem = item.Move(containerFolder) as Outlook.MailItem;
        movedItem.Save();
        movedItem.Display();
    }
    catch (COMException ex)
    {
        if (ex.ErrorCode == -2147287038)
           System.Windows.Forms.MessageBox.Show(ex.Message,
               "Can't find the template...");
        else
           System.Windows.Forms.MessageBox.Show(ex.Message,
               "An error was occurred when creating a new item from template...");
    }
    finally
    {
        if (movedItem != null) Marshal.ReleaseComObject(movedItem);
        if (item != null) Marshal.ReleaseComObject(item);
        if (containerFolder != null) Marshal.ReleaseComObject(containerFolder);
        if (ns != null) Marshal.ReleaseComObject(ns);
    }
}

您可能会发现How To: Create a new Outlook message based on a template文章很有帮助。

答案 1 :(得分:0)

使用Namespace.OpenSharedItem-返回MailItem对象,然后您可以使用MailItem.MoveMailItem.Copy / MalItem.Move将其移动到任何文件夹。

OpenSharedItem.CreateItemFromTemplate(总是在未发送状态下创建项目并跳过与发件人相关的属性)不同,Namespace.OpenSharedItem使所有属性都可用