diff --git a/db/manifest b/db/manifest index d84f2fb3f..4b8e8d681 100755 --- a/db/manifest +++ b/db/manifest @@ -319,4 +319,5 @@ session_controller.sql jam_tracks_bpm.sql jam_track_sessions.sql jam_track_sessions_v2.sql -email_screening.sql \ No newline at end of file +email_screening.sql +bounced_email_cleanup.sql \ No newline at end of file diff --git a/db/up/bounced_email_cleanup.sql b/db/up/bounced_email_cleanup.sql new file mode 100644 index 000000000..e0c3c549b --- /dev/null +++ b/db/up/bounced_email_cleanup.sql @@ -0,0 +1,3 @@ +ALTER TABLE generic_state ADD COLUMN bounce_check_at TIMESTAMP; +UPDATE generic_state SET bounce_check_at = NOW(); +ALTER TABLE users ADD COLUMN bounced BOOLEAN DEFAULT FALSE; \ No newline at end of file diff --git a/ruby/Gemfile b/ruby/Gemfile index 9210a7e93..0680c23cb 100644 --- a/ruby/Gemfile +++ b/ruby/Gemfile @@ -51,6 +51,7 @@ gem 'rubyzip' gem 'sanitize' gem 'influxdb', '0.1.8' gem 'recurly' +gem 'sendgrid_toolkit', '>= 1.1.1' group :test do gem 'simplecov', '~> 0.7.1' diff --git a/ruby/lib/jam_ruby/models/generic_state.rb b/ruby/lib/jam_ruby/models/generic_state.rb index 9d6a23904..5722a9424 100644 --- a/ruby/lib/jam_ruby/models/generic_state.rb +++ b/ruby/lib/jam_ruby/models/generic_state.rb @@ -27,6 +27,10 @@ module JamRuby GenericState.singleton.affiliate_tallied_at end + def self.bounce_check_at + GenericState.singleton.bounce_check_at + end + def self.singleton GenericState.find('default') end diff --git a/ruby/lib/jam_ruby/resque/scheduled/bounced_emails.rb b/ruby/lib/jam_ruby/resque/scheduled/bounced_emails.rb new file mode 100644 index 000000000..9774d8211 --- /dev/null +++ b/ruby/lib/jam_ruby/resque/scheduled/bounced_emails.rb @@ -0,0 +1,48 @@ +require 'json' +require 'resque' +require 'resque-retry' +require 'net/http' +require 'digest/md5' + +module JamRuby + + # periodically scheduled to find jobs that need retrying, and cleanup activities + class BouncedEmails + extend Resque::Plugins::JamLonelyJob + + @queue = :bounced_emails + + @@log = Logging.logger[BouncedEmails] + + def self.lock_timeout + # this should be enough time to make sure the job has finished, but not so long that the system isn't recovering from a abandoned job + 120 + end + + def self.perform + if Rails.application.config.check_bounced_emails + start = GenericState.bounce_check_at + + if start.nil? + start = (Date.today - 1).to_s + end + + end_date = Date.today.to_s + + result = bounces.retrieve({start_date: start, end_date: end_date}) + + result.each do |item| + user = User.find_by_email(item["email"]) + if user + User.where(id: user.id).update_all(subscribe_email: false, bounced: true) + end + end + + singleton = GenericState.singleton + singleton.bounce_check_at = end_date + end + end + + end + +end \ No newline at end of file diff --git a/web/Gemfile b/web/Gemfile index bd40d9b4b..a2054a95c 100644 --- a/web/Gemfile +++ b/web/Gemfile @@ -94,6 +94,7 @@ gem 'influxdb-rails', '0.1.10' gem 'sitemap_generator' gem 'bower-rails', "~> 0.9.2" gem 'react-rails', '~> 1.0' +gem 'sendgrid_toolkit', '>= 1.1.1' #gem "browserify-rails", "~> 0.7" source 'https://rails-assets.org' do diff --git a/web/config/application.rb b/web/config/application.rb index 4b53f5b3d..d5de1a170 100644 --- a/web/config/application.rb +++ b/web/config/application.rb @@ -410,5 +410,6 @@ if defined?(Bundler) config.midi_enabled = true config.verify_email_enabled = false config.kickbox_api_key = 'e262991e292dd5fe382c4a69f2b359f718cf267712b8684c9c28d6402ec18965' + config.check_bounced_emails = false end end diff --git a/web/config/initializers/email.rb b/web/config/initializers/email.rb index 0acd92833..48d54e0a3 100644 --- a/web/config/initializers/email.rb +++ b/web/config/initializers/email.rb @@ -16,3 +16,6 @@ ActionMailer::Base.smtp_settings = { } Rails.logger.debug("ActionMailer.delivery_method = #{ActionMailer::Base.delivery_method}") + +SendgridToolkit.api_user = Rails.application.config.email_smtp_user_name +SendgridToolkit.api_key = Rails.application.config.email_smtp_password \ No newline at end of file