2012-02-18 101 views
0

我是新的2 C#和我已经被赋予了一项任务...我必须编写一个C#代码,将发送的电子邮件附件和电子邮件从Outlook 2007的主题下载到本地驱动器或任何指定的位置。我怎么做?我能够获取收件箱中的附件。任何人都可以帮助我获得通过Outlook发送的邮件吗?从Outlook获取附件

private void ThisAddIn_Startup(object sender, System.EventArgs e) 
{ 
    this.Application.NewMail += new 
     Microsoft.Office.Interop.Outlook. 
     ApplicationEvents_11_NewMailEventHandler(ThisApplication_NewMail); 
} 

private void ThisApplication_NewMail() 
{ 
    Outlook.MAPIFolder SentMail = this.Application.ActiveExplorer().Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail); 
    Outlook.Items SentMailItems = SentMail.Items; 
    Outlook.MailItem newEmail = null; 
    //SentMailItems = SentMailItems.Restrict("[Unread] = true"); 
    try 
    { 
     foreach (object collectionItem in SentMailItems) 
     { 
      newEmail = collectionItem as Outlook.MailItem; 
      if (newEmail != null) 
      { 
       if (newEmail.Attachments.Count > 0) 
       { 
        for (int i = 1; i <= newEmail.Attachments.Count; i++) 
        { 
         newEmail.Attachments[i].SaveAsFile(@"C:\TestFileSave\" + newEmail.Attachments[i].FileName); 
        } 
       } 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     string errorInfo = (string)ex.Message 
      .Substring(0, 11); 
     if (errorInfo == "Cannot save") 
     { 
      MessageBox.Show(@"Create Folder C:\TestFileSave"); 
     } 
    } 
} 

由于提前

回答

5

我测试你的代码,Attachment类实例的SaveAsFile()方法抛出:

{System.IO.DirectoryNotFoundException:无法保存附件。 路径不存在。验证路径是否正确。在 Microsoft.Office.Interop.Outlook.Attachment.SaveAsFile(字符串路径) ...}

因此,有必要确保用于保存附件的目录存在。

private void ThisApplication_NewMail() 
{ 
    const string destinationDirectory = @"C:\TestFileSave"; 

    if (!Directory.Exists(destinationDirectory)) 
    { 
     Directory.CreateDirectory(destinationDirectory); 
    } 

    MAPIFolder sentMail = Application.ActiveExplorer().Session.GetDefaultFolder(OlDefaultFolders.olFolderSentMail); 
    Items sentMailItems = sentMail.Items; 
    try 
    { 
     foreach (object collectionItem in sentMailItems) 
     { 
      MailItem newEmail = collectionItem as MailItem; 
      if (newEmail == null) continue; 

      if (newEmail.Attachments.Count > 0) 
      { 
       for (int i = 1; i <= newEmail.Attachments.Count; i++) 
       { 
        string filePath = Path.Combine(destinationDirectory, newEmail.Attachments[i].FileName); 
        newEmail.Attachments[i].SaveAsFile(filePath); 
       } 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex); 
    } 
} 

希望这会有所帮助。

+1

谢谢塞尔:-) – 2012-02-19 06:12:57

+0

,如果我想在收件箱中选择,从电子邮件附件? – SANDEEP 2013-05-16 06:35:23

0

维护一个将存储发件人姓名的列表,然后检查最近邮件发件人在列表中是否包含下载的条件。

private void ThisApplication_NewMail() 
{ 
    const string destinationDirectory = @"C:\TestFileSave"; 
    List<string> senderList = new List<string>(); 
    if (!Directory.Exists(destinationDirectory)) 
    { 
     Directory.CreateDirectory(destinationDirectory); 
    } 

    MAPIFolder sentMail = Application.ActiveExplorer().Session.GetDefaultFolder(OlDefaultFolders.olFolderSentMail); 
    Items sentMailItems = sentMail.Items; 
    try 
    { 
     foreach (object collectionItem in sentMailItems) 
     { 
      MailItem newEmail = collectionItem as MailItem; 
      senderEmailAdd = newEmail.SenderEmailAddress; 
      if (newEmail == null) continue; 

      if (newEmail.Attachments.Count > 0 && senderList.Contains(senderEmailAdd)) 
      { 
       for (int i = 1; i <= newEmail.Attachments.Count; i++) 
       { 
        string filePath = Path.Combine(destinationDirectory, newEmail.Attachments[i].FileName); 
        newEmail.Attachments[i].SaveAsFile(filePath); 
       } 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex); 
    } 
}