2017-03-17 1 views
0

MVCを使用するWebプロジェクトでは、コンボボックスから複数の値(都市)を選択し、SQLから引き出されたデータを返す必要があります。データ。その後、MemoryStream経由でbyte []ストリームに送られ、電子メールに添付されます。添付ファイルは ".csv"形式です。私が選択すると、「3」都市と言い、それを私の行動に送ります。最初の添付ファイルだけがデータを持っています。他の2つの添付ファイルが作成されますが、メールを開くと添付ファイルは空白になります。C#のbyte []からMemoryStreamへの複数の添付ファイルの作成

以下

コードの抜粋です:

using (MailMessage message = new MailMessage()) 
    using (SmtpClient client = new SmtpClient()) 
    { 
     client.Host = "smtp.mymailserver.com"; 
     client.Credentials = new System.Net.NetworkCredential("[email protected]", "mypass"); 
     message.From = new MailAddress("[email protected]"); 
     message.To.Add(new MailAddress("[email protected]")); 

     // split up the delimited locations into the list 
     List<String> listStrLineElements = LocationName.Split(',').ToList(); 

     System.IO.MemoryStream ms = new System.IO.MemoryStream(); 

     foreach (var loc in listStrLineElements) 
     { 
      System.IO.StreamWriter writer = new System.IO.StreamWriter(ms); 

      writer.Write(EmailAttachmentAdmin(loc, StartDate, EndDate), 0, EmailAttachmentAdmin(loc, StartDate, EndDate).Length); // this just gets my data as a concatenated string. 

      writer.Flush(); 
      ms.Position = 0; 

      message.Attachments.Add(new Attachment(ms, loc.ToUpper() + "__" + StartDate.Month.ToString() + "-" + StartDate.Year.ToString() + "-TO-" + EndDate.Month.ToString() + "-" + EndDate.Year.ToString() + ".csv", "text/csv")); 
     } 

     message.Subject = "TEST NOTIFICATION: Monthly Maintenance Report Submitted for: " + LocationName; 
     message.IsBodyHtml = true; 
     message.Priority = MailPriority.High; 

     client.Send(message); 

    } 

「EmailAttachmentAdminは、」私は、データ文字列を構築するために呼び出す文字列メソッドです。私はSQLでデータをチェックし、実際にはデータがあります。別のテストでは、添付ファイルが電子メールに添付されているかどうかを確認するために都市または場所を1つだけ選択し、正常に入力されたかどうかを確認することでした。誰かが飛び込み、私が間違っていることを教えてもらえますか?ありがとう。

+0

MemoryStreamオブジェクトは1つしか使用できません。添付ファイルストリームは、電子メールが送信されたときに後で読み込まれます。したがって、添付ファイルごとに個別のストリームオブジェクトが必要です。 –

+0

迅速な対応に感謝します。エンドユーザーがどれだけ多くの値を選択するか分からないので、複数のMemoryStreamを作成するにはどうすればいいですか?選択された場所の「カウント」に基づいてそれらの配列を作成できますか? – Janou

+0

新しいSystem.IO.MemoryStream()ステートメントをループ内で移動するだけです。 –

答えて

0

私はMemoryStreamまたはライターとは何の関係もないように思える私の問題を解決しました。私の問題は、私の "分割"の後の "、"の後の空白を "トリム()"する必要があることでした。だから、私のコードが場所を探していたとき、それを見つけることができなかった。たとえば、「エルパソ」という場所のデータを処理する必要がありましたが、最初の分割後のデータだった場合は「エルパソ」でした。私のswitch/caseステートメントはそのオカレンスを見つけることができなかったので、データを「空白」として処理しました。

関連する問題