2009-08-16 108 views
9

我一直在试图找出在rails应用程序中处理传入电子邮件的最佳方法。我意识到“最佳实践”是非常主观的,因此我首先要说明我的主要担忧是可扩展性和效率。这是一个问题,主要是因为我的使用涉及处理潜在的大附件。在rails中接收电子邮件的最佳做法

似乎就在昨天,接受的方法是使用ActionMailer来接收电子邮件,但最近我偶然发现了几篇文章,说这是低效的,因为它会产生一个带有每封电子邮件的新rails实例(可怕的是大容量)。

最近,这篇文章一直让我注意: http://jasonseifer.com/2009/04/24/receving-email-with-rails

关于不被强迫产卵整个轨实例的ActionMailer系统的削减版本的后期谈判,但该意见说说其他几个选项,如专用邮件目录(maildir?)和imap/pop检索。

我的问题是:有没有人有任何想法来处理在Rails应用程序(包括附件)中传入电子邮件的最佳选择?

回答

6

我维护Fetcher plugin从我使用cron的IMAP服务器下载电子邮件。我曾经使用过一个守护进程,但这很难继续运行(即使是monit),因为Ruby会挂起。 Cron对于我的工作负载没问题,但它每分钟都会产生一次Rails进程。

要处理附件,请查看MMS2R库。它有一个很好的界面,用于从电子邮件中获取文件。

我推荐给我的另一种方法是为每条收到的消息发送一个HTTP帖子。然后你可以扩展你的web层来处理它。

无耻插头:你可能想看看麦克蒙德拉贡和我的PeepCode book on receiving email with Ruby

+1

无耻的插头不是无耻的,如果他们是相关的;-),我会检查出来。关于IMAP选项,它是如何工作的?你是否需要在其他地方访问外部电子邮件帐户,或者你是否托管了自己的电子邮件服务器,并从中获取?谢谢! – Ryan 2009-08-16 18:04:12

+0

我使用Google Apps电子邮件帐户。不过,任何拥有IMAP访问权限的帐户都应该可以工作 – 2009-08-16 22:31:53

+1

对于我个人的情况,我打算使用http post,仅仅是因为我的情况不利于IMAP访问(整个域的电子邮件)。感谢您的回答,并感谢让我开启MMS2R! – Ryan 2009-08-18 02:40:32

1

in mms2r MMS2R#default_media只是返回最大的视频附件(如果它存在),或最大的图像附件(如果存在),或最大的文本附件(如果存在),按照该顺序。 MMS2R#default_text返回最大的文本/简单附件(如果存在)。您还可以直接通过mms2r的媒体哈希访问任何附件,例如MMS2R#媒体。 MMS2R#media由mimetype键入,该键引用的值是该类型的媒体数组。因此,如果在由MMS2R处理的电子邮件中存在两个jpeg附件,则可以通过使用image/jpeg键入媒体散列来将它们作为数组访问,例如, MMS2R#media['image/jpeg']

当MMS2R第一次处理电子邮件时,它发现的任何附件都被解码并存储在该类型的媒体阵列中。正如我所说的那样,该阵列随后被MMS2R#media散列中的mimetype键入。

买书,我需要支付我的抵押PeepCode book on receiving email with Ruby

4

您可以尝试使用服务像http://cloudmailin.com/

+0

我还没有试过这个,但下次我遇到这个问题时我会检查一下。我与sendgrid.com合作过,并且可以将它推荐给需要这种服务的任何人......只是想为未来的读者提供帮助! – Ryan 2010-12-02 06:30:26

0

我最近写了使用LMTP(它使用EventMachine的,是非常快速和强大的),其接收来自Postfix邮件并将其保存到MongoDB的守护进程。从这个意义上说,它消除了中间人(IMAP服务器+ IMAP客户端)。这种方法提供了无限的可扩展性和冗余性。其他后端支持(MySQL,Redis等)几乎可以在任何时候添加。

received

2

对于通过HTTP中继来自Postfix的邮件到您的Rails应用程序,我只是写了一篇关于我们如何做的文章。

这其实很简单,但我们也利用Postfix的能力推迟邮件,如果它不能被中继。到目前为止我还没有在其他地方看到过。详情请参阅http://www.doorkeeperhq.com/developer/smtp-to-web-api