以编程方式删除邮件的安全级别 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);
}
}