我正在尝试做 craigslist 的匿名电子邮件所做的事情,但使用 Rails,而且价格也便宜。对我来说,能够向电子邮件添加标头非常重要,这就是基本电子邮件转发不起作用的原因。
我想到的一种方法是使用 SMTP 服务器,每当我通过 POP/IMAP 阅读电子邮件时,我都会向电子邮件的真正收件人发送一封电子邮件,并使用正确的发件人地址并添加标题。这可行,但 SMTP 服务器相对昂贵。
另一种方法是转发/重定向电子邮件,但在中间添加标头。但我找不到任何服务或宝石来做到这一点。
请不要只说“电子邮件管道”,因为这实际上意味着将电子邮件提供给您的 Rails 程序,收到电子邮件后您会做什么?你实际上如何转发它。
有任何想法吗?
您需要一个电子邮件地址,该地址使用具有系统管理员控制的 MX 服务器的域。这可能是您的主域的子域。然后你要做的就是配置 MTA 软件(Exim、Postfix...希望不是 qMail!)以将该电子邮件传送到 Rails:
http://guides.rubyonrails.org/action_mailer_basics.html#receiving-emails
如果 MTA 没有安装在与 Rails 应用程序本身相同的服务器上,则您必须将电子邮件通过管道传输到一个临时的转发器脚本,该脚本会执行将电子邮件发布到您的应用程序的过程,然后您可以手动在其中执行一些操作将其传递给您的邮寄者。
在您的邮件程序中,您可以访问所有标头、正文、附件等。只要您在主题或回复地址中放置一些唯一标识符,您就可以决定实例化哪个邮件程序以将邮件转发到其邮件程序上。预期收件人。
我们还没有这样做,但出于同样的原因我们将会这样做。然而,如果您不熟悉 MTA 的配置,这可能有点难以理解。您有可以完成此任务的系统管理员吗?
在代码级别,我会这样做:
-
用户 A (id = 1234) 向用户 B (id = 5678) 发送电子邮件
-
从您拥有的任何您想要的地址发送电子邮件,但设置Reply-To:
类似的东西Reply-To: <mail-1234-5678-a[email protected]>
这绝对是这项工作的关键。它包括发送者的 ID、接收者的 ID 以及防止伪造的校验和。校验和可以从每个用户唯一的盐生成,很简单:
checksum = Digest::MD5.hexdigest("#{sender.id}-#{recipient.id}-#{sender.mailer_salt}")
-
现在,当您通过为“usermessages.your-domain.com”域配置的 MX 收到回复时,您要做的第一件事就是通过解析To:
场地。您可以轻松识别发件人和收件人是谁split
取出零件。然后,您可以生成校验和并确保其匹配,以确保有人不会试图恶意发送邮件,就像邮件来自其他用户一样。
-
一旦您确定了所涉及的用户,请继续发送另一封电子邮件,其中包含其中一个特殊的Reply-To:
标头(显然,ID 已反转并且摘要使用不同的盐完成)。
这是一个非常基本但功能完善的示例。您可以将此摘要放在您想要的任何位置,前提是当回复返回时它将被保留(这使得Reply-To:
标题很合适。有些服务使用主题行。
我会避免让盐由用户控制,例如用户的密码哈希,因为如果用户更改该信息(更改其密码),校验和将不再有效。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)