接受电子邮件作为应用程序输入的准则

时间:2009-03-30 19:37:10

标签: email web-applications

许多应用程序具有允许用户响应来自应用程序的通知电子邮件的便利功能。回复被反馈到应用程序中。

例如,如果您正在构建客户支持系统,则该电子邮件可能包含一些令牌,以将响应链接回正确的服务票证。

实施此类系统有哪些指导原则,提示和技巧?有哪些潜在的陷阱需要注意?希望那些已经实现了这样的系统的人可以分享他们的智慧。

8 个答案:

答案 0 :(得分:10)

一些指导方针和注意事项:

地址问题:最好的办法是使用电子邮件(myaddr**+custom**@gmail.com)地址的“+”扩展部分。这使得路由更容易,但最重要的是,更容易跟踪到系统的地址路由。其他技术可能在主题中使用令牌

垃圾邮件:在应用外部进行垃圾处理,并根据标题启用应用过滤器。

排队失败的消息:在大多数情况下,请勿这样做。标准电子邮件行为是尝试最多3天来传递邮件。对于应用程序电子邮件服务器,所有这一切都是创建您很可能永远不会处理的邮件的巨型假脱机文件。如果失败原因超出您的控制范围(例如,服务器已关闭),则仅对队列消息进行排队。

无效的邮件处理:邮件有多种方式无效。有些是库的限制(它无法解析地址,即使它是RFC有效的地址)。其他是因为客户端损坏(例如,省略某些标题周围的引号)。其他可能太大,或者使用未知编码,缺少关键头,有多个值,只应该有一个,违反应用程序特定的某些语义等等,基本上,Java邮件API < em>可能抛出异常是一个错误处理案例必须确定如何正确处理。

错误回复:并非每个错误都值得回应。有些是由于垃圾邮件而生成的,您应该避免将邮件发送回这些地址。其他人来自自动化系统(你自己,一个度假应答者,另一个应用程序邮件系统等),如果你回复,它会给你发送另一条消息,重复这个循环。

特定于客户端的黑客:如上所述,每个客户端都没有什么区别会使代码复杂化。无论何时遍历消息结构,请记住这一点。

发件人,回复和循环:根据您的具体情况,您可能会收到来自以下某些来源的邮件:

  • 真实的人,可能来自外部来源
  • 邮件列表
  • 你自己,或者你自己的一个收件人地址
  • 其他邮件服务器(退回,失败等)
  • 另一个系统中的实体(my-ldap-group@company.com,system-monitor @ localhost)
  • 自动化系统
  • 以上
  • 之一的别名
  • 别名的别名

现在,你的第一直觉可能是“只接受来自正确来源的邮件!”,但这会让你头疼不已,因为人们会将最大的东西发送给应用程序邮件服务器。我发现接受一切并明确拒绝例外更好。

调试:保存您收到的任何邮件标题的副本。无论何时遇到问题,这都会有很大帮助。

- 编辑 -

我买了rossfabricant提到的“构建可扩展网站”这本书。它 - 有一个很好的电子邮件部分。它有两个重点,即处理来自无线运营商的电子邮件和电子邮件身份验证。

答案 1 :(得分:2)

如果有人按下“回复”,您可以设置发送电子邮件的地址,将要放入收件人地址的内容。使其独一无二,您将能够分辨它的来源以及它必须返回的位置。

当谈到在它旁边放一个名字虽然'“这里的东西”' - 把一些东西邀请让他们回复邮件。我见过一个主要的网络应用程序,电子邮件捕获“没有回复”,这使得人们不会实际向其发送任何内容。

答案 2 :(得分:2)

Building Scalable Web sites有一个很好的处理电子邮件的部分。它由Flickr开发人员编写。

