C# 如何知道,电子邮件已发送,附件可以删除?

C# 如何知道,电子邮件已发送,附件可以删除?,c#,wpf,smtpclient,C#,Wpf,Smtpclient,我有一个方法,它通过确定的路径保存截图,然后生成电子邮件,将截图附加到其中。据我所知,在发送它之后-正在创建使用附件文件的特殊线程,因此在该线程工作时,我不能删除它。所以,我需要知道文件何时可以删除 这是我的密码: --配置smtp private SmtpClient CreateSMTP() { var smtp = new SmtpClient("gate"); smtp.UseDefaultCredentials = false; smtp.Credentials

我有一个方法,它通过确定的路径保存截图,然后生成电子邮件,将截图附加到其中。据我所知,在发送它之后-正在创建使用附件文件的特殊线程,因此在该线程工作时,我不能删除它。所以,我需要知道文件何时可以删除

这是我的密码:

--配置smtp

private SmtpClient CreateSMTP()
{
    var smtp = new SmtpClient("gate");
    smtp.UseDefaultCredentials = false;
    smtp.Credentials = new NetworkCredential("notifications@****.com", "3eCMCQxFde");
    smtp.Port = 25;
    smtp.EnableSsl = false;

    return smtp;
}
--制造信息

public MailMessage MakeMessage(bool screenshotFlag)
    {
        MailAddress from = new MailAddress("notifications@****.com", Name);
        MailAddress to = new MailAddress("****@****.com");
        MailMessage message = new MailMessage(from, to);

        message.Subject = Subject == string.Empty ? string.Empty : Subject;
        message.Body = MessageText;
        message.Body = GenerateLogAndExceptionInfo(message.Body);
        message.BodyEncoding = Encoding.Unicode;

        message.ReplyTo = new MailAddress(Mail);

        if (screenshotFlag)
        {
            CreateScreenshot();
            message.Attachments.Add(new Attachment(MailHelper.FeedBackScreenShotPath));
        }

        return message;
    }
--发送电子邮件

public void SendMessage()
{
    using (SmtpClient smtp = CreateSMTP())
    {
        smtp.Send(MakeMessage(SendWithScreenshot));
    }
}
从:

这些方法在消息传输时阻塞

因此,当消息被传输时,该方法会阻塞。因此,在完成该方法并释放消息实例后,可以删除该文件


当然,它仍然可以锁定文件。这就是为什么我会说您应该首先处理
SmtpClient
,然后尝试删除该文件(在
使用
块之后执行此操作)。那应该没问题。

我看到文件是由message对象保存的,而不是由smtp对象保存的,所以我也添加了使用block for message


感谢所有人)

在工作完成后在你的线程中删除它?删除是在关闭应用程序之前实现的。但如果我发送消息,然后很快关闭程序-附加的文件仍然被“发送线程”使用,因此我有一个例外。在删除之前,我需要确切地知道文件是否不再使用@DenisChaf如果是与用户相关的问题,如用户正在关闭应用程序,则在“关闭”按钮上,只需隐藏表单/界面并在删除附件和关闭应用程序之前完成发送电子邮件。是的,我想隐藏界面,或等待,或拒绝关闭应用程序。但我不知道电子邮件是否真的在何时发送@Mejustandrewy您可以在文件不再使用后看到等待,然后将其删除。没有帮助。在使用block之后,我有了更多的代码,它可以工作,但与发送并行。我的意思是,使用block的结束并不能保证邮件已经发送,或者文件不再被使用。是的,确实如此。
using
块的结尾保证邮件已发送到发送服务器。NET不再使用它了。那么,问题不在于并行发送吗?我的意思是,smtp在使用block之后并没有保存文件,但Windows是?你说的并行发送是什么?在示例代码中没有显示任何并行性。这些只是我的想法。现在,我已经尝试在发送后使用块睡眠(1000),并在使用块删除文件后睡眠。但它仍在使用中(