discourse/app/jobs/regular/process_sns_notification.rb
Michał Frąckiewicz 8f7cfc29db FIX: Detect SNS notifications for SES correctly (#7284)
* Fix handling SNS notifications for AWS SES

This fixes detection of email bounce by:
- removing hard requirement for email ID, ID in webhook msg never equals this in email_log
- gets bounce_score from user stats instead of nonexistent field in webhook msg

* Remove empty line

* Prettify access to EmailLog for parsing SNS notification

Co-Authored-By: SystemZ <SystemZ@users.noreply.github.com>
2019-04-23 13:03:31 +10:00

42 lines
1.3 KiB
Ruby

module Jobs
class ProcessSnsNotification < Jobs::Base
sidekiq_options retry: false
def execute(args)
return unless raw = args[:raw].presence
return unless json = args[:json].presence
return unless message = json["Message"].presence
message = begin
JSON.parse(message)
rescue JSON::ParserError
nil
end
return unless message && message["notificationType"] == "Bounce"
return unless message_id = message.dig("mail", "messageId").presence
return unless bounce_type = message.dig("bounce", "bounceType").presence
require "aws-sdk-sns"
return unless Aws::SNS::MessageVerifier.new.authentic?(raw)
message.dig("bounce", "bouncedRecipients").each do |r|
if email_log = EmailLog.order("created_at DESC").where(to_address: r["emailAddress"]).first
email_log.update_columns(bounced: true)
if email_log.user&.email.present?
if email_log.user.user_stat.bounce_score.to_s.start_with?("4.") || bounce_type == "Transient"
Email::Receiver.update_bounce_score(email_log.user.email, SiteSetting.soft_bounce_score)
else
Email::Receiver.update_bounce_score(email_log.user.email, SiteSetting.hard_bounce_score)
end
end
end
end
end
end
end