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

C#: add a resource as an attachment to an Outlook mail item

我正在尝试将文件附加到将在 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);
    }
}

但是不行:

System.Runtime.InteropServices.COMException: 'Member not found. (Exception from HRESULT: 0x80020003 (DISP_E_MEMBERNOTFOUND))'

MSDN 开始,我阅读了 Attachments.Add 方法的第一个参数:

Type: System.Object
The source of the attachment. This can be a file (represented by the full file system path with a file name) or an Outlook item that constitutes the attachment.

据我了解,问题是我只能提供文件名才能将附件添加到 Outlook 邮件中。另一种选择是创建 Outlook 附件,但据我所知这是不可能的。这样做的唯一方法是...在 mailItem.
的附件中添加一个文件 所以我的问题如下:

  1. 我添加附件的方法是否正确?如果可以,如何获取资源文件的路径?
  2. 如果这种方法不错,有没有办法在 projet 中引用 Resources.resx 文件以外的文件?含义:文件路径将在我的应用程序中可用,并且当我构建项目时文件将是 "exported";
  3. 如果我的方法不正确,我怎样才能正确地从资源文件向 MailItem 添加附件?

谢谢。

我的猜测是该资源无法作为要附加的项目使用。有没有办法将资源作为图像保存到计算机的某个地方,然后附加您创建的文件?

这样的事情可能会奏效。

 var bmp = new Bitmap(Properties.Resources.myimage);

 Attachment myAttachment = mailItem.Attachments.Add(bmp);

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

  • 生成操作:内容。
  • 复制到输出目录:如果较新则复制。

这样,在构建时,包含我的图像(和我的图像)的文件夹将被复制到构建目录。然后我可以使用他们的亲戚 URL:

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

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