mirror of
https://github.com/discourse/discourse.git
synced 2025-09-06 10:50:21 +08:00
FIX: bounce webhooks should also use recipient address
This commit is contained in:
parent
767c1da2dc
commit
27fb9c8804
2 changed files with 34 additions and 23 deletions
|
@ -24,14 +24,15 @@ class WebhooksController < ActionController::Base
|
||||||
|
|
||||||
event = params["event"]
|
event = params["event"]
|
||||||
message_id = params["Message-Id"].tr("<>", "")
|
message_id = params["Message-Id"].tr("<>", "")
|
||||||
|
to_address = params["recipient"]
|
||||||
|
|
||||||
# only handle soft bounces, because hard bounces are also handled
|
# only handle soft bounces, because hard bounces are also handled
|
||||||
# by the "dropped" event and we don't want to increase bounce score twice
|
# by the "dropped" event and we don't want to increase bounce score twice
|
||||||
# for the same message
|
# for the same message
|
||||||
if event == "bounced".freeze && params["error"]["4."]
|
if event == "bounced".freeze && params["error"]["4."]
|
||||||
process_bounce(message_id, SiteSetting.soft_bounce_score)
|
process_bounce(message_id, to_address, SiteSetting.soft_bounce_score)
|
||||||
elsif event == "dropped".freeze
|
elsif event == "dropped".freeze
|
||||||
process_bounce(message_id, SiteSetting.hard_bounce_score)
|
process_bounce(message_id, to_address, SiteSetting.hard_bounce_score)
|
||||||
end
|
end
|
||||||
|
|
||||||
mailgun_success
|
mailgun_success
|
||||||
|
@ -41,14 +42,15 @@ class WebhooksController < ActionController::Base
|
||||||
events = params["_json"] || [params]
|
events = params["_json"] || [params]
|
||||||
events.each do |event|
|
events.each do |event|
|
||||||
message_id = (event["smtp-id"] || "").tr("<>", "")
|
message_id = (event["smtp-id"] || "").tr("<>", "")
|
||||||
|
to_address = event["email"]
|
||||||
if event["event"] == "bounce".freeze
|
if event["event"] == "bounce".freeze
|
||||||
if event["status"]["4."]
|
if event["status"]["4."]
|
||||||
process_bounce(message_id, SiteSetting.soft_bounce_score)
|
process_bounce(message_id, to_address, SiteSetting.soft_bounce_score)
|
||||||
else
|
else
|
||||||
process_bounce(message_id, SiteSetting.hard_bounce_score)
|
process_bounce(message_id, to_address, SiteSetting.hard_bounce_score)
|
||||||
end
|
end
|
||||||
elsif event["event"] == "dropped".freeze
|
elsif event["event"] == "dropped".freeze
|
||||||
process_bounce(message_id, SiteSetting.hard_bounce_score)
|
process_bounce(message_id, to_address, SiteSetting.hard_bounce_score)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -59,11 +61,12 @@ class WebhooksController < ActionController::Base
|
||||||
events = params["_json"] || [params]
|
events = params["_json"] || [params]
|
||||||
events.each do |event|
|
events.each do |event|
|
||||||
message_id = event["CustomID"]
|
message_id = event["CustomID"]
|
||||||
|
to_address = event["email"]
|
||||||
if event["event"] == "bounce".freeze
|
if event["event"] == "bounce".freeze
|
||||||
if event["hard_bounce"]
|
if event["hard_bounce"]
|
||||||
process_bounce(message_id, SiteSetting.hard_bounce_score)
|
process_bounce(message_id, to_address, SiteSetting.hard_bounce_score)
|
||||||
else
|
else
|
||||||
process_bounce(message_id, SiteSetting.soft_bounce_score)
|
process_bounce(message_id, to_address, SiteSetting.soft_bounce_score)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -75,13 +78,13 @@ class WebhooksController < ActionController::Base
|
||||||
events = params["mandrill_events"]
|
events = params["mandrill_events"]
|
||||||
events.each do |event|
|
events.each do |event|
|
||||||
message_id = event["msg"]["metadata"]["message_id"] rescue nil
|
message_id = event["msg"]["metadata"]["message_id"] rescue nil
|
||||||
next unless message_id
|
to_address = event["msg"]["email"] rescue nil
|
||||||
|
|
||||||
case event["event"]
|
case event["event"]
|
||||||
when "hard_bounce"
|
when "hard_bounce"
|
||||||
process_bounce(message_id, SiteSetting.hard_bounce_score)
|
process_bounce(message_id, to_address, SiteSetting.hard_bounce_score)
|
||||||
when "soft_bounce"
|
when "soft_bounce"
|
||||||
process_bounce(message_id, SiteSetting.soft_bounce_score)
|
process_bounce(message_id, to_address, SiteSetting.soft_bounce_score)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -91,18 +94,22 @@ class WebhooksController < ActionController::Base
|
||||||
def sparkpost
|
def sparkpost
|
||||||
events = params["_json"] || [params]
|
events = params["_json"] || [params]
|
||||||
events.each do |event|
|
events.each do |event|
|
||||||
message_id = event["msys"]["message_event"]["rcpt_meta"]["message_id"] rescue nil
|
message_event = event["msys"]["message_event"] rescue nil
|
||||||
bounce_class = event["msys"]["message_event"]["bounce_class"] rescue nil
|
next unless message_event
|
||||||
next unless message_id && bounce_class
|
|
||||||
|
message_id = message_event["rcpt_meta"]["message_id"] rescue nil
|
||||||
|
to_address = message_event["rcpt_to"] rescue nil
|
||||||
|
bounce_class = message_event["bounce_class"] rescue nil
|
||||||
|
next unless bounce_class
|
||||||
|
|
||||||
bounce_class = bounce_class.to_i
|
bounce_class = bounce_class.to_i
|
||||||
|
|
||||||
# bounce class definitions: https://support.sparkpost.com/customer/portal/articles/1929896
|
# bounce class definitions: https://support.sparkpost.com/customer/portal/articles/1929896
|
||||||
if bounce_class < 80
|
if bounce_class < 80
|
||||||
if bounce_class == 10 || bounce_class == 25 || bounce_class == 30
|
if bounce_class == 10 || bounce_class == 25 || bounce_class == 30
|
||||||
process_bounce(message_id, SiteSetting.hard_bounce_score)
|
process_bounce(message_id, to_address, SiteSetting.hard_bounce_score)
|
||||||
else
|
else
|
||||||
process_bounce(message_id, SiteSetting.soft_bounce_score)
|
process_bounce(message_id, to_address, SiteSetting.soft_bounce_score)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -126,10 +133,10 @@ class WebhooksController < ActionController::Base
|
||||||
signature == OpenSSL::HMAC.hexdigest(digest, SiteSetting.mailgun_api_key, data)
|
signature == OpenSSL::HMAC.hexdigest(digest, SiteSetting.mailgun_api_key, data)
|
||||||
end
|
end
|
||||||
|
|
||||||
def process_bounce(message_id, bounce_score)
|
def process_bounce(message_id, to_address, bounce_score)
|
||||||
return if message_id.blank?
|
return if message_id.blank? || to_address.blank?
|
||||||
|
|
||||||
email_log = EmailLog.find_by(message_id: message_id)
|
email_log = EmailLog.find_by(message_id: message_id, to_address: to_address)
|
||||||
return if email_log.nil?
|
return if email_log.nil?
|
||||||
|
|
||||||
email_log.update_columns(bounced: true)
|
email_log.update_columns(bounced: true)
|
||||||
|
|
|
@ -12,13 +12,14 @@ describe WebhooksController do
|
||||||
SiteSetting.mailgun_api_key = "key-8221462f0c915af3f6f2e2df7aa5a493"
|
SiteSetting.mailgun_api_key = "key-8221462f0c915af3f6f2e2df7aa5a493"
|
||||||
|
|
||||||
user = Fabricate(:user, email: email)
|
user = Fabricate(:user, email: email)
|
||||||
email_log = Fabricate(:email_log, user: user, message_id: message_id)
|
email_log = Fabricate(:email_log, user: user, message_id: message_id, to_address: email)
|
||||||
|
|
||||||
WebhooksController.any_instance.expects(:mailgun_verify).returns(true)
|
WebhooksController.any_instance.expects(:mailgun_verify).returns(true)
|
||||||
|
|
||||||
post :mailgun, "token" => "705a8ccd2ce932be8e98c221fe701c1b4a0afcb8bbd57726de",
|
post :mailgun, "token" => "705a8ccd2ce932be8e98c221fe701c1b4a0afcb8bbd57726de",
|
||||||
"timestamp" => Time.now.to_i,
|
"timestamp" => Time.now.to_i,
|
||||||
"event" => "dropped",
|
"event" => "dropped",
|
||||||
|
"recipient" => email,
|
||||||
"Message-Id" => "<12345@il.com>"
|
"Message-Id" => "<12345@il.com>"
|
||||||
|
|
||||||
expect(response).to be_success
|
expect(response).to be_success
|
||||||
|
@ -34,7 +35,7 @@ describe WebhooksController do
|
||||||
|
|
||||||
it "works" do
|
it "works" do
|
||||||
user = Fabricate(:user, email: email)
|
user = Fabricate(:user, email: email)
|
||||||
email_log = Fabricate(:email_log, user: user, message_id: message_id)
|
email_log = Fabricate(:email_log, user: user, message_id: message_id, to_address: email)
|
||||||
|
|
||||||
post :sendgrid, "_json" => [
|
post :sendgrid, "_json" => [
|
||||||
{
|
{
|
||||||
|
@ -58,10 +59,11 @@ describe WebhooksController do
|
||||||
|
|
||||||
it "works" do
|
it "works" do
|
||||||
user = Fabricate(:user, email: email)
|
user = Fabricate(:user, email: email)
|
||||||
email_log = Fabricate(:email_log, user: user, message_id: message_id)
|
email_log = Fabricate(:email_log, user: user, message_id: message_id, to_address: email)
|
||||||
|
|
||||||
post :mailjet, {
|
post :mailjet, {
|
||||||
"event" => "bounce",
|
"event" => "bounce",
|
||||||
|
"email" => email,
|
||||||
"hard_bounce" => true,
|
"hard_bounce" => true,
|
||||||
"CustomID" => message_id
|
"CustomID" => message_id
|
||||||
}
|
}
|
||||||
|
@ -79,11 +81,12 @@ describe WebhooksController do
|
||||||
|
|
||||||
it "works" do
|
it "works" do
|
||||||
user = Fabricate(:user, email: email)
|
user = Fabricate(:user, email: email)
|
||||||
email_log = Fabricate(:email_log, user: user, message_id: message_id)
|
email_log = Fabricate(:email_log, user: user, message_id: message_id, to_address: email)
|
||||||
|
|
||||||
post :mandrill, mandrill_events: [{
|
post :mandrill, mandrill_events: [{
|
||||||
"event" => "hard_bounce",
|
"event" => "hard_bounce",
|
||||||
"msg" => {
|
"msg" => {
|
||||||
|
"email" => email,
|
||||||
"metadata" => {
|
"metadata" => {
|
||||||
"message_id" => message_id
|
"message_id" => message_id
|
||||||
}
|
}
|
||||||
|
@ -103,12 +106,13 @@ describe WebhooksController do
|
||||||
|
|
||||||
it "works" do
|
it "works" do
|
||||||
user = Fabricate(:user, email: email)
|
user = Fabricate(:user, email: email)
|
||||||
email_log = Fabricate(:email_log, user: user, message_id: message_id)
|
email_log = Fabricate(:email_log, user: user, message_id: message_id, to_address: email)
|
||||||
|
|
||||||
post :sparkpost, "_json" => [{
|
post :sparkpost, "_json" => [{
|
||||||
"msys" => {
|
"msys" => {
|
||||||
"message_event" => {
|
"message_event" => {
|
||||||
"bounce_class" => 10,
|
"bounce_class" => 10,
|
||||||
|
"rcpt_to" => email,
|
||||||
"rcpt_meta" => {
|
"rcpt_meta" => {
|
||||||
"message_id" => message_id
|
"message_id" => message_id
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue