用户回复电子邮件。如何从用户电子邮件中获取数据?
Posted
技术标签:
【中文标题】用户回复电子邮件。如何从用户电子邮件中获取数据?【英文标题】:user replying to email messages. How can you get data from users email? 【发布时间】:2012-02-09 20:09:00 【问题描述】:我在实现以下场景时遇到了困难。
假设您有一个能够在用户之间发送和接收消息的网站。 用户收到一封电子邮件,通知他在软件系统上有一条新消息(与实现的内容无关)。他可以通过电子邮件发送回复或登录网站并使用该网站回复“消息”来回复此消息。
在第一种方法的情况下,如果用户只是回复电子邮件通知,您(作为开发人员)如何知道回复的“消息”(ID)是什么? 我认为信息将存储在 MIME 扩展中。 MIME 扩展是否转移到邮件的回复中?如果是,则解决方案可能是查看用户回复的原始消息通知的数据。 有任何想法吗?谢谢
【问题讨论】:
【参考方案1】:唯一“可靠”的方式是将该信息编码到用户回复的发件人地址中;您也可以将其放入消息的主题或正文中,并“希望”用户不要篡改它。有一个“回复 (message-id)”标头,但是很多现有的电子邮件客户端都没有正确设置标头。
通常的机制是这样的:创建一个电子邮件别名前缀,并在末尾附加一个 message-id-code 片段;例如,如果这是为了确认采购订单,您可以创建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,发送一些环境变量并将消息本身通过管道传输到标准输入中。如果您的应用程序主要是基于 Web 的,您可能会发现收集传入的电子邮件正文和POST
将其发送给私人(可能是http://[::1]/getMailReply
)处理程序更“舒适”。这可以帮助您更轻松地重用现有代码。
【讨论】:
【参考方案2】:我们在服务器上设置了catch-all
电子邮件地址 - 例如catch-all@myserver.com
。当我们向用户发送电子邮件时,我们会在发件人地址中对消息 ID 和我们可能需要的任何其他元信息进行编码。您可以混淆或不混淆,这取决于您的需求。因此,例如,如果用户在系统中有一条新消息,其ID
是100
,那么我们发送给用户的电子邮件的发件人地址将类似于reply-to-message-100@myserver.com
。确保您用于发件人地址的任何格式都不会在您的邮件服务器上生成真实的电子邮件地址。
因此,当用户回复此消息时,它将被发送到您设置的全部收件箱。从这里开始,您可以对如何处理这封电子邮件做出多种选择。过去,我们编写了一个小型预定服务,每隔几分钟运行一次,检查收件箱中是否有新电子邮件,根据需要处理它们(插入数据库,发送更多电子邮件,等等),并在完成后删除邮件处理它。这是脆弱的,因为电子邮件客户端发送电子邮件的方式都略有不同,并且很难解析那里的各种客户端消息。
我们完成的第二种方法是与http://postmarkapp.com/ 集成 - 它有一个即将公开的传入电子邮件 API(我们进入了测试版)。您将以相同的方式设置所有内容,仅将服务器的全部地址转发到您将使用 Postmark 设置的邮戳接收地址,然后 Postmark 进行消息处理并调用您也设置的 webhook 来执行您的操作就像收到的对象一样。
我强烈推荐 Postmark,但在大多数情况下,即使是朴素的方法也很有效。
-M
【讨论】:
请注意,一些邮件服务器的语法(通常是 user+mailbox@somewhere)允许用户接收预定发往某个邮箱的邮件。 +1,但在我们第一次实施时在我们的服务器上不可用【参考方案3】:只是上一个答案的后续,Postmark Inbound 现已上线并公开http://postmarkapp.com/inbound 对于发送到您特殊格式的入站电子邮件地址的每封电子邮件,您将收到一个 JSON 格式的 Web 挂钩 API 调用,其中包含所有电子邮件组件,为您排序的标题、附件。
【讨论】:
以上是关于用户回复电子邮件。如何从用户电子邮件中获取数据?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 uid Firebase 数据库中获取电子邮件地址?