Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 类似Craigslist-Rails的电子邮件转发_Ruby On Rails_Email_Email Forwarding - Fatal编程技术网

Ruby on rails 类似Craigslist-Rails的电子邮件转发

Ruby on rails 类似Craigslist-Rails的电子邮件转发,ruby-on-rails,email,email-forwarding,Ruby On Rails,Email,Email Forwarding,我正在尝试做craigslist的匿名电子邮件所做的事情,但是Rails也很便宜。对我来说,能够在邮件中添加一个标题是很重要的,这就是为什么基本的邮件转发不起作用的原因 我想到的一种方式是SMTP服务器,每当我通过POP/IMAP阅读电子邮件时,我都会向电子邮件的真正收件人发送一封电子邮件,并在邮件头中添加一个正确的发件人地址。这是可行的,但SMTP服务器的成本相对较高 另一种方法是转发/重定向电子邮件,但在两者之间添加标题。但我找不到任何服务或宝石来做这件事 请不要只说“电子邮件管道”,因为这

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

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

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

请不要只说“电子邮件管道”,因为这意味着将电子邮件发送到Rails程序,收到电子邮件后你会做什么?你实际上是如何转发的


有什么想法吗?

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

如果MTA没有安装在与rails应用程序本身相同的服务器上,那么您必须将电子邮件通过管道发送到一个小的临时转发器脚本,该脚本在将电子邮件发送到您的应用程序的过程中执行一些操作,然后手动将其传递给您的邮件发送者

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

我们还没有做到这一点,但我们也会出于同样的原因去做。但是,如果您不熟悉MTA的配置,则可能会有点不知所措。您是否有一个系统管理员可以完成此任务

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

  • 用户A(id=1234)向用户B(id=5678)发送电子邮件

  • 从您想要的、您拥有的任何地址发送电子邮件,但将
    回复地址设置为:
    类似于
    回复地址:

    这绝对是这项工作的关键。它包括发送者的ID、接收者的ID以及防止伪造的校验和。校验和可以由每个用户唯一的salt生成,简单地说:

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

  • 现在,当您通过为“usermessages.your domain.com”域配置的MX收到回复时,您要做的第一件事是通过解析
    To:
    字段来识别发件人和收件人。通过将各部分分开,您可以很容易地识别发送者和接收者。然后,您可以生成一个校验和,并确保它匹配,以确保某人没有试图恶意发送邮件,就好像它来自另一个用户一样

  • 一旦你了解了涉及的用户,继续发送另一封电子邮件,其中有一个特殊的
    回复:
    标题(显然,ID是颠倒的,摘要是用不同的盐完成的)

  • 这是一个非常基本但功能完善的示例。你可以把这个摘要放在任何你想放的地方,前提是当回复回来时它会被保留(这使得
    回复:
    标题非常合适。有些服务使用主题行代替


    我会避免将salt设置为用户控制的内容,例如用户的密码散列,因为如果用户更改该信息(更改其密码),校验和将不再有效。

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

    基本前提是,您希望在一个“一网打尽”的域上接收邮件。您可以使用imap/pop3从gmail等服务器转发/收集邮件,也可以使用CloudMailin等服务将邮件发送到您的应用程序。您可以为每个用户提供一个唯一的收件人地址,甚至只使用邮件的一次性部分,如normal+disposable@domain.com.


    然后,只需使用检查邮件并添加任何需要的标题,然后再次发送邮件。同样,您可以使用自己的电子邮件服务器来完成此传递,或者如果您想提高您的传递能力,可以使用类似亚马逊简单电子邮件服务的服务。

    谢谢您的回复!我对管道部分很满意。I假设我不理解的是“将电子邮件转发给预期收件人”第一,我希望我的发件人地址是发送电子邮件的人。但是,据我所知,如果你拥有自己的邮件服务,那么更改发件人地址是非常糟糕的做法,并且经常会让你被过滤掉。这是真的吗?没错,你不应该“发件人”发送电子邮件一个你不拥有的地址…很可能会被垃圾邮件过滤器卡住。我以为你想匿名这么做?我会更新我的答案,更深入地讨论我将如何设计它。请参阅我的修订答案,以了解如何在Rails级别进行技术讨论。请记住,我没有这样做;我只是一直在思考这是因为我们也将这样做。请注意Steve的回答,当您已经有了一个运行环境并准备好通过HTTP使用时,避免将邮件直接传送到Rails。嗯,我想更改发件人地址的原因是因为craigslist实际上就是这样做的。它将电子邮件转发给他们,使我看起来不是我发的。我想唯一可靠的方法是通过sendgrid这样的服务。谢谢你的回复。我还没有看到亚马逊的简单电子邮件服务。这会让我控制from:头,让它看起来像是最初发送电子邮件的人发来的吗?我同意你在博客p中提到的