请评审我的架构计划:将传入的电子邮件解析为asp.net数据库的Windows服务

4
我有一个现有的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一次电子邮件提供商,这会有问题吗?
  • 您是否预见到此方法所述的任何安全问题?
  • 可靠性方面有什么问题(需要24x7服务)?

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

2个回答

3
我描述的方法是你会采取的方法吗?更好的方式是设置一个Exchange服务器或类似的东西,你可以在那里收到新邮件的通知,这样你就不必每30分钟ping一次了,但我从未以这种方式做过,并且无法告诉你是否可能。这种方法本身听起来很合理,因为发送电子邮件非常容易,每个人都知道如何做。
你是否建议实现Web服务来管理Windows服务和ASP.NET网站数据库之间的交互?还是直接访问数据库?我建议使用额外的抽象层,因为它并不费力,而且可以改进设计。这会降低性能(不应该太多),因此这取决于您的要求。
如果我将Windows服务程序设置为每30秒ping一次电子邮件提供商,这会有问题吗?这取决于您的电子邮件提供商。通常情况下,如果他们允许:否。您应该先询问他们。
如果是你自己的:你可以放心去做。
但是,如果您在线程内执行此操作并同时访问IMAP多次,则可能会出现问题。您应该尽量避免这种情况。
你预见到这种方法我概述中的任何安全问题吗?是的。您可以轻松地伪造发送的电子邮件的“from”字段。如果邮件已知,则可能会出现问题。您应该一定添加某种额外的安全性,例如将邮件发送到<SaltedHashThatIsDifferentForEachUser>@example.com。(Facebook也是这样做的)
那么可靠性问题呢(需要24x7服务)?我看到您的电子邮件提供商的可靠性问题比您的服务更严重,因为只要电子邮件被保存,您仍然可以稍后解析它们。
您应该调查您的imap的最大大小以避免被拒绝的邮件(例如,在成功解析后删除它们)。

关于伪造电子邮件的风险,你提到得很好。这可能会导致问题(尤其是垃圾邮件)。使用盐散列是一种方法,但这样做会使人难以记住电子邮件地址。而且,这是一个问题,因为我们正试图使从移动设备发布变得更容易。我注意到Facebook和Flickr都会自动生成唯一的电子邮件地址,而Posterous只使用post@posterous.com。如果我们想要效仿Posterous的方法,您对处理伪造电子邮件有什么建议? - hughesdan

2
“你会推荐实现一个Web服务来管理Windows服务与ASP.NET网站数据库之间的交互吗?还是直接访问数据库更好?”
没有必要使用Web服务,这只会增加复杂性,并在您的Web服务器上引入另一个攻击目标。直接让您的Windows服务访问数据库将更简单和更安全。
“如果我编写Windows服务每30秒ping一次电子邮件提供商,会有问题吗?”
不应该有问题......电子邮件提供商提供POP3和IMAP,以便外部服务可以使用它们(Outlook、Thunderbird、iPhone),因此它们希望被不断地ping。
“您是否预见到了我概述的任何安全问题?”
正如西蒙所说,电子邮件很容易被伪造,存在安全漏洞。这个链接论述了posterous的黑客事件以及便利性与安全之间的权衡。作为一名CISSP,我倾向于强调安全性,特别是当漏洞非常容易被利用时。
独特的“秘密”电子邮件地址在安全方面是更好的解决方案。然而,它会大大削弱简化更新过程的目标。此外,由于您需要支持(并以编程方式创建)每个用户的唯一地址,因此您的解决方案会变得更加复杂和昂贵。
关于可靠性问题(需要24x7服务),有什么考虑吗?
大多数主流电子邮件提供商都具有出色的可用性。关于此解决方案的可用性(不包括您当前的硬件和托管设施等预先存在的因素),您需要确保Windows服务编写得很好并包含一些“容错”。例如,我过去编写的服务处理了由外部依赖项(数据库或电子邮件不可用)引起的少数选择性错误,以便它不会崩溃,而是等待直到恢复在线状态。这提供了更好的可用性,因为服务在依赖项再次可用时已准备就绪,无需人工重新启动Windows服务。
上述是否是您将采取的方法?
由于依赖电子邮件发送者进行身份验证和授权暴露了安全漏洞,我不会采取这种方法。如果主要目标是简化和优化从移动平台添加新项目,我可能会创建一个“移动友好”网页来实现这一目标。
我刚刚从西雅图的一次网络设计会议回来,重点关注“非PC”平台。在列举了他们针对移动行业设计的非常创新的想法和最佳实践后,我可以看出Web应用程序是实现这个目标的一个很好的解决方案。

谢谢。你和Simon都提供了非常有帮助的答案。我考虑创建一个移动友好的网页,但问题是你不能访问本地照片库(至少在iPhone上不行...没有看过Android)。我想我可以开发一个本地应用程序,但这是一个很大的工作,特别是考虑到需要支持几个操作系统。 - hughesdan
有一些框架,你只需要编写一次应用程序,它就会自动为多个设备创建本地应用程序。 - Simon Woker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接