【问题标题】:Saving an auto-generated email? [duplicate]保存自动生成的电子邮件? [复制]
【发布时间】:2011-11-30 02:06:14
【问题描述】:

可能重复:
How to save MailMessage object to disk as *.eml or *.msg file

我正在开发一个 C# 程序,该程序会在满足某些条件时向人们发送电子邮件。我希望能够保存电子邮件的副本以进行记录,但无法弄清楚。我发现它没有像message.Save() 这样的内置功能令人惊讶。

我在下面包含了一个非常基本的电子邮件示例:

MailMessage message = new MailMessage("from_email", "to_email");
message.Subject = "Email Alert"; 
message.Body = "This is a test email.";
SmtpClient Smtp = new SmtpClient("smtp server");
Smtp.Send(message);

我想保存一份电子邮件副本作为记录。我并没有真正考虑存储消息的所有方式的选择,对此感到抱歉。我想要一份副本,以防收件人没有收到电子邮件,我可以从存档中转发给他们一份副本。我认为 .msg 会很好用。

另外,我希望能够保存电子邮件,然后在一天结束时发送一批。如果我收到需要添加的更新,我可能不得不对电子邮件添加新条目,这样收件人就不会因多封电子邮件而过载。但是,在某些情况下,当遇到升级级别时,无论一天中的什么时间都会自动发送电子邮件。

【问题讨论】:

  • 保存对您意味着什么?数据库?纯文本文件? XML?云?
  • 如果您已经在批处理/保存到数据库,那么您的问题是什么?您已经“保存电子邮件的副本”。
  • @p.cambell:我希望为无法访问数据库的非程序员进行备份,并在需要时轻松重新发送文件。
  • @Samich:我找了一个类似的问题,但没有找到,看来你找到了一个我错过的问题。很抱歉,我相信我确实得到了一些非常有用的反馈,我感谢大家的帮助。

标签: c#


【解决方案1】:

有几种不同的方法可以“备份”您的电子邮件,以便在必要时重新发送它们:

  • ProcMail. 根据您使用的 MTA,编写 ProcMail recipe 以在您的 MTA 发送邮件时归档邮件会很容易。如果您使用的是 Exchange,那么在服务器端也可以这样做。

  • XML 序列化。 创建MailMessage 类的每个实例后,对其进行序列化并将其存储在文件系统或数据库中。应该很容易在需要时为实例补水。

  • 代收目录。SmtpClient 类可以配置为将消息“发送”到“代收目录”。这通常用于将 MTA(消息传输代理)配置为监视特定目录的配置中。然后,发送邮件包括将包含RFC 2822-compliant message 的文件放入目录中,MTA 将在该目录中收集并在途中发送。如果没有配置 MTA 来监视取件目录,则邮件将被丢弃在那里并坐在那里。

    这是在不涉及真正的 MTA 的情况下测试执行邮件的应用程序的有用方法。人们在收到垃圾信息时往往会变得脾气暴躁。

    这也是一种有用的归档技术:在您的程序中配置 2 个SmtpClient 实例:一个配置为与您的 MTA 通信,另一个配置为将消息放入拾取目录。将您创建的每个 MailMessage 发布到两个实例,您将拥有自己的存档。

这些技术中的任何一种都应该适合您。如果您确实需要重新发送电子邮件,那么 XML 序列化可能是您的最佳选择,因为通过 XML 序列化重新处理对象实例非常简单。

【讨论】:

  • 不知道有没有办法改变输出.eml文件的文件名?我不希望它看起来像下面这样:f80f4695-551c-47d7-8879-40ad89707b23.eml 谢谢!
  • 我对此表示怀疑。如果您使用 Reflector 在 SmtpClient 的内脏中进行挖掘,我怀疑您会发现它在 temp 目录中创建文件,然后在写入和关闭后将其移动到pickup 目录。
【解决方案2】:

为什么不在发送电子邮件之前将数据写入数据库表?然后,您就有了发送电子邮件的日志。

【讨论】:

  • 我计划将数据存储在数据库中,然后再通过电子邮件发送。我想要一个备份,以便在需要时重新发送。
  • 我最近设置了一个 Web 应用程序来执行此操作,因此用户可以检查自动系统电子邮件是否按预期发送。它工作得很好。如果您在电子邮件周围捕获异常,您可以在数据库中设置一个标志,如果没有发生异常,则更新该标志。然后,如果设置了标志,则有一个过程以每隔一段时间重新发送电子邮件。
【解决方案3】:

好吧,您并不太具体地说明您要查找的内容,所以这里有几个选项:

  1. 您自己密件抄送。这将(私下)向您自己发送一份电子邮件副本。
  2. 如果要保存到文件,请自行执行保存。这并不难。实际上,您要做的就是保存一些文本。我们可以这样实现:

    private void SaveEmailToDisk(MailMessage message, string saveTo)
    {
        var builder = new StringBuilder();
        builder.AppendFormat("To: {0}\n", String.Join("; ", message.To.Select(m => m.Address).ToArray()));
        builder.AppendFormat("From: {0}\n",message.From.Address);
        builder.AppendFormat("Subject: {0}", message.Subject);
        builder.AppendFormat("Body: {0}", message.Body);
        File.WriteAllText(saveTo, builder.ToString());
    }
    

当然,您可以根据自己的需要对其进行调整。

【讨论】:

    【解决方案4】:

    使用

             MailAddress bcc = new MailAddress("youremail@domain.com");
             message.Bcc.Add(bcc);
    

    您将获得消息的副本。

    【讨论】:

      【解决方案5】:

      这里要问的重要问题是:保存到哪里?

      这就是为什么没有内置的Save() 方法。电子邮件通常不是很容易保存到文件系统的东西(这并不是说它们不能)。但是有很多信息不是简单存储的,例如收件人/发件人地址、主题行、不同部分(即 MIME 替代部分、附件)。

      【讨论】:

        【解决方案6】:

        为什么不将电子邮件密送至管理员帐户?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多