0

我正在使用 Cloudmailin 插件从我的 Heroku 应用程序接收电子邮件。但是,Cloudmailin 无法交付 - 或者更确切地说,它每次都从 Heroku 获得 500(因此地址是正确的)。

Heroku 日志中的错误是

Started POST "/incoming_mails" for 109.107.35.53 at 2013-02-27 08:54:22 +0000
2013-02-27T08:54:23+00:00 app[web.1]: Entering the controller! Controlling the e-mail!
2013-02-27T08:54:23+00:00 app[web.1]: 
2013-02-27T08:54:23+00:00 app[web.1]: NoMethodError (undefined method `[]' for nil:NilClass):
2013-02-27T08:54:23+00:00 app[web.1]:   app/controllers/incoming_mails_controller.rb:7:in `create'

我的路由是正确的;“进入控制器!控制电子邮件!” 来自课程开始时的 put,因此课程肯定会进入。

# routes.rb
post '/incoming_mails' => 'incoming_mails#create'

文件本身如下所示:

# /app/controllers/incoming_mails_controller.rb
class IncomingMailsController < ApplicationController
  skip_before_filter :verify_authenticity_token

  def create
    puts "Entering the controller! Controlling the e-mail!"
    Rails.logger.info params[:headers][:subject]
    Rails.logger.info params[:plain]
    Rails.logger.info params[:html]

    if User.all.map(&:email).include? params[:envelope][:from] # check if user is registered
      @thought = Thought.new
      @thought.body = params[:plain].split("\n").first
      @thought.user = User.where(:email => params[:envelope][:from])
      @thought.date = DateTime.now

      if @thought.save
        render :text => 'Success', :status => 200
      else
        render :text => 'Internal failure', :status => 501
      end
    else
      render :text => 'Unknown user', :status => 404 # 404 would reject the mail
    end
  end
end

用户和思想是在其他地方使用的数据库资源,没有问题。保存过程与脚手架生成的思想控制器中的工作相同。我从Cloudmailin Rails 3 示例中复制的paramsRails.logger逻辑。

我真的很困惑 - 我哪里错了?我真的很感激任何指示。

4

1 回答 1

0

事实证明,这就是为什么你不应该在睡眠不足的情况下编码。问题很简单:没有params[:envelope][:from],只有params[:from])。我的假设:from可能:envelope是通过查看第二个“Heroku 上 Rails 中的 Cloudmailin”示例中的模式形成的,其中用于记录主题的代码是Rails.logger.log params[:envelope][:subject].

在阅读“原始” Cloudmailin 格式的 API 文档后,我意识到这是错误。我一开始就没有找到/寻找这个资源真是太愚蠢了。

修复此问题后,代码仍然无法正常工作,因为User.where(:email => params[:from])只返回了一个Relation对象,而User对象是预期的。Heroku 日志中的错误如下:

 ActiveRecord::AssociationTypeMismatch (User(#29025160) expected,
 got ActiveRecord::Relation(#12334440)):

由于只能有一个用户使用一些电子邮件,因此该修复User.where(:email => params[:from]).first没有副作用并且会导致正确的行为。

于 2013-02-28T01:46:21.040 回答