MailKitでメールを送信し、その後ローカルにある添付ファイルを削除する処理があります。
MailKitでの送信時の処理
↓
clsSendMail.cs
C#
1public bool SendMail() 2{ 3 4MimeKit.MimeMessage message = new MimeKit.MimeMessage(); 5 6//送付先の設定 7message.From.Add(new MimeKit.MailboxAddress("送信者名", "送信者アドレス")); 8message.To.Add(new MimeKit.MailboxAddress("宛先名", "宛先アドレス")); 9message.Subject = "件名"; 10 11string strText = "本文"; 12var textPart = new MimeKit.TextPart(MimeKit.Text.TextFormat.Plain); 13textPart.Text = strText; 14 15//添付ファイルを取得 16string FolderPath = "添付するファイルの保存ディレクトリ"; 17string FilePath = string.Empty; 18 19DirectoryInfo di = new DirectoryInfo(FolderPath); 20IEnumerable<DirectoryInfo> subFolders = di.EnumerateDirectories("*", SearchOption.AllDirectories); 21 22foreach (DirectoryInfo FolderName in subFolders) 23{ 24 if (cc.LeftByte(FolderName.Name, 3) == "宛先コード") 25 { 26 FilePath = FolderPath + FolderName + @"\"; 27 break; 28 } 29} 30 31string[] FileNames = Directory.GetFiles(FilePath, "*", SearchOption.TopDirectoryOnly); 32string[] Name = new string[9] { "", "", "", "", "", "", "", "", "" }; 33int intCnt = 0; 34foreach (string FileName in FileNames) 35{ 36 Name[intCnt] = cc.NullChecks(FileName); //宛先のフォルダ内にあるファイルを全て取得 37 intCnt++; //取得したファイルの数をカウント 38} 39 40//ファイルを添付(最大9個まで) 41var attachment1 = new MimeKit.MimePart(); 42var attachment2 = new MimeKit.MimePart(); 43var attachment3 = new MimeKit.MimePart(); 44var attachment4 = new MimeKit.MimePart(); 45var attachment5 = new MimeKit.MimePart(); 46var attachment6 = new MimeKit.MimePart(); 47var attachment7 = new MimeKit.MimePart(); 48var attachment8 = new MimeKit.MimePart(); 49var attachment9 = new MimeKit.MimePart(); 50 51MimeKit.MimePart[] attachments = new MimeKit.MimePart[9] 52 { attachment1,attachment2,attachment3,attachment4,attachment5, 53 attachment6,attachment7,attachment8,attachment9}; 54 55//ファイルの件数分、添付ファイルのpartを作成 56for (int i = 0; i < Name.Length; i++) 57{ 58 if (Name[i] != "") 59 { 60 attachments[i] = new MimeKit.MimePart() 61 { 62 Content = new MimeKit.MimeContent(File.OpenRead(Name[i])), 63 ContentDisposition = new MimeKit.ContentDisposition(), 64 ContentTransferEncoding = MimeKit.ContentEncoding.Base64, 65 FileName = Path.GetFileName(Name[i]) 66 }; 67 } 68} 69 70var multiPart = new MimeKit.Multipart("mixed"); 71multiPart.Add(textPart); 72for (int i = 0; i < intCnt; i++) 73{ 74 multiPart.Add(attachments[i]); 75} 76 77//MimeMessageを完成させる 78message.Body = multiPart; 79 80 //SMTPサーバーに接続してメールを送信する 81 using (var client = new MailKit.Net.Smtp.SmtpClient()) 82{ 83 try 84 { 85 client.Connect(SmtpServer, SmtpPort); 86 Console.WriteLine("接続完了"); 87 88 client.Authenticate(MailAddress, Password); 89 Console.WriteLine("認証完了"); 90 91 client.Send(message); 92 Console.WriteLine("送信完了"); 93 94 client.Disconnect(true); 95 Console.WriteLine("切断"); 96 } 97 catch (Exception ex) 98 { 99 errMessage = ex.ToString(); 100 } 101} 102 103if (errMessage != "") { return false; } 104return true; 105}
その後、ファイルを含むフォルダ削除の処理
Form1.cs
C#
1 private bool DirectoryDelete(string Path) 2 try 3 { 4 DirectoryInfo target = new DirectoryInfo(Path); 5 foreach (DirectoryInfo dir in target.GetDirectories()) 6 { 7 dir.Delete(true); ---☆ 8 } 9 return true; 10 } 11 catch(Exception ex) 12 { 13 errMessage = "ローカルの送信用フォルダ削除に失敗しました。"; 14 return false; 15 } 16 }
☆の処理で
System.IO.IOException: 別のプロセスで使用されているため、プロセスはファイル '〇〇〇.pdf' にアクセスできません。
というエラーが発生します。
メール送信先を複数選択することができ、その場合は全てにメール送信をした後にローカルのファイルをまとめて削除しています。
添付ファイル、添付ファイルの保存フォルダは宛先ごとにそれぞれ別で存在しています。
フォルダ1\001_A社\A社.pdf
フォルダ1\002_B社\B社.pdf
フォルダ1\003_C社\C社.pdf
といった感じです。
1か所しか送らないと、その送信先のファイルで削除時にエラーになります。
複数に送る場合、
001_A社
002_B社
003_C社
にコード順に送った場合、
最後に送信した003_C社のファイルだけ削除時にエラーになるようです。
となると添付ファイルのpartが追加してあるmessageの解放に問題があるのかと思うのですが、
Disposeメソッドが無くどうしたら良いのかわかりません。
何かわかる方がいらっしゃればご教示をお願いします。
回答1件
あなたの回答
tips
プレビュー