【问题标题】:How to know, that email was sent, and attachments can be deleted?怎么知道那封邮件已经发送,附件可以删除?
【发布时间】:2019-03-11 18:18:10
【问题描述】:

我有一个方法,通过确定的路径保存屏幕截图,然后制作电子邮件,并附上屏幕截图。据我了解,发送后 - 正在创建使用附件文件的特殊线程,因此在该线程工作时我无法删除它。所以,我需要知道文件何时可以被删除。

这是我的代码:

-- 配置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));
    }
}

【问题讨论】:

  • 工作完成后在你的帖子中删除?
  • 删除是在关闭应用程序之前实现的。但是如果我发送消息然后很快关闭程序 - “发送线程”仍在使用附件,所以我有一个例外。在删除之前,我需要确切知道文件是否不再使用。 @DenisSchaf
  • 如果是用户相关的问题,比如用户正在关闭应用程序,然后在关闭按钮上,隐藏您的表单/界面并完成发送电子邮件,然后再删除附件并关闭应用程序。
  • 是的,我想隐藏界面,或者等待,或者拒绝关闭应用。但我不知道电子邮件何时真正发送。 @meJustAndrew
  • 你可以看到this thread等待文件不再使用然后删除它。

标签: c# wpf smtpclient


【解决方案1】:

来自documentation

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

因此,在传输消息时,方法会阻塞。所以在方法完成并且你已经处理了消息实例之后,你可以删除文件。

当然,它仍然可以锁定文件。这就是为什么我会说你应该首先处理 SmtpClient 然后尝试删除文件(所以在 using 块之后这样做)。那应该没问题。

【讨论】:

  • 没有帮助。在使用块之后,我有更多代码,它可以工作,但与发送并行。我的意思是 Using 块的结尾并不能保证邮件已经发送,或者文件不再被使用。
  • 是的,确实如此。 using 块的末尾保证邮件已被传递到发送服务器。 .NET 不再使用它。
  • 那么,问题不在于并行发送?我的意思是 smtp 在 Using 块之后没有保存文件,但 Windows 是?
  • 你说的并行发送是什么?您的示例代码中没有显示任何并行性。
  • 这些只是我的想法。现在我尝试在发送后使用块中睡眠(1000),在使用块删除文件之后。但它仍在使用中(
【解决方案2】:

我已经看到文件是由消息对象保存的,而不是由 smtp 对象保存的,所以我也添加了 using block for message。

谢谢大家))

【讨论】:

    猜你喜欢
    • 2013-02-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多