通过电子邮件创建网络条目

create an web entry via email

许多网络应用程序(asana、basecamp、highrisehq 等)都具有此功能。 例如:如果任何用户为其他用户创建任务,则该任务通知相关用户。

如果任务所有者回复此邮件。重播地址类似如下:

todo-151280554-ed5b3379c735a9673a469b6b@basecamp.com

这是一个虚拟电子邮件地址。当 Web 应用程序 (basecamp) 收到此电子邮件时。任务所有者的电子邮件将对任务发表评论。

我的问题是:Web 应用程序如何创建一个虚拟电子邮件地址并读取该邮箱?

如何,我将在基于 symfony2 的 Web 应用程序上创建类似的功能?

常规方法是将入站电子邮件转发给解析电子邮件并适当更新数据库的程序。您基于 symfony2 的 Web 应用程序在访问时会看到新状态。

大多数 MTA 都可以支持,通常是通过启用子地址和添加帐户。例如,如果您使用 Postfix you could create an account called todo set recipient_delimiter to - as in this recipe 并在 /home/todo/.forward 中写入 |/home/todo/bin/add-todo-from-email。完成后,将邮件发送到 todo-whatever@example.com 或只是 todo@example.com 会使 /home/todo/bin/add-todo-from-email 被执行。

formail/procmail and mailman 等程序是作用于电子邮件的开源程序的示例。如果您 google formail,您会找到一些示例。

虽然解析电子邮件很有趣...

这通常是通过将入站电子邮件传送到您的 PHP 脚本来完成的。如何完成取决于您服务器的 MTA(邮件传输代理),但教程应该适用于所有主要的 MTA。

如果您不想做 运行 MTA 的工作,Mandrill、Sendgrid 和 Postmark 等许多第三方电子邮件提供商将处理入站电子邮件并进行 API 调用收到时发送到您的服务器。我用过 Mandrill,他们的文档在 http://help.mandrill.com/entries/21699367-Inbound-Email-Processing-Overview

您可以通过 Inbound Parse Webhook.

使用 SendGrid 实现此目的

设置后,您域上收到的任何电子邮件,甚至是虚拟地址,都会通过 POST 请求以 JSON 的形式传递给您的应用程序,以及您指定的应用程序内的任何端点,例如:

http://myappliveshere.com/receive

您收到的 JSON 是整个消息的分解 (list of all fields is here),因此您可以获取特定字段。在这种情况下,您将获取 to 字段,因为这将包含您需要的虚拟地址。

然后您可以使用该虚拟地址在您的数据库中查找需要通知的用户。

可以通过多种方式创建虚拟地址,如果您使用模型创建用户,那么您可以在将用户插入数据库之前使用生命周期回调来完成此操作。

您可以使用用户的名字、姓氏和随机数的 MD5 哈希值创建地址,如下所示:

randomNumber = mt_rand(10,100);
virtualAddress = md5(user.firstname+user.lastname+randomNumber);

您会在第一次创建用户记录时将 virtualAddress 插入到您的用户记录中。

正如您从 Basecamp 中看到的那样,他们还为每个虚拟地址添加了一个类型,例如地址中的 todotodo-151280554-ed5b3379c735a9673a469b6b@basecamp.com,您可以在您的应用程序中执行相同的操作帮助分类发送给其他用户的电子邮件通知类型。

如果您分解一下他们是如何做的,那么仅用一个地址就可以做很多事情:

todo-151280554-ed5b3379c735a9673a469b6b@basecamp.com 分解为:

todo = 通知类型

151280554 = 所引用的待办事项的 ID

ed5b3379c735a9673a469b6b = 用户的虚拟地址