用户回复电子邮件.如何从用户电子邮件中获取数据

本文关键字:用户 电子邮件 数据 获取 回复 | 更新日期: 2023-09-27 18:20:18

我在实现以下场景时遇到了困难。

假设你有一个能够在用户之间发送和接收消息的网站。用户收到一封电子邮件,通知他在软件系统上有一条新消息(无论实现什么)。他可以通过电子邮件发送回复或登录网站并使用网站回复"消息"来回复此消息。

在第一种方法的情况下,如果用户只是回复电子邮件通知,你(作为开发人员)如何知道回复的"消息"(ID)是什么?我想信息应该存储在MIME扩展中。MIME扩展是否转移到消息的回复?如果是,那么解决方案可以是查看用户回复的原始消息通知的数据。有什么想法吗?感谢

用户回复电子邮件.如何从用户电子邮件中获取数据

唯一"可靠"的方法是将信息编码在用户回复的发件人地址中;你也可以把它放在邮件的主题或正文中,并"希望"用户不要篡改它。有一个"回复(邮件id)"的标题,但许多现有的电子邮件客户端没有正确设置标题。

通常的机制是这样的:创建一个eMail别名前缀,并在末尾附加一个消息id代码片段;例如,如果这是一个采购订单确认,您可以创建一个电子邮件别名来处理形式为po-*@example.com的地址,其中*是唯一的消息ID。然后,当您发送消息时,您应该在From:Reply To:的标题中都放入适当的地址。例如:

From: "Purchase Order Confirmation (#1234)" <po-1234@example.com>
To: "John Doe" <jdoe@example.com>
Reply-To: "Purchase Order Confirmation (#1234)" <po-1234@example.com>
Subject: Confirm your order (#1234)

根据您的邮件服务器,您应该能够定义一个"分隔符"字符(通常为-+),用于分割电子邮件地址的"本地部分"(@左侧)的部分;通常还有另一种机制可以将前缀映射到脚本,以处理特定形式的所有地址。脚本接口通常非常像网络上的CGI,发送一些环境变量,并将消息本身输入到标准输入中。如果你的应用程序主要是基于网络的,你可能会发现收集传入的电子邮件正文,并将其POST发送给私人(可能是http://[::1]/getMailReply)处理程序会更"舒适"。这可能有助于您更容易地重用现有代码。

我们在服务器上设置了一个catch-all电子邮件地址,例如catch-all@myserver.com。当我们向用户发送电子邮件时,我们会在发件人地址中对消息id和任何其他可能需要的元信息进行编码。你可以混淆这一点,也可以不混淆,这取决于你的需求。因此,例如,如果用户在系统中有一条新消息,其ID100,那么我们发送给用户的电子邮件的发件人地址将类似于reply-to-message-100@myserver.com。请确保无论您对发件人地址使用何种格式,都不会在邮件服务器上生成真正的电子邮件地址。

因此,当用户响应此消息时,它将被发送到您设置的包罗万象的收件箱。从这里开始,您可以选择如何处理此电子邮件。在过去,我们编写了一个小的定时服务,每隔几分钟运行一次,检查收件箱中是否有新的电子邮件,根据您的喜好进行处理(插入数据库,发送更多电子邮件,等等),并在处理完后删除邮件。这是脆弱的,因为电子邮件客户端发送电子邮件的方式略有不同,而且很难解析各种客户端消息。

我们的第二种方法是与http://postmarkapp.com/-它有一个传入的电子邮件api,应该很快就会公开(我们进入了测试版)。你可以用同样的方式设置所有内容,只需将服务器的catch-all地址转发到你将用postmark设置的邮戳接收地址,然后postmark进行消息处理,并调用一个你也设置好的网络挂钩,对收到的对象执行你喜欢的操作。

我强烈推荐Postmark,但在大多数情况下,即使是朴素的方法也有效。

-M

作为上一个答案的后续,Postmark Inbound现已上线并公开http://postmarkapp.com/inbound对于发送到您的特殊格式入站电子邮件地址的每封电子邮件,您都会收到一个JSON格式的web挂钩API调用,其中包含为您排序的所有电子邮件组件、标题和附件。