2013-02-27 1 views
0

Я использую аддон Cloudmailin для получения электронной почты из своего приложения Heroku. Однако Cloudmailin не смог доставить - или, вернее, он получает 500 от Heroku каждый раз (так что адрес правильный).Cloudmailin получает 500 от Heroku при доставке электронной почты

Ошибка в логах 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' 

Моя маршрутизация является правильным; «Ввод контроллера! Управление электронной почтой!» происходит от puts в начале класса, поэтому класс определенно вводится.

# 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 

пользователя и мысли являются ресурсы базы данных, используемые в других местах без проблем. Процедура сохранения такая же, что и в контроллере Thought, создаваемом для лесов. Логику params и Rails.logger я копировал с Cloudmailin Rails 3 example.

Я действительно смущен - где я иду не так? Я бы очень признателен за любые указатели.

ответ

0

Получается, поэтому вы не должны кодировать во время сна. Проблема была простой: нет такой вещи, как params[:envelope][:from], есть только params[:from]). Мое предположение, что :from было бы подэлементом :envelope, вероятно, сформировалось, посмотрев на рисунок в the second "Cloudmailin in Rails on Heroku" example, где код, используемый для регистрации темы, - Rails.logger.log params[:envelope][:subject].

Я понял, что это была ошибка после прочтения the API documentation for 'original' Cloudmailin format. Исключительно глупо от меня не искать/искать этот ресурс в первую очередь.

После исправления этого кода код по-прежнему не работает, потому что User.where(:email => params[:from]) только вернул объект Relation, а объект User ожидал. Ошибка в журналах Heroku было следующее:

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

Поскольку может быть только один пользователь с некоторой электронной почты, исправление User.where(:email => params[:from]).first не имеет побочных эффектов и приводит к правильному поведению.