15

asp.netでメールを送信するためにSystem.Net.Mailを使用しています。添付ファイルとして送信した後に添付ファイルを削除する方法..File.Deleteメソッドを使用しようとしました..しかし、このエラーが発生します..別のプロセスによって使用されているため、プロセスはファイルpath \fun.jpg'にアクセスできません。ありがとうございました

4

5 に答える 5

27

使い終わったら、MailMessageを破棄します。添付ファイルとして追加したファイルは、追加するまでロックされたままです。

var filePath = "C:\\path\\to\\file.txt";
var smtpClient = new SmtpClient("mailhost");
using (var message = new MailMessage())
{
    message.To.Add("to@domain.com");
    message.From = new MailAddress("from@domain.com");
    message.Subject = "Test";
    message.SubjectEncoding = Encoding.UTF8;
    message.Body = "Test " + DateTime.Now;
    message.Attachments.Add(new Attachment(filePath));
}
if (File.Exists(filePath)) File.Delete(filePath);
Console.WriteLine(File.Exists(filePath));

出力:False

メッセージを破棄した後もファイルをロックしているものがある場合は、ファイルに別のロックがある可能性がありますが、コードがないと、私たちはあなたを助けることができないと思います。

于 2010-05-18T12:41:12.330 に答える
1

メール送信後は添付ファイルを削除できません。送信前は削除できます。

エラーが言っていることは、あなたが言及したパスは他のプロセスを使用しているということです。

MailMessage Message = new MailMessage();

Message.Subject = "Attachment Test";
Message.Body = "Check out the attachment!";
Message.To.Add("webmaster@15Seconds.com");
Message.From = "someone@somedomain.com";

Message.Attachments.Add(new Attachment(memorystream, "test.txt", MediaTypeNames.Application.Text));

MemoryStreamから添付ファイルを作成し、添付ファイルに任意の名前を付ける必要があることに注意してください。2番目のパラメーターの添付ファイルの名前は、ローカルシステムのハードドライブ上の名前ではなく、電子メール内のファイルの名前です。実際、アタッチメントがローカルハードドライブに送られることはありません。3番目のパラメーターは、添付ファイルのMimeタイプです。この場合、これはテキストです。

編集:use Dispose() the mail

于 2010-05-18T12:23:06.257 に答える
0

MailMessageクラスを拡張することは、これを解決し、この問題に再び遭遇する可能性を減らすための良い方法です...

class MyMailMessage : MailMessage, IDisposable
{
    private List<string> _tempFiles = new List<string>();

    public void Attach(string filename)
    {
        base.Attachments.Add(new Attachment(filename));
        this._tempFiles.add(filename);
    }

    new public void Dispose()
    {
        base.Dispose();
        this._tempFiles.Foreach(x => File.Delete(x));
    }
}

...そして'using'コンストラクト(とにかく使用する必要があります)で使用することを忘れないでください...

using(SmtpClient client = GetMySmtpClient())
using(MyMailMessage msd = new MyMailMessage())
{
    msg.Attach(filename);
    client.send(msg);
}
于 2013-07-09T15:54:44.637 に答える
0

メールにたくさんの添付ファイルがある場合

List<Attachments> lstAtt = new List<Attachments>();
Attachment att = new Attachment(file);
lstAtt.Add(att);

//finally
foreach(var a in lstAtt)
{
    a.Dispose();
}

//delete file
于 2015-02-05T12:52:49.300 に答える
-1

ファイルを削除する前に、メッセージオブジェクトを破棄する必要があります。例えば:

    Dim message As New MailMessage
    message.From = New MailAddress(fromEmail, fromName)
    message.Subject = subject
    message.CC.Add(toCCEmail)
    message.Bcc.Add(toBCCEmail)
    Dim attach As Attachment = New Attachment(attachmentPath)
    message.Attachments.Add(attach)
    message.IsBodyHtml = True
    message.Body = body
    mailClient.Send(message)

    message.Dispose()   'Add this line to dispose the message!
于 2014-09-10T19:41:56.770 に答える