alt text
(来源:lsl.com.au

答案 3 :(得分:1)

编辑:我误解了你的问题。

您可以将电子邮件服务器配置为catch-all,并生成唯一的回复地址。例如。 CST-2343434@example.com。

服务器上的轮询过程可以读取收件箱并从收到的电子邮件中解析出相关部分,CS-2343434可能表示客户支持票证号码。 2343434。

我使用JavaMail API实现了类似的功能。

只是一个想法。

答案 4 :(得分:1)

实现这一目标的最佳方法是编写一个窗口服务,其作用类似于邮件客户端[pop3或imap]。此Windows服务应执行由计时器触发的定时操作,该计时器连接到邮件服务器并轮询服务器以查找电子邮件收件箱中可用的任何未读邮件。要检查的电子邮件ID是用户将在其上输入/输入的电子邮件ID。如果Windows服务客户端发现存在任何新邮件,那么它应该下载并过滤电子邮件正文并根据电子邮件中的用户输入进一步推送以进行处理。您可以在同一个Windows服务中托管输入处理,但不建议这样做。 Windows服务可以将输入放在特殊的应用程序目录或数据库中,主应用程序可以从中读取电子邮件中收到的用户输入并根据需要处理它们。

您需要开发一个高性能的TCP / IP客户端。由于性能问题,我建议您不要使用默认的.Net库,而是使用{.3}中的.Net的最佳可用开源TCP / IP实现之一,如XF.Server。我们在我们的应用程序中使用了它,并取得了非常好的结果。

希望这会有所帮助..

答案 5 :(得分:0)

Bose有一个非常棒的系统,他们将队列和票证ID嵌入到电子邮件中。

我的公司在主题行上有传统的Case#,但在创建案例时,需要在主题行上使用特定字符串“New Case”“Tech Support Issue”来通过垃圾邮件过滤器。

如果电子邮件与创建或更新语义不匹配,则自动回复器会向收件人发送一封电子邮件,说明如何正确发送电子邮件,或将其发送到我们的论坛或Web支持站点。

它有助于消除垃圾邮件问题,但仍然可以被仍然严重依赖电子邮件的广泛技术受众访问。

答案 6 :(得分:0)

垃圾邮件将成为一个值得关注的问题。但是,由于您正在启动对话,因此您可以使用您的唯一标识符(我更喜欢使用主题行 - “故障单:无法登录网络... [artf123456]”)来过滤掉垃圾邮件。请务必仔细检查过滤器,因为有些人在回复时会破坏主题。

答案 7 :(得分:0)

电子邮件是糟糕标准和破碎客户的污点。你需要做好准备接受几乎任何东西作为输入。您需要对容忍哪种输入非常宽容。您编程的任何内容都可能很难让您的用户正确使用。考虑要求您在主题行中发出命令的旧邮件列表程序。只有铁杆书呆子才能有效地使用它们。您提到的一些故障单CRM客户端有一些奇怪的要求,例如强制用户在文本中的两个特定文本标记之间进行回复。这种事情让人很困惑。

您需要处理向您发送格式化文本而非纯文本的电子邮件客户端。某些电子邮件客户端仍然无法正确处理HTML( cough GMail),因此您的回复也需要进行适当的设计。通过电子邮件可以通过各种方式“上传”照片,尤其是涉及手机时。您需要实施各种黑客攻击和启发式方法来处理这些情况。

您完全有可能通过您正在使用的电子邮件解析库获得有效但无法使用的电子邮件。无论这个是否足够重要,都将成为一种判断力。

最后,其他人提到使用特定的电子邮件地址来唯一地标识“对话”。这可能是最简单的方法,因为邮件的内容往往无法在往返客户端时存活。但是,要准备好从旧客户那里收到旧ID的邮件,而不是以某种方式打开新票,而是回复旧票。您的应用程序可能需要某种方式将具有旧ID的电子邮件手动或自动推送到新案例中。对于CRM系统,即使您已经向他发送了包含新ID的新电子邮件,用户也很可能会回复旧电子邮件。至于你是否应该使用some.email.address+some.id@yourdomain.com或者只是some.id@yourdomain.com,我会选择后者,因为加号会混淆一些电子邮件客户端。制作你的ID guids或其他东西,并有一些方法来验证它们(如CRC或其他东西),你会得到更少的垃圾。人类应该永远不必输入GUID,只需回复它们即可。缺点是垃圾邮件过滤:用户的计算机可能会将此类电子邮件地址视为垃圾邮件,并且没有一种简单的方法可以将地址列入白名单。

这提醒我:这些天发送电子邮件充满了陷阱。有许多反垃圾邮件技术使您很难向客户发送电子邮件。您需要研究所有这些,并且需要小心并进行一些测试,以确保您可以联系到主要的电子邮件提供商。像Campaign Monitor这样的网站 如果您要发送电子邮件,可以帮助您。