代码之家  ›  专栏  ›  技术社区  ›  Blixt

有什么方法可以让.NET代码在到达时运行和处理电子邮件?

  •  2
  • Blixt  · 技术社区  · 15 年前

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

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

    现在我在想我可以用不同的方式来做这件事。由于我在以编程方式处理电子邮件方面经验不足,我想到的第一个解决方案是创建一个电子邮件客户端,该客户端将定期轮询现有电子邮件服务器以接收电子邮件(使用POP3协议),并对其进行处理。但还有其他方法可以做到。

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

    另一种可能是以某种方式配置电子邮件服务器,将发送到特定地址的电子邮件直接通过管道发送到我的二进制代码(我在Linux服务器上看到过这种情况)。不过,我不知道如何处理这种情况。

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

    有人在这方面有经验吗?我可以想象,为票据支持系统编写电子邮件处理程序的情况并不少见,除此之外,我所需要的就是处理附件。

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

    4 回复  |  直到 14 年前
        1
  •  2
  •   Community kfsone    7 年前

    就像很多事情一样-这要看情况而定。问自己以下问题:

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

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

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

    到目前为止,最简单的方法是使用pop3对邮箱进行轮询。但是,如果你需要回应 立即 对于一个传入的消息,那么这不会切断它。

    尽可能 避免 编写自己的SMTP服务——以前做过无数次,你只是在为自己创建不必要的工作,让自己暴露在安全威胁之下。如果你 绝对必须 立即响应消息,而不是设置 Sendmail Postfix 生成您编写的进程。

    如果您要使用pop3解决方案(看起来是这样),请阅读相关问题。” Free POP3 .NET library? “和” Reading Email using POP3 in C# “。

        2
  •  0
  •   Bravax    15 年前

    我过去使用WebDAV和C定期访问Exchange服务器并处理电子邮件。

    这已经很好地工作了,如果需要的话,我可能会再次使用这个方法。

        3
  •  0
  •   Jon    15 年前

    来自的一些.NET组件 http://www.quiksoft.com/ 可能对您的要求有所帮助。

    该应用每隔x分钟轮询一个pop3邮件服务器,并通过队列中的消息进行工作,并在处理每个消息时删除它们。

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

        4
  •  0
  •   Pawel Lesnikowski    14 年前

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

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

    mail.dll包括 POP3 , IMAP 客户端和强大的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