我在实施以下方案时遇到困难。
假设您有一个能够在用户之间发送和接收消息的网站。 用户收到一封电子邮件,通知他在软件系统上有新消息(与其实现的内容无关)。他可以通过电子邮件发送回复或登录网站并使用该网站回复“消息”来回复此消息。
如果第一种方法是用户只是回复电子邮件通知,您(作为开发人员)如何知道回复的“消息”(ID)? 我认为信息将存储在MIME扩展中。 MIME扩展是否转移到邮件的回复?如果是,则解决方案可以是查看用户回复的原始消息通知的数据。 有任何想法吗?谢谢
答案 0 :(得分:3)
唯一“可靠”的方法是在用户回复的发件人地址中对该信息进行编码;你也可以将它放入信息的主题或正文中,并“希望”用户不会篡改它。有一个“回复(message-id)”标题,但很多现有的eMail客户端没有正确设置标题。
通常的机制是这样的:创建一个eMail别名前缀,并在末尾附加一个message-id-code片段;例如,如果这是针对采购订单确认的,则可以创建处理po-*@example.com
形式的地址的eMail别名,其中*
是唯一的消息ID。然后,当您发送消息时,您会在From:
和Reply To:
标头中放置相应的地址。 EG:
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)
根据您的邮件服务器,您应该能够定义用于拆分“本地部分”部分的“分隔符”字符(通常为-
或+
)(左侧) @
)电子邮件地址;通常会有另一种机制将前缀映射到脚本以处理某个表单的所有地址。脚本界面通常非常类似于Web上的CGI,发送一些环境变量并在标准输入上管道消息本身。如果您的应用主要是基于网络的,那么您可能会发现收集传入的电子邮件正文更加“舒适”,并且POST
它可以更新为私有(可能是http://[::1]/getMailReply
)处理程序。这可以帮助您更轻松地重用现有代码。
答案 1 :(得分:1)
我们在服务器上设置了catch-all
电子邮件地址 - 例如catch-all@myserver.com
。当我们向用户发送电子邮件时,我们会对来自地址的消息ID和我们可能需要的任何其他元信息进行编码。根据您的需求,您可以混淆或不混淆。因此,例如,如果用户在ID
为100
的系统中有新消息,则我们发送给用户的电子邮件的发件人地址将类似于reply-to-message-100@myserver.com
。确保您用于发件人地址的任何格式都不会在您的邮件服务器上生成真实的电子邮件地址。
因此,当用户回复此消息时,它将被发送到您设置的全部收件箱。从这里开始,您可以选择多种方式处理此电子邮件。在过去,我们写了一个小的预定服务,每隔几分钟运行一次并检查此收件箱中的新电子邮件,按照您的喜好处理它们(插入数据库,发送更多电子邮件,等等),并在完成后删除该消息处理它。这很脆弱,因为电子邮件客户端发送电子邮件的方式略有不同,因此很难解析各种客户端消息。
我们做到的第二种方式是与http://postmarkapp.com/集成 - 它有一个即将上线的传入电子邮件API(我们加入了测试版)。您只需将服务器的全部地址转发到您使用Postmark设置的邮戳传入地址,然后Postmark执行邮件处理并调用webhook,您也设置为执行以下操作喜欢收到的对象。
我强烈推荐Postmark,但在大多数情况下,即使是朴素的方法也能有效地发挥作用。
-M
答案 2 :(得分:0)
只需对上一个答案进行跟进,Postmark Inbound现已上线和公开http://postmarkapp.com/inbound对于发送到您特殊格式的入站电子邮件地址的每封电子邮件,您将收到一封带有所有电子邮件的JSON格式的Web hook API调用组件,标题,附件为您排序。