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

本文关键字:电子邮件 asp 服务 windows 数据库 net 体系结构 用于 | 更新日期: 2023-09-27 17:58:42

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

在我深入研究之前,我想从你们那里得到一些关于我的整体方法和架构的反馈。更具体地说:

  • 我上面描述的是你会采取的方法吗
  • 你会建议实现一个web服务来管理windows服务和asp.net网站数据库之间的交互吗?还是建议直接访问数据库
  • 如果我将windows服务编程为每30次ping电子邮件提供商秒,这会有问题吗
  • 你预见到我所概述的这种方法会有任何安全问题吗
  • 可靠性问题(需要全天候服务)如何处理

附加背景——asp.net网站是一个库存系统,每个条目都有名称、描述和可选图像。从电子邮件中,主题将变成名称,身体将变成描述,图像就是图像。如果你熟悉Posterous博客平台,你会对我正在努力实现的目标有一个很好的参考点。

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

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

如果你可以设置一个Exchange服务器或类似的东西,在那里你可以收到关于新电子邮件的通知,这样你就不必每30分钟ping一次,但我从来没有这样做过,也不能告诉你这是否可能
这种方法本身听起来很合理,因为发送电子邮件真的很容易,每个人都知道如何做到这一点。

你是否建议实现一个web服务来管理交互在windows服务和asp.net网站的数据库?或者建议您访问数据库直接地

我建议使用一个额外的抽象层,因为它不需要花费太多精力,而且可以改进设计。这会降低性能(不应该是那么多),所以这取决于您的需求。

如果我将windows服务编程为每30次ping电子邮件提供商秒,这会有问题吗?

取决于您的电子邮件提供商。通常情况下,如果他们允许:不。你应该先问他们
如果是你自己的:你可以走了
但是,如果您在线程内执行此操作,并且同时多次访问IMAP,则可能会出现问题。你应该尽量避免这种情况。

你预见到我所概述的这种方法会有任何安全问题吗?

是的。你可以很容易地伪造你发送的电子邮件的"发件人"字段。如果电子邮件是已知的,那么可能会出现问题。您应该明确添加某种额外的安全性,比如将邮件发送到<SaltedHashThatIsDifferentForEachUser>@example.com。(例如,Facebook也这样做)

可靠性问题(需要全天候服务)如何处理?

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

你会建议实现一个web服务来管理windows服务和asp.net网站数据库之间的交互吗?还是建议直接访问数据库?

没有必要有一个web服务,它只会增加复杂性,并在您的web服务器上引入另一个攻击目标。让你的windows服务直接访问你的数据库会更简单、更安全。

如果我将windows服务编程为每30秒ping一次电子邮件提供商,那会有问题吗?

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

你预见到我所概述的这种方法会有任何安全问题吗?

正如Simon所说,电子邮件很容易被伪造,从而提供了一个安全漏洞。这个链接讨论了posterious上的一个黑客事件以及易用性和安全性之间的权衡。作为一名CISSP,我倾向于安全性,尤其是当漏洞很容易被利用时。

在安全性方面,唯一的"秘密"电子邮件地址是一个更好的解决方案。然而,这会大大偏离简化更新过程的目标。它还使您的解决方案更加复杂和昂贵,因为您需要能够支持(并以编程方式创建)每个用户的唯一地址。

可靠性问题(需要全天候服务)如何处理?

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

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

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

我刚从西雅图的一个网页设计会议回来,会议主要集中在"非pc"平台上。在列出了他们为移动行业设计的非常创新的想法和最佳实践之后,我可以看到网络应用程序是实现这一目标的一个很好的解决方案。