diff --git a/app/controllers/webhooks_controller.rb b/app/controllers/webhooks_controller.rb index da480adcc25..86c227a0804 100644 --- a/app/controllers/webhooks_controller.rb +++ b/app/controllers/webhooks_controller.rb @@ -88,6 +88,28 @@ class WebhooksController < ActionController::Base render nothing: true, status: 200 end + def sparkpost + events = params["_json"] || [params] + events.each do |event| + message_id = event["msys"]["message_event"]["campaign_id"] rescue nil + bounce_class = event["msys"]["message_event"]["bounce_class"] rescue nil + next unless message_id && bounce_class + + bounce_class = bounce_class.to_i + + # bounce class definitions: https://support.sparkpost.com/customer/portal/articles/1929896 + if bounce_class < 80 + if bounce_class == 10 || bounce_class == 25 || bounce_class == 30 + process_bounce(message_id, SiteSetting.hard_bounce_score) + else + process_bounce(message_id, SiteSetting.soft_bounce_score) + end + end + end + + render nothing: true, status: 200 + end + private def mailgun_failure diff --git a/config/routes.rb b/config/routes.rb index af169723dd0..506f81db6bc 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -20,6 +20,7 @@ Discourse::Application.routes.draw do post "webhooks/sendgrid" => "webhooks#sendgrid" post "webhooks/mailjet" => "webhooks#mailjet" post "webhooks/mandrill" => "webhooks#mandrill" + post "webhooks/sparkpost" => "webhooks#sparkpost" if Rails.env.development? mount Sidekiq::Web => "/sidekiq" diff --git a/lib/email/sender.rb b/lib/email/sender.rb index d3774641820..60cb98eccbe 100644 --- a/lib/email/sender.rb +++ b/lib/email/sender.rb @@ -139,6 +139,8 @@ module Email @message.header['X-MJ-CustomID'] = @message.message_id when "smtp.mandrillapp.com" @message.header['X-MC-Metadata'] = { message_id: @message.message_id }.to_json + when "smtp.sparkpostmail.com" + @message.header['X-MSYS-API'] = { campaign_id: @message.message_id }.to_json end # Suppress images from short emails diff --git a/spec/controllers/webhooks_controller_spec.rb b/spec/controllers/webhooks_controller_spec.rb index 6e599a2aaf4..2cf6ef71064 100644 --- a/spec/controllers/webhooks_controller_spec.rb +++ b/spec/controllers/webhooks_controller_spec.rb @@ -99,4 +99,28 @@ describe WebhooksController do end + context "sparkpost" do + + it "works" do + user = Fabricate(:user, email: email) + email_log = Fabricate(:email_log, user: user, message_id: message_id) + + post :sparkpost, "_json" => [{ + "msys" => { + "message_event" => { + "bounce_class" => 10, + "campaign_id" => message_id + } + } + }] + + expect(response).to be_success + + email_log.reload + expect(email_log.bounced).to eq(true) + expect(email_log.user.user_stat.bounce_score).to eq(2) + end + + end + end