请批评我提出的架构:用于解析传入电子邮件到asp.net数据库的Windows服务

时间:2011-06-09 14:13:50

标签: c# .net asp.net iis windows-services

我有一个现有的asp.net c#应用程序,我想实现一个允许用户通过电子邮件发布内容的功能。用户将向指定地址发送电子邮件,系统将使用电子邮件主题,正文和任何附加图像解析电子邮件并创建数据库条目。我建议的方法是创建一个Windows服务,ping一个支持pop3 / imap的电子邮件提供程序来检索传入的电子邮件。然后,该服务将使用我在此处http://www.lesnikowski.com/mail/找到的现有库来解析电子邮件。用户将根据from字段中的电子邮件地址与asp.net成员资格进行匹配,然后将从该用户的电子邮件内容中插入新记录。最初,Windows服务将在我为此目的设置的单独EC2实例上运行,因为当前主机不允许root访问。但最终我可能会将整个网站迁移到EC2。

在我深入研究之前,我希望得到一些关于我整体方法和架构的反馈。更具体地说:

  • 我上面描述的是你采取的方法吗?
  • 您是否建议实施Web服务来管理Windows服务与asp.net站点数据库之间的交互?或者你会建议直接点击数据库吗?
  • 如果我将Windows服务编程为 每30秒ping一次电子邮件提供商 秒,这会有问题吗?
  • 您是否预见到我所概述的这种方法存在任何安全问题?
  • 可靠性问题(需要24x7服务)?

附加背景--- asp.net网站是一个库存系统,每个条目都有一个名称,描述和可选图像。从电子邮件中,主题将成为名称,正文将成为描述,图像将成为图像。如果您熟悉Posterous博客平台,那么您将对我要完成的工作有一个很好的参考点。

2 个答案:

答案 0 :(得分:3)

  

我上面描述的是您采取的方法吗?

如果您可以设置Exchange服务器或者类似于您收到有关新电子邮件的通知的情况会更好,所以您不必每隔30分钟ping一次,但我从未这样做过,也无法告诉您这甚至是可能的 这种方法本身听起来似乎有道理,因为发送电子邮件非常简单,每个人都知道如何做到这一点。

  

您是否建议实施网络服务来管理互动   在Windows服务和之间   asp.net网站的数据库?或者会   你建议点击数据库   直接?

我会推荐一个额外的抽象层,因为它没有太大的努力并且改进了设计。这会降低性能(不应该 ),因此这取决于您的要求。

  

如果我将Windows服务编程为每30秒对电子邮件提供商执行ping操作   秒,这会有问题吗?

取决于您的电子邮件提供商。通常,如果他们允许的话:不。你应该首先明确地问他们 如果这是你自己的:你很高兴 可能会出现问题但是如果您在一个线程中执行此操作并且您同时多次访问IMAP。你应该尽量避免这种情况。

  

您是否预见到我所概述的这种方法存在任何安全问题?

是。您可以轻松伪造您发送的电子邮件的“发件人”字段。如果电子邮件已知,那么可能会出现问题。您应该绝对添加某种额外的安全性,例如将邮件发送到<SaltedHashThatIsDifferentForEachUser>@example.com。 (Facebook也是这样做的)

  

可靠性问题(需要24x7服务)?

我发现电子邮件提供商的可靠性比服务更多,因为只要保存了电子邮件,您仍然可以在以后解析它们。
你应该调查你的imap的最大大小,以避免被拒绝的邮件(例如,一旦你成功解析它们就删除它们)

答案 1 :(得分:2)

  

您是否建议实施Web服务来管理Windows服务与asp.net站点数据库之间的交互?或者你会建议直接点击数据库吗?

不需要Web服务,只会增加复杂性并在Web服务器上引入另一个攻击目标。让您的Windows服务直接访问您的数据库将更简单,更安全。

  

如果我将Windows服务编程为每隔30秒对电子邮件提供商进行一次ping操作,那会有问题吗?

应该不是问题......电子邮件提供商提供POP3和IMAP,以便外部服务可以使用它们(outlook,thunderbird,iphone),因此他们希望它们能够不断被ping。

  

您是否预见到我所概述的这种方法存在任何安全问题?

正如西蒙所说,电子邮件很容易被伪造,从而带来安全漏洞。这篇link讨论了关于后人的黑客事件以及易用性和安全性之间的权衡。作为CISSP,我倾向于倾向于安全性,尤其是当漏洞非常容易被利用时。

独特的“秘密”电子邮件地址在安全性方面是更好的解决方案。但是,与简化更新过程的目标相比,它需要花费很多时间。它还使您的解决方案更加复杂和昂贵,因为您需要能够为每个用户支持(并以编程方式创建)唯一的地址。

  

可靠性问题(需要24x7服务)?

大多数主流电子邮件提供商都有出色的可用关于此解决方案的可用性(没有预先存在的因素,例如您当前的硬件和托管设施),您需要确保Windows服务编写良好并包含一些“容错”。例如,我过去编写的服务处理由外部依赖(数据库或电子邮件不可用)引起的一些选择错误,这样它就不会崩溃,而只是等到它重新联机。这提供了更好的可用性,因为当依赖性再次正常时,服务已准备就绪,无需手动重启Windows服务。

  

我上面描述的是您采取的方法吗?

由于依赖电子邮件发件人进行身份验证和授权而暴露的安全漏洞,我不会采用这种方法。如果主要目标是简化和简化从移动平台添加新项目,我可能会创建一个“移动友好”网页来实现这一目标。

我刚从西雅图的网页设计大会回来,它主要关注“非PC”平台。在列出了他们为移动行业设计的非常创新的想法和最佳实践之后,我可以看到一个Web应用程序是实现这一目标的绝佳解决方案。