2016-06-23 6 views
0

私はそれが簡単な質問だと知っていますが、私は解決策を見つけることができませんでした。私は電子メールから添付ファイルを抽出しようとしています。その後、私はファイルを保存するためにファイルストリームに書き込みます。しかし、私のfileAttachment.Contentは常にnullです。メールアドレスから私のディレクトリの中に保存するには?ストリームを書き込むときにattacmentのコンテンツを常にnullにするのはなぜですか?

public static void ExtractAttachment(string targetDir) 
{ 

    SearchFilter.IsEqualTo ffrom = new SearchFilter.IsEqualTo(EmailMessageSchema.From, "[email protected]"); 
    SearchFilter.ContainsSubstring fsubject = new SearchFilter.ContainsSubstring(ItemSchema.Subject, "yyyyyyyy", ContainmentMode.Substring, ComparisonMode.IgnoreCaseAndNonSpacingCharacters); 
    SearchFilter.IsEqualTo fattach = new SearchFilter.IsEqualTo(EmailMessageSchema.HasAttachments, true); 
    SearchFilter.IsGreaterThanOrEqualTo fdate = new SearchFilter.IsGreaterThanOrEqualTo(ItemSchema.DateTimeReceived, DateTime.Now.Date); 
    SearchFilter.SearchFilterCollection mfilter = new SearchFilter.SearchFilterCollection(LogicalOperator.And, fdate, ffrom, fattach, fsubject); 

    ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2013_SP1); 
    service.Credentials = new WebCredentials(ConfigurationManager.AppSettings["Username"], ConfigurationManager.AppSettings["Password"]); 
    service.Url = new Uri(ConfigurationManager.AppSettings["ExchangeService"]); 
    ItemView view = new ItemView(24); 
    view.PropertySet = new PropertySet(ItemSchema.DateTimeReceived, ItemSchema.Subject, EmailMessageSchema.HasAttachments, EmailMessageSchema.From); 
    view.OrderBy.Add(ItemSchema.DateTimeReceived, SortDirection.Descending); 
    view.Traversal = ItemTraversal.Shallow; 
    FindItemsResults<Item> searchitem = service.FindItems(WellKnownFolderName.Inbox, mfilter, view); 
    if (searchitem.TotalCount > 0) 
    { 
     for (int i = 0; i < searchitem.Items.Count; i++) 
     { 
      Console.WriteLine("loop is working"); 

      searchitem.Items[i].Load(PropertySet.FirstClassProperties); 

      foreach (Attachment part in searchitem.Items[i].Attachments) 
      { 
       if (part is FileAttachment && string.IsNullOrEmpty(part.Name) == false && Path.GetExtension(part.Name).Equals(".txt", StringComparison.InvariantCultureIgnoreCase)) 
       { 

        using (MemoryStream ms = new MemoryStream()) 
        { 
         FileAttachment fileAttachment = part as FileAttachment; 
         fileAttachment.Load(ms); 
         ms.Position = 0; 

         string fname = Path.Combine(targetDir, fileAttachment.Name); 
         string fdir = Path.GetDirectoryName(fname); 
         if (!Directory.Exists(fdir)) Directory.CreateDirectory(fdir); 

         using (FileStream fstream = new FileStream(fname, FileMode.Create)) 
         { 
          fstream.Write(fileAttachment.Content, 0, fileAttachment.Content.Length); 
         } 

        } 
       } 
       break; 
      } 
     } 
    } 

} 

答えて

1

fstream.Write(fileAttachment.Content、0、fileAttachment.Content.Length)を交換してください。 と ms.CopyTo(fstream、0、ms.Length);

これはうまくいくはずです。

fileAttachment.Load(ms) という行のfileAttachment.Contentを読んでいるように見えるので、残りの部分はストリームがeofであるためです。

関連する問題