Невозможно разобрать Sendgrid parse api raw callback в объект электронной почты Griddler

Я пытаюсь сделать следующее:

Все электронные письма отправляются на мой домен для анализа их содержимого, тела, темы и... для того, чтобы я мог создать из него объект факса и отправить его как факс

До сих пор я был в состоянии настроить свою запись MX так, чтобы она указывала на Sendgrid, и из API синтаксического анализа Sendgrid с помощью Ngrok я получаю обратный вызов на моем сервере localhost. Следующий шаг - поместить необработанный объект в объект, с которым я мог бы работать. Это привело меня к Griddler Gem.

Вот как я настроил свое приложение до сих пор:

Настройка Sendgrid: URL: https://8c00fab0.ngrok.io/email_processor | Проверка на спам и отправка сырья проверяются

Как упоминалось ранее, эта часть работает, так как я получаю это:

Parameters: {"dkim"=>"{@gmail.com : pass}", "email"=>"Received: by mx0034p1mdw1.sendgrid.net with SMTP id 253FfvZ40f Wed, 09 Sep 2015 22:31:48 +0000 (UTC)\nReceived: from mail-qg0-f54.google.com (mail-qg0-f54.google.com [209.85.192.54]) by mx0034p1mdw1.sendgrid.net (Postfix) with ESMTPS id 63848A83017 for <14085552422@faxbyemail.co>; Wed,  9 Sep 2015 22:31:48 +0000 (UTC)\nReceived: by qgx61 with SMTP id 61so21251135qgx.3 for <14085552422@faxbyemail.co>; Wed, 09 Sep 2015 15:31:48 -0700 (PDT)\nDKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:from:date:message-id:subject:to:content-type; bh=Wo6p7CSlR30aGxf5SwjuZ2klt31URDqTZUHrKdmLz7s=; b=fWfFOQ4YOtijYvphYL9/1shyzK8CBTcHS37s89t9Qn4xK8OrXwVKtmGtNnwg7a1n48 JHkEeAdxVvRMpinxPllGiJoPNy0ivVN36uEYbsrLTcZVlx9RIIl8u5PjmrE1aqlnkjPy gOcbfJunVCFZLaLpv3RB/GiNYL1bodgW7nn8sMTmwN5EwoH7SncS7cle4ksPadgiGv9f DVoJniX2yuMqygSVLT4Qrk4JDzR6G2oj1Fz3QkcrQfNKxOS6iyBhpnh3cDuUi8GTSVYl Nqq2dtKlUNqI+U9ojtG1BjGVUKbP0v5apF3Wvmj72p8L0AB3FHqL8uvFnhi2dGTFVq+y 6nUQ==\nX-Received: by 10.140.233.137 with SMTP id e131mr48879201qhc.37.1441837907953; Wed, 09 Sep 2015 15:31:47 -0700 (PDT)\nMIME-Version: 1.0\nFrom: Sam Sedighian <samansb@gmail.com>\nDate: Wed, 09 Sep 2015 22:31:38 +0000\nMessage-ID: <CAEMkzYbhsLLB3NPLznG+-RibP5kzDG5yTT++mQL1ep-vH6_orA@mail.gmail.com>\nSubject: test 20\nTo: \"14085552422@faxbyemail.co\" <14085552422@faxbyemail.co>\nContent-Type: multipart/alternative; boundary=001a11354d8053d2d1051f580c22\n\n--001a11354d8053d2d1051f580c22\nContent-Type: text/plain; charset=UTF-8\n\nbody etxt\n\n--001a11354d8053d2d1051f580c22\nContent-Type: text/html; charset=UTF-8\n\n<div dir=\"ltr\">body etxt</div>\n\n--001a11354d8053d2d1051f580c22--\n", "to"=>"\"14085552422@faxbyemail.co\" <14085552422@faxbyemail.co>", "from"=>"Sam Sedighian <samansb@gmail.com>", "sender_ip"=>"209.85.192.54", "spam_report"=>"Spam detection software, running on the system \"mx0034p1mdw1.sendgrid.net\", has\nidentified this incoming email as possible spam.  The original message\nhas been attached to this so you can view it (if it isn't spam) or label\nsimilar future email.  If you have any questions, see\n@@CONTACT_ADDRESS@@ for details.\n\nContent preview:  body etxt body etxt [...] \n\nContent analysis details:   (0.0 points, 5.0 required)\n\n pts rule name              description\n---- ---------------------- --------------------------------------------------\n 0.0 FREEMAIL_FROM          Sender email is freemail (samansb[at]gmail.com)\n 0.0 HTML_MESSAGE           BODY: HTML included in message\n 0.0 T_MIME_NO_TEXT         No text body parts\n\n", "envelope"=>"{\"to\":[\"14085552422@faxbyemail.co\"],\"from\":\"samansb@gmail.com\"}", "subject"=>"test 20", "spam_score"=>"0.012", "charsets"=>"{\"to\":\"UTF-8\",\"subject\":\"UTF-8\",\"from\":\"UTF-8\"}", "SPF"=>"pass"}

Gemfile

gem 'griddler'
gem 'griddler-sendgrid'

Gemfile.lock

griddler (1.2.1)
  htmlentities
  rails (>= 3.2.0)
griddler-sendgrid (0.0.1)
  griddler

routes.rb

post '/email_processor' => 'fax#sendgrid'
# this corresponds to the following route when I rake route:
# email_processor POST   /email_processor(.:format) fax#sendgrid

конфиг / Инициализаторы /griddler.rb

Griddler.configure do |config|
  config.processor_class = EmailProcessor
  config.processor_method = :process
  config.reply_delimiter = '-- REPLY ABOVE THIS LINE --'
  config.email_service = :sendgrid
end

приложение / контроллеры /fax_controller.rb

def sendgrid
  EmailProcessor.new(params).process
end

приложение / модели /email_processor.rb

class EmailProcessor

  def initialize(email)
    @email = email
    @from = email.from
    @body = email.body
  end

  def self.process(email)
    Fax.create({params go here})
  end

end

Я заканчиваю тем, что выдал внутреннюю ошибку сервера "Завершено 500" - так как я не передаю 200 OK обратно в Sendgrid, но важной частью является то, что я получаю следующую ошибку в своем журнале:

NoMethodError (undefined method `from' for #<ActionController::Parameters:0x007fc742a33070>):
  app/models/email_processor.rb:5:in `initialize'
  app/controllers/fax_controller.rb:31:in `new'
  app/controllers/fax_controller.rb:31:in `sendgrid'

2 ответа

Решение

Я думаю, проблема в том, что вы обходите работу, которую Griddler выполняет на стороне контроллера. Вы указываете Sendgrid на контроллер и действие, которое вы создали сами. Вместо этого я думаю, что вы хотите указать на контроллер и действие Гриддлера. Смотрите README в разделе "Установка".

Измени свой routes.rb быть:

# your own route
# post '/email_processor' => 'fax#sendgrid'

# griddler's
post '/email_processor' => 'griddler/emails#create'

Если вы посмотрите на контроллер Griddler, вы увидите, что есть несколько вещей, которые он делает для того, чтобы вы могли что-то сделать в своем классе процессора электронной почты.

В Rails я делаю это, собирая параметры электронной почты в контроллере.

Например, в образце приложения, которое я создал, люди отправляют свои селфи по электронной почте в наш Parse API. В моем selfie_controller.rb у меня есть маршрут / входящий, и у меня есть следующее:

def inbound

    if !params['attachment1'].nil? and params['attachment1'].content_type == "image/jpeg"

        Selfy.create!({ pic: params['attachment1'], email: params['from'] })

    end

end

Призыв к Selfy.create! использует модель selfy.rb, но я собираю параметры из письма, чтобы отправить его с контроллера.

Это то, что вы могли бы попробовать?

Другие вопросы по тегам