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

时间:2017-10-20 22:51:49

标签: c# email outlook interop attachment

我正在尝试将文件附加到将在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:'找不到成员。 (HRESULT异常:0x80020003(DISP_E_MEMBERNOTFOUND))'

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

  

类型:System.Object
  附件的来源。这可以是文件(由具有文件名的完整文件系统路径表示)或构成附件的Outlook项目。

根据我的理解,问题是我只能提供文件名以便为Outlook邮件添加附件。另一种选择是创建一个Outlook附件,但如果我理解它是不可能的。这样做的唯一方法是...添加文件mailItem的附件 所以我的问题如下:

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

2 个答案:

答案 0 :(得分:1)

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

  • 构建操作:内容。
  • 复制到输出目录:如果更新则复制。 build options

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

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

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

答案 1 :(得分:0)

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

这样的事情可能有用。

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

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