【问题标题】:What methods are there for having .NET code run and handle e-mails as they arrive?有哪些方法可以让 .NET 代码运行并在电子邮件到达时对其进行处理?
【发布时间】:2010-11-17 15:09:09
【问题描述】:

我的任务是创建某种服务,该服务将接收任何发送到电子邮件地址的电子邮件并处理电子邮件的内容(包括二进制附件)。

我拥有对将运行此服务的服务器 (Windows Server 2008) 的完全访问权限,并决定使用 .NET 框架 (3.5) 编写解决方案。

现在我正在考虑我可以通过哪些不同的方式来做到这一点。由于我在以编程方式处理电子邮件方面经验不足,因此我想到的第一个解决方案是创建一个电子邮件客户端,该客户端将定期轮询现有电子邮件服务器以获取传入的电子邮件(使用 POP3 协议) 并处理它们。但是还有其他方法可以做到这一点。

一种方法是使用 IMAP 与邮件服务器保持连接,并在电子邮件到达后立即获取电子邮件(响应速度更快,但我相信 IMAP 协议更难实现。)这里的后续问题是:在哪里可以找到支持 POP3 或 IMAP 协议的可靠电子邮件库?

另一种可能是以某种方式配置电子邮件服务器以将发送到特定地址的电子邮件直接通过管道传输到我的二进制代码(我已经在 Linux 服务器上看到过这种情况。)我不知道该怎么做不过这个。

我能想到的最后一个方法是在它自己的地址上创建一个虚拟电子邮件服务器,在电子邮件到达时直接处理它,但对我来说这似乎是个坏主意。

有人在这方面有经验吗?我想必须为票务支持系统编写电子邮件处理程序并不少见,除此之外我只需要处理附件。

如有任何提示和提示,我将不胜感激。

【问题讨论】:

标签: c# .net email


【解决方案1】:

我过去曾在 c# 中使用 webdav 来定期访问交换服务器并处理电子邮件。

这个方法效果很好,如果需要,我可能会再次使用该方法。

【讨论】:

    【解决方案2】:

    http://www.quiksoft.com/ 中的一些 .net 组件可能有助于满足您的要求。

    应用程序每 x 分钟轮询一次 POP3 邮件服务器,并通过队列中的消息进行处理,并在处理每个消息时将其删除。

    QuikSoft 工具还提供解析电子邮件以从每个消息中获取内容的方法。

    【讨论】:

      【解决方案3】:

      与很多事情一样 - 这取决于。问自己以下问题:

      1. 您的延迟要求是什么?您需要尽快处理传入的消息,还是可以批量处理?如果可以批量处理,那么您需要多久处理一次“收件箱”?

      2. 您的吞吐量要求是什么?我们在这里每分钟谈论多少条消息?消息有多大?如果使用批处理方案,这将影响您对轮询间隔的决定;

      3. 您正在与哪种电子邮件系统集成?如果是 Exchange,哪些编程接口可用于访问邮箱?有趣的是,在最新版本的 Exchange 之前,访问 Exchange 服务器上的邮箱存在问题(需要使用客户端 CDO COM 组件,这并不理想——并且存在安全限制)。

      到目前为止,最简单的方法是使用 POP3 轮询邮箱。但是,如果您需要立即响应传入的消息,那么这不会减少它。

      尽可能避免编写你自己的 SMTP 服务——以前已经做过一千次了,你只是在为自己创造不必要的工作并使自己面临安全威胁。如果您绝对必须立即响应消息,那么宁可设置SendmailPostfix 的实例来生成您编写的进程。

      如果您打算选择 POP3 解决方案(看起来您是),请阅读相关问题“Free POP3 .NET library?”和“Reading Email using POP3 in C#”。

      【讨论】:

      • 没有真正的延迟要求,但最好在它们到达时处理它们以尽可能分散 CPU 使用率。这不会是一个可以获得大量吞吐量的服务器。会有一些使用高峰(这是为了比赛),但在那之后,使用会非常低。每个消息最大为 1 MB(它们包括一个简短的移动视频。)要集成的电子邮件系统尚未确定,但我认为不会是 Exchange。最后,我打算通过尽可能多的代码重用来做到这一点,以便对库的指针表示赞赏。
      【解决方案4】:

      接收邮件并不是最难的部分,解析、提取附件才是。

      如果有人对商业产品感兴趣,请查看 Mail.dll。 它支持您为instant notifications 提到的IDLE 命令。

      Mail.dll 包括 POP3IMAP 客户端和强大的 MIME 解析器:

      using(Imap imap = new Imap())
      {
          imap.Connect("imap.server.com");
          imap.Login("user", "password");
      
          imap.SelectInbox();
          List<long> uidList = imap.SearchFlag(Flag.Unseen);
          foreach (long uid in uidList)
          {
              IMail mail = new MailBuilder()
                  .CreateFromEml(imap.GetMessageByUID(uid));
              Console.WriteLine(mail.Subject);
          }
          imap.Close(true);
      }
      

      请注意,这是我创建的商业产品。

      您可以在http://www.lesnikowski.com/mail下载它

      【讨论】:

        猜你喜欢
        • 2022-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多