代码之家  ›  专栏  ›  技术社区  ›  benichka

C#:将资源作为附件添加到Outlook邮件项目

  •  0
  • benichka  · 技术社区  · 7 年前

    我正在尝试将文件附加到将在Outlook中以C#格式发送的电子邮件。
    我有以下几点效果很好:

    using OutlookApp = Microsoft.Office.Interop.Outlook.Application;
    [...]
    public class Foo
    {
        private void SendMail()
        {
            OutlookApp outlookApp = new OutlookApp();
            MailItem mailItem = outlookApp.CreateItem(OlItemType.olMailItem);
            [...]
            var rootDirectory = System.Windows.Forms.Application.StartupPath;
            Attachment myAttachment = mailItem.Attachments.Add(Path.Combine(rootDirectory, @"../../Assets/image.png"));
            [...]
            mailItem.Display(false);
        }
    }
    

    它可以工作,但有点糟糕,因为现在我的文件在一个静态文件夹中,当项目构建时,它不会在那里。
    所以我把我的图片放在了项目的资源中:图片现在可以通过 Properties.Resources.image .
    我天真地做了以下几件事:

    using OutlookApp = Microsoft.Office.Interop.Outlook.Application;
    [...]
    public class Foo
    {
        private void SendMail()
        {
            OutlookApp outlookApp = new OutlookApp();
            MailItem mailItem = outlookApp.CreateItem(OlItemType.olMailItem);
            [...]
            var rootDirectory = System.Windows.Forms.Application.StartupPath;
            Attachment myAttachment = mailItem.Attachments.Add(Properties.Resources.image);
            [...]
            mailItem.Display(false);
        }
    }
    

    但它不起作用:

    系统运行时。互操作服务。COMException:“未找到成员。(HRESULT的异常:0x80020003(DISP\u E\u MEMBERNOTFOUND))'

    从…起 MSDN ,我读取了 Attachments.Add

    类型:系统。对象
    附件的来源。这可以是一个文件(由带有文件名的完整文件系统路径表示)或构成附件的Outlook项。

    据我所知,问题是我只能提供文件名,以便向Outlook邮件添加附件。另一种选择是创建Outlook附件,但如果我理解这是不可能的。唯一的办法是。。。添加文件的附件 mailItem

    1. 我添加附件的方法正确吗?如果是这样,我该如何获取资源文件的路径?
    2. 如果这种方法很好,有没有办法引用 Resources.resx 项目中的文件?含义:文件路径将在我的应用程序中可用,文件将在我构建项目时“导出”;
    3. 如果我的方法不正确,我如何向 MailItem 是否正确地从资源文件?

    谢谢

    2 回复  |  直到 7 年前
        1
  •  2
  •   benichka    7 年前

    好的,最后我改变了我的方法。 在我需要的所有图像的构建操作中,我做了以下操作(这在文件的属性选项卡中可用):

    • :内容。
    • :如果更新,则复制。 build options

    这样,在生成时,包含“我的图像”(和“我的图像”)的文件夹将复制到生成目录。然后,我可以使用它们的相对URL:

    Attachment myAttachment = mailItem.Attachments.Add(Path.GetFullPath("Assets/image.png"));
    

    我不知道这是否是唯一的方法,但它有效,看起来并不丑陋,我仍然可以使用XAML中的图像。当图像放置在 resx 显然,这是一个PITA。

        2
  •  0
  •   Troublesum    7 年前

    我的猜测是,资源不能作为附加项使用。有没有办法将资源作为图像保存到计算机的某个位置,然后附加您创建的文件?

    像这样的事情可能会奏效。

     var bmp = new Bitmap(Properties.Resources.myimage);
    
     Attachment myAttachment = mailItem.Attachments.Add(bmp);