thoughtbot / griddler

Simplify receiving email in Rails (deprecated)
http://griddler.io/
MIT License
1.38k stars 199 forks source link

NoMethodError due to undefined method 'split' #177

Closed edgward closed 10 years ago

edgward commented 10 years ago

Hi,

I'm just starting out with Rails and playing with different gems so this might be user-error, but I keep getting NoMethodError (undefined method 'split' for nil:NilClass) and it appears to be in the gem code.

Looks like it's due to the "event"=>"delivered" notifications I get back after sending out an email.

Is this an issue or something I should resolve via an email setting I've missed? Would appreciate any advice. Thanks!

   Started POST "/email_processor" for 127.0.0.1 at 2014-10-12 11:43:20 -0400
Processing by Griddler::EmailsController#create as HTML
  Parameters: {"_json"=>[{"email"=>”email_removed@gmail.com", "smtp-id"=>"<543a9fb1c392d_5f8582fd4b9872549@localhost.mail>", "timestamp"=>1413128117, "response"=>"250 2.0.0 OK 1413128117 rz2si8242276pbc.163 - gsmtp ", "sg_event_id"=>"WTMMwE_FRMKN2UlbqqjlGA", "sg_message_id"=>"14904ffd10d.509c.3c0136.filter0273p1mdw1.17449.543A9FB18.2", "event"=>"delivered"}], "email"=>{"_json"=>[{"email"=>"email_removed@gmail.com", "smtp-id"=>"<543a9fb1c392d_5f8582fd4b9872549@localhost.mail>", "timestamp"=>1413128117, "response"=>"250 2.0.0 OK 1413128117 rz2si8242276pbc.163 - gsmtp ", "sg_event_id"=>"WTMMwE_FRMKN2UlbqqjlGA", "sg_message_id"=>"14904ffd10d.509c.3c0136.filter0273p1mdw1.17449.543A9FB18.2", "event"=>"delivered"}]}}
Completed 500 Internal Server Error in 7ms

NoMethodError (undefined method `split' for nil:NilClass):
  griddler (1.1.0) lib/griddler/email_parser.rb:59:in `extract_email_address'
  griddler (1.1.0) lib/griddler/email_parser.rb:15:in `parse_address'
  griddler (1.1.0) lib/griddler/email.rb:43:in `extract_address'
  griddler (1.1.0) lib/griddler/email.rb:13:in `initialize'
  griddler (1.1.0) app/controllers/griddler/emails_controller.rb:4:in `new'
  griddler (1.1.0) app/controllers/griddler/emails_controller.rb:4:in `block in create'
  griddler (1.1.0) app/controllers/griddler/emails_controller.rb:3:in `each'
  griddler (1.1.0) app/controllers/griddler/emails_controller.rb:3:in `create'
  actionpack (4.1.1) lib/action_controller/metal/implicit_render.rb:4:in `send_action'
  actionpack (4.1.1) lib/abstract_controller/base.rb:189:in `process_action'
  actionpack (4.1.1) lib/action_controller/metal/rendering.rb:10:in `process_action'
  actionpack (4.1.1) lib/abstract_controller/callbacks.rb:20:in `block in process_action'
  activesupport (4.1.1) lib/active_support/callbacks.rb:113:in `call'
  activesupport (4.1.1) lib/active_support/callbacks.rb:113:in `call'
  activesupport (4.1.1) lib/active_support/callbacks.rb:229:in `block in halting'
  activesupport (4.1.1) lib/active_support/callbacks.rb:166:in `call'
  activesupport (4.1.1) lib/active_support/callbacks.rb:166:in `block in halting'
  activesupport (4.1.1) lib/active_support/callbacks.rb:166:in `call'
  activesupport (4.1.1) lib/active_support/callbacks.rb:166:in `block in halting'
  activesupport (4.1.1) lib/active_support/callbacks.rb:86:in `call'
  activesupport (4.1.1) lib/active_support/callbacks.rb:86:in `run_callbacks'
  actionpack (4.1.1) lib/abstract_controller/callbacks.rb:19:in `process_action'
  actionpack (4.1.1) lib/action_controller/metal/rescue.rb:29:in `process_action'
  actionpack (4.1.1) lib/action_controller/metal/instrumentation.rb:31:in `block in process_action'
  activesupport (4.1.1) lib/active_support/notifications.rb:159:in `block in instrument'
  activesupport (4.1.1) lib/active_support/notifications/instrumenter.rb:20:in `instrument'
  activesupport (4.1.1) lib/active_support/notifications.rb:159:in `instrument'
  actionpack (4.1.1) lib/action_controller/metal/instrumentation.rb:30:in `process_action'
  actionpack (4.1.1) lib/action_controller/metal/params_wrapper.rb:250:in `process_action'
  activerecord (4.1.1) lib/active_record/railties/controller_runtime.rb:18:in `process_action'
  actionpack (4.1.1) lib/abstract_controller/base.rb:136:in `process'
  actionview (4.1.1) lib/action_view/rendering.rb:30:in `process'
  actionpack (4.1.1) lib/action_controller/metal.rb:195:in `dispatch'
  actionpack (4.1.1) lib/action_controller/metal/rack_delegation.rb:13:in `dispatch'
  actionpack (4.1.1) lib/action_controller/metal.rb:231:in `block in action'
  actionpack (4.1.1) lib/action_dispatch/routing/route_set.rb:80:in `call'
  actionpack (4.1.1) lib/action_dispatch/routing/route_set.rb:80:in `dispatch'
  actionpack (4.1.1) lib/action_dispatch/routing/route_set.rb:48:in `call'
  actionpack (4.1.1) lib/action_dispatch/journey/router.rb:71:in `block in call'
  actionpack (4.1.1) lib/action_dispatch/journey/router.rb:59:in `each'
  actionpack (4.1.1) lib/action_dispatch/journey/router.rb:59:in `call'
  actionpack (4.1.1) lib/action_dispatch/routing/route_set.rb:676:in `call'
  warden (1.2.3) lib/warden/manager.rb:35:in `block in call'
  warden (1.2.3) lib/warden/manager.rb:34:in `catch'
  warden (1.2.3) lib/warden/manager.rb:34:in `call'
  rack (1.5.2) lib/rack/etag.rb:23:in `call'
  rack (1.5.2) lib/rack/conditionalget.rb:35:in `call'
  rack (1.5.2) lib/rack/head.rb:11:in `call'
  actionpack (4.1.1) lib/action_dispatch/middleware/params_parser.rb:27:in `call'
  actionpack (4.1.1) lib/action_dispatch/middleware/flash.rb:254:in `call'
  rack (1.5.2) lib/rack/session/abstract/id.rb:225:in `context'
  rack (1.5.2) lib/rack/session/abstract/id.rb:220:in `call'
  actionpack (4.1.1) lib/action_dispatch/middleware/cookies.rb:560:in `call'
  activerecord (4.1.1) lib/active_record/query_cache.rb:36:in `call'
  activerecord (4.1.1) lib/active_record/connection_adapters/abstract/connection_pool.rb:621:in `call'
  activerecord (4.1.1) lib/active_record/migration.rb:380:in `call'
  actionpack (4.1.1) lib/action_dispatch/middleware/callbacks.rb:29:in `block in call'
  activesupport (4.1.1) lib/active_support/callbacks.rb:82:in `run_callbacks'
  actionpack (4.1.1) lib/action_dispatch/middleware/callbacks.rb:27:in `call'
  actionpack (4.1.1) lib/action_dispatch/middleware/reloader.rb:73:in `call'
  actionpack (4.1.1) lib/action_dispatch/middleware/remote_ip.rb:76:in `call'
  actionpack (4.1.1) lib/action_dispatch/middleware/debug_exceptions.rb:17:in `call'
  actionpack (4.1.1) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
  railties (4.1.1) lib/rails/rack/logger.rb:38:in `call_app'
  railties (4.1.1) lib/rails/rack/logger.rb:20:in `block in call'
  activesupport (4.1.1) lib/active_support/tagged_logging.rb:68:in `block in tagged'
  activesupport (4.1.1) lib/active_support/tagged_logging.rb:26:in `tagged'
  activesupport (4.1.1) lib/active_support/tagged_logging.rb:68:in `tagged'
  railties (4.1.1) lib/rails/rack/logger.rb:20:in `call'
  actionpack (4.1.1) lib/action_dispatch/middleware/request_id.rb:21:in `call'
  rack (1.5.2) lib/rack/methodoverride.rb:21:in `call'
  rack (1.5.2) lib/rack/runtime.rb:17:in `call'
  activesupport (4.1.1) lib/active_support/cache/strategy/local_cache_middleware.rb:26:in `call'
  rack (1.5.2) lib/rack/lock.rb:17:in `call'
  actionpack (4.1.1) lib/action_dispatch/middleware/static.rb:64:in `call'
  rack (1.5.2) lib/rack/sendfile.rb:112:in `call'
  railties (4.1.1) lib/rails/engine.rb:514:in `call'
  railties (4.1.1) lib/rails/application.rb:144:in `call'
  rack (1.5.2) lib/rack/lock.rb:17:in `call'
  rack (1.5.2) lib/rack/content_length.rb:14:in `call'
  rack (1.5.2) lib/rack/handler/webrick.rb:60:in `service'
edgward commented 10 years ago

Just found the Sendgrid Event Notification settings page and turned all of them off, so I should be good for now.

However, if I did want to use event notifications, I could see this being an issue. Is there a way to configure Griddler or the Griddler adapter so these come through correctly?

chrishunt commented 10 years ago

Hi @edgward. Griddler is designed to process incoming emails, not incoming events. It expects a payload that looks like:

{
  "headers": "Received: by 127.0.0.1 with SMTP...",
  "to": "Another Person <another-person@example.com>",
  "from": "A Person <person@example.com>",
  "subject": "hello there",
  "text": "this is an email message",
  "html": "<p>this is an email message</p>",
  "SPF": "pass"
}

There's an exception because SendGrid events are not email :smile: The payload is quite different:

[
  {
    "email": "person@example.com",
    "timestamp": 1337197600,
    "smtp-id": "<4FB4041F.6080505@sendgrid.com>",
    "event": "delivered"
  }
]

If you're interested in processing SendGrid events, I think the best approach would be to create a separate endpoint in your application for those events and configure SendGrid to post events to that endpoint. Griddler will not be able to handle these events unfortunately.

edgward commented 10 years ago

@chrishunt Ah, that helps clarify things. Thanks for explaining that! Will go ahead and close the issue then.

calebhearth commented 10 years ago

To go one step further, it's likely that your SendGrid setup is such that you're sending an events api to /email_processor.

If you have a compelling reason to consume these events, then you should set up another endpoint. If you don't or aren't sure, they're probably safe to ignore.

edgward commented 10 years ago

Thanks @calebthompson. Exactly right, events were POSTing to the same endpoint url -- I don't need them at the moment so I turned all event notifications off via Sendgrid's website. In the future, if I need to consume them, I'll change the endpoint url and create a separate handler method for events.

Extremely helpful, guys. Thanks again!