电子邮件转发,如Craigslist - Rails

时间:2011-05-21 00:47:29

标签: ruby-on-rails email email-forwarding

我正在尝试做craigslist的匿名电子邮件,但是使用Rails,也很便宜。能够在电子邮件中添加标题对我来说很重要,这就是基本电子邮件转发不起作用的原因。

我想到的一种方式是SMTP服务器,每当我通过POP / IMAP阅读电子邮件时,我就会向电子邮件的真正收件人发送一封电子邮件,并附上正确的FROM地址并添加到标题中。这样可行,但SMTP服务器的成本相对较高。

另一种方法是转发/重定向电子邮件,但在两者之间添加标题。我找不到任何服务或宝石。

请不要只说“电子邮件管道”,因为所有真正意味着将电子邮件发送到您的Rails程序,您收到电子邮件后会怎么做?你是如何实际转发它的。

有什么想法吗?

2 个答案:

答案 0 :(得分:12)

您需要一个电子邮件地址,使用您的系统管理员可控制的MX服务器。这可能是您主域的子域。然后你做的是,你配置MTA软件(Exim,Postfix ...希望不是qMail!)将该电子邮件传递给Rails:

http://guides.rubyonrails.org/action_mailer_basics.html#receiving-emails

如果MTA未安装在与rails应用程序本身相同的服务器上,则必须将电子邮件传递给一个小的ad-hoc转发器脚本,该脚本在将电子邮件发布到您的应用程序时执行某些操作,其中然后手动将其传递给邮件程序。

在您的邮件程序中,您可以访问所有标题,正文,附件等。如果您在主题或回复地址中放置了一些唯一标识符,则可以决定要实例化哪个Mailer以转发邮寄给预定的收件人。

我们还没有这样做,但出于同样的原因,我们将会这样做。如果您不熟悉配置MTA,可能会有点过头了。你有一个系统管理员可以完成这个任务吗?

在代码级别,我会这样做:

  1. 用户A(id = 1234)向用户B发送电子邮件(id = 5678)
  2. 从您拥有的任何地址发送电子邮件,但将Reply-To:设置为Reply-To: <mail-1234-5678-abcdefabcd1234567890abcdefabcdef@usermessages.your-domain.com>

    这绝对是这项工作的关键。它包括发件人的ID,收件人的ID以及防止伪造的校验和。校验和可以从每个用户独有的盐生成,只是:

    checksum = Digest::MD5.hexdigest("#{sender.id}-#{recipient.id}-#{sender.mailer_salt}")

  3. 现在,当您通过已为“usermessages.your-domain.com”域配置的MX收到回复时,您要做的第一件事就是通过解析{{1}来识别发件人和收件人}字段。您可以通过To:输出部件轻松识别发件人和收件人。然后,您可以生成校验和并确保它匹配,以确保某人不会像其他用户那样恶意发送邮件。

  4. 一旦你弄清楚了所涉及的用户,请继续发送另一封电子邮件,其中包含一个特殊的split标题(ID的反转和使用不同的盐完成摘要,显然)。

  5. 这是一个非常基本但功能完善的例子。您可以将此摘要放在任何您想要的位置,前提是它会在回复时保留(这使得Reply-To:标题非常适合。有些服务会使用主题行。

    我会避免使用某些用户控制的盐,例如用户的密码哈希值,因为如果用户更改了该信息(更改了密码),则校验和将不再验证。

答案 1 :(得分:4)

如果你的应用程序要扩展,特别是跨多个服务器,那么我不会推荐默认的Rails接收电子邮件的方式。看一下我写的here关于某些选项的博客文章。

基本前提是您希望在catch all域上接收邮件。您可以使用像gmail这样的服务器使用imap / pop3转发/收集,也可以使用像CloudMailin这样的服务来处理将消息传递到您的应用程序。您可以为每个用户提供唯一的地址,甚至只使用消息的一次性部分,例如normal+disposable@domain.com。

然后只是使用mail gem检查邮件并添加您需要的任何标头并再次发送邮件的情况。如果您想提高可传输性,您可以再次使用自己的电子邮件服务器进行此交付,或依赖亚马逊的简单电子邮件服务等服务。