Невозможно разобрать 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, но я собираю параметры из письма, чтобы отправить его с контроллера.
Это то, что вы могли бы попробовать?