以编程方式删除邮件的安全级别 2 附件,并将它们保存到磁盘中

此代码示例展示了如何删除电子邮件的安全级别 2 附件,并将它们保存到磁盘中以供打开。

示例

注意

下面的代码示例摘录自 Microsoft Office Outlook 2007 应用程序编程

Outlook 保护用户免遭恶意代码的危害,这些代码通过具有特定文件扩展名(如 .exe 或 .bat)的电子邮件附件进行传输。 这些特定附件默认会被拦截,并被标识为级别 1 附件。 级别 2 附件包含恶意代码的可能性较小,但用户无法直接从电子邮件中打开级别 2 附件。 必须先将级别 2 附件保存到磁盘中。

使用 Attachment 对象的 SaveAsFile(String) 方法,可以将附件保存到磁盘中。 在下面的代码示例中,RemoveAttachmentsAndSaveToDisk 先从文件夹内的邮件项中删除所有大于指定大小的级别 2 附件。 具体是通过枚举 Attachments 集合中每个 Attachment 对象的 Type 属性,并删除等于 olByValue 的附件。 然后,RemoveAttachmentsAndSaveToDisk 使用 SaveAsFile 方法保存已删除的附件。

注意

Outlook 中的集合是线性的。 使用 Index 运算符引用 Attachments[1] 至 Attachments[n],其中 n 表示 Count 属性的值。

不能使用 foreach 语句来移除集合中的项目。 而是应使用 Index 运算符来获取集合中的第一个项目,并删除该项目。 然后使用 while 语句来确定您何时删除了集合中适当数目的项目。 这将确保您循环访问了集合中正确数目的项目。

如果使用 Visual Studio 测试此代码示例,必须先添加对 Microsoft Outlook 15.0 对象库组件的引用,并在导入 Microsoft.Office.Interop.Outlook 命名空间时指定 Outlook 变量。 不得将 using 语句直接添加到此代码示例中的函数前面,这个语句必须后跟公共类声明。 下面的代码行演示了如何在 C# 中执行导入和分配。

using Outlook = Microsoft.Office.Interop.Outlook;
private void RemoveAttachmentsAndSaveToDisk(string path,
    Outlook.Folder folder, int size)
{
    Outlook.Items attachItems;
    Outlook.Attachment attachment;
    Outlook.Attachments attachments;
    int byValueCount;
    int removeCount;
    bool saveMessage;
    try
    {
        // The restriction will find all items that
        // have attachments and MessageClass = IPM.Note.
        string filter = "@SQL=" + "\""
            + "urn:schemas:httpmail:hasattachment"
            + "\"" + " = True" + " AND " + "\""
            + "http://schemas.microsoft.com/mapi/proptag/0x001A001E"
            + "\"" + " = 'IPM.Note'";
        attachItems = folder.Items.Restrict(filter);
        foreach (Outlook.MailItem mail in attachItems)
        {
            saveMessage = false;
            byValueCount = 0;
            attachments = mail.Attachments;
            // Obtain the count of ByValue attachments.
            foreach (Outlook.Attachment attach in attachments)
            {
                if (attach.Size > size
                    & attach.Type ==
                    Outlook.OlAttachmentType.olByValue)
                {
                    byValueCount = byValueCount + 1;
                }
            }
            if (byValueCount > 0)
            {
                // removeCount is number of attachments to remove.
                removeCount = attachments.Count - byValueCount;
                while (mail.Attachments.Count != removeCount)
                {
                    // Use indexer to obtain 
                    // first attachment in collection.
                    attachment = mail.Attachments[1];
                    // You can refine this code to save 
                    // separate copies of attachments 
                    // with the same name.
                    attachment.SaveAsFile(path + @"\"
                        + attachment.FileName);
                    attachment.Delete();
                    if (saveMessage != true)
                    {
                        saveMessage = true;
                    }
                }
                if (saveMessage)
                {
                    mail.Save();
                }
            }
        }
    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex.Message);
    }
}

另请参阅