【问题标题】:C# - Trouble adding attachments to outlook email using different buttonsC# - 使用不同按钮将附件添加到 Outlook 电子邮件时出现问题
【发布时间】:2015-05-21 15:16:16
【问题描述】:

我正在制作一个简单的 Outlook 草稿生成器。它工作正常,但我试图通过浏览按钮添加附件,但我无法弄清楚。我需要一个 OpenFileDialog 对象来使用 Attachments.Add 方法将其添加到电子邮件中,但是我丢失了对 OpenFileDialog 对象的引用,因为它只存在于 AddAttachment() 函数中。

OpenFileDialog attachment = new OpenFileDialog();

        attachment.Title = "Select files to attach";
        attachment.ShowDialog();

            if (attachment.ShowDialog() == DialogResult.OK)
        {
            mail.Attachments.Add(attachment.FileName, Outlook.OlAttachmentType.olByValue, 1, attachment.FileName);
        }

这可行,但它与我的 CreateMailItem() 函数在同一个函数中,这意味着它将始终打开文件对话框,您是否单击了浏览按钮。

 private void CreateMailItem()
    {
        Microsoft.Office.Interop.Outlook.Application app = new Microsoft.Office.Interop.Outlook.Application();
        Microsoft.Office.Interop.Outlook.MailItem mail = app.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem);

        mail.Subject = "";
        mail.To = "";
        mail.CC = "";
        mail.Body = "";
        mail.Importance = Microsoft.Office.Interop.Outlook.OlImportance.olImportanceNormal;
        mail.Display(false);

这个函数后面是 OpenFileDialog 部分。 我想将 OpenFileDialog 部分添加到按钮,然后将 OpenFileDialog 对象实例 FileName 传递给 mail.Attachment.Add() 方法,但邮件对象仅存在于 CreateMailItem() 方法中。毕竟,我想使用 CreateMailItem() 方法生成带有附件的电子邮件草稿。有什么建议吗?

提前致谢!

【问题讨论】:

    标签: c# outlook attachment


    【解决方案1】:

    看来您只需要在全局范围内声明OpenFileDialog 类的实例,并检查FileName 属性是否已初始化。

    或者您可以简单地将 MailItem 类的实例传递给 AddAttachment 方法:

    public void AddAttachment(MailItem mail)
    {
        OpenFileDialog attachment = new OpenFileDialog();
    
        attachment.Title = "Select files to attach";
        attachment.ShowDialog();
    
            if (attachment.ShowDialog() == DialogResult.OK)
        {
            mail.Attachments.Add(attachment.FileName, Outlook.OlAttachmentType.olByValue, 1, attachment.FileName);
        }
     }
    
     private void CreateMailItem()
     {
        Microsoft.Office.Interop.Outlook.Application app = new Microsoft.Office.Interop.Outlook.Application();
        Microsoft.Office.Interop.Outlook.MailItem mail = app.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem);
    
        mail.Subject = "";
        mail.To = "";
        mail.CC = "";
        mail.Body = "";
        mail.Importance = Microsoft.Office.Interop.Outlook.OlImportance.olImportanceNormal;
    
        AddAttachment(mail);
    
        mail.Display(false);
     } 
    

    最后,不要在单行代码中使用多个点。我总是建议打破属性和方法调用链并将它们声明在单独的行上。它允许立即释放底层的 COM 对象。使用完后,使用System.Runtime.InteropServices.Marshal.ReleaseComObject 释放 Outlook 对象。然后在 Visual Basic 中将变量设置为 Nothing(在 C# 中为 null)以释放对对象的引用。在 MSDN 中的 Systematically Releasing Objects 文章中阅读更多相关信息。

    【讨论】:

    • 我之前试过这样做,问题是它在 CreateMailItem() 方法中调用了 AddAttachment() 方法,所以它总是会弹出 OpenFileDialog,而我实际上只希望它弹出当我点击浏览按钮时。
    • 您需要将所选文件附加到多封电子邮件吗?
    • 不,我正在创建这封电子邮件。我只需要一个浏览按钮功能来记住我要添加到电子邮件中的文件,然后在单击“生成电子邮件按钮”时添加它们。
    • 我的表单非常基本:它有一些文本字段被传递给 MailItem 对象属性(CC、Subject 等)。然后,我有一个浏览按钮来添加附件,然后我有一个“生成电子邮件”按钮。正确的顺序是单击浏览,设置要添加的附件,然后单击“生成电子邮件”按钮,这将创建我的邮件对象。问题是:我的 addAttachment() 方法(在我的浏览按钮中)中不存在 Mail 对象,我遇到了麻烦。希望现在更清楚了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    • 2016-05-15
    • 1970-01-01
    相关资源
    最近更新 更多