aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorGeorge Claghorn <george.claghorn@gmail.com>2018-11-05 14:21:27 -0500
committerGitHub <noreply@github.com>2018-11-05 14:21:27 -0500
commit152a442b1902050265ddcef56f5506b3bfbb12e4 (patch)
treebd365d76299e978a6e974a64f5ff3d47f0614514 /lib
parentc474daefb18e9bab96f6f0bb0bb30dfc00058cb3 (diff)
parentac7fd0e56886eb134554789e014d2736b95d7042 (diff)
downloadrails-152a442b1902050265ddcef56f5506b3bfbb12e4.tar.gz
rails-152a442b1902050265ddcef56f5506b3bfbb12e4.tar.bz2
rails-152a442b1902050265ddcef56f5506b3bfbb12e4.zip
Merge pull request #1 from basecamp/ingresses
Accept inbound emails from a variety of ingresses
Diffstat (limited to 'lib')
-rw-r--r--lib/action_mailbox.rb1
-rw-r--r--lib/action_mailbox/engine.rb12
-rw-r--r--lib/action_mailbox/test_helper.rb11
-rw-r--r--lib/tasks/ingress.rake41
4 files changed, 58 insertions, 7 deletions
diff --git a/lib/action_mailbox.rb b/lib/action_mailbox.rb
index ae37cb84ed..fbc8122d9d 100644
--- a/lib/action_mailbox.rb
+++ b/lib/action_mailbox.rb
@@ -6,6 +6,7 @@ module ActionMailbox
autoload :Base
autoload :Router
+ mattr_accessor :ingress
mattr_accessor :logger
mattr_accessor :incinerate_after, default: 30.days
end
diff --git a/lib/action_mailbox/engine.rb b/lib/action_mailbox/engine.rb
index b4758aacb5..cf438d8f24 100644
--- a/lib/action_mailbox/engine.rb
+++ b/lib/action_mailbox/engine.rb
@@ -14,5 +14,17 @@ module ActionMailbox
ActionMailbox.incinerate_after = app.config.action_mailbox.incinerate_after || 30.days
end
end
+
+ initializer "action_mailbox.ingress" do
+ config.after_initialize do |app|
+ if ActionMailbox.ingress = app.config.action_mailbox.ingress.presence
+ config.to_prepare do
+ if ingress_controller_class = "ActionMailbox::Ingresses::#{ActionMailbox.ingress.to_s.classify}::InboundEmailsController".safe_constantize
+ ingress_controller_class.prepare
+ end
+ end
+ end
+ end
+ end
end
end
diff --git a/lib/action_mailbox/test_helper.rb b/lib/action_mailbox/test_helper.rb
index a74ea8ef57..23b2bb02ca 100644
--- a/lib/action_mailbox/test_helper.rb
+++ b/lib/action_mailbox/test_helper.rb
@@ -5,18 +5,15 @@ module ActionMailbox
# Create an InboundEmail record using an eml fixture in the format of message/rfc822
# referenced with +fixture_name+ located in +test/fixtures/files/fixture_name+.
def create_inbound_email_from_fixture(fixture_name, status: :processing)
- create_inbound_email file_fixture(fixture_name), filename: fixture_name, status: status
+ create_inbound_email file_fixture(fixture_name).read, status: status
end
def create_inbound_email_from_mail(status: :processing, **mail_options)
- raw_email = Tempfile.new.tap { |io| io.write Mail.new(mail_options).to_s }
- create_inbound_email(raw_email, status: status)
+ create_inbound_email Mail.new(mail_options).to_s, status: status
end
- def create_inbound_email(io, filename: 'mail.eml', status: :processing)
- ActionMailbox::InboundEmail.create_and_extract_message_id! \
- ActionDispatch::Http::UploadedFile.new(tempfile: io, filename: filename, type: 'message/rfc822'),
- status: status
+ def create_inbound_email(source, status: :processing)
+ ActionMailbox::InboundEmail.create_and_extract_message_id! source, status: status
end
def receive_inbound_email_from_fixture(*args)
diff --git a/lib/tasks/ingress.rake b/lib/tasks/ingress.rake
new file mode 100644
index 0000000000..510951aa2a
--- /dev/null
+++ b/lib/tasks/ingress.rake
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+namespace :action_mailbox do
+ namespace :ingress do
+ desc "Pipe an inbound email from STDIN to the Postfix ingress at the given URL"
+ task :postfix do
+ require "active_support"
+ require "active_support/core_ext/object/blank"
+ require "http"
+
+ unless url = ENV["URL"].presence
+ abort "5.3.5 URL is required"
+ end
+
+ unless password = ENV["INGRESS_PASSWORD"].presence
+ abort "5.3.5 INGRESS_PASSWORD is required"
+ end
+
+ begin
+ response = HTTP.basic_auth(user: "actionmailbox", pass: password)
+ .timeout(connect: 1, write: 10, read: 10)
+ .post(url, headers: { "Content-Type" => "message/rfc822", "User-Agent" => ENV.fetch("USER_AGENT", "Postfix") }, body: STDIN)
+
+ case
+ when response.status.success?
+ puts "2.0.0 HTTP #{response.status}"
+ when response.status.unauthorized?
+ abort "4.7.0 HTTP #{response.status}"
+ when response.status.unsupported_media_type?
+ abort "5.6.1 HTTP #{response.status}"
+ else
+ abort "4.0.0 HTTP #{response.status}"
+ end
+ rescue HTTP::ConnectionError => error
+ abort "4.4.2 Error connecting to the Postfix ingress: #{error.message}"
+ rescue HTTP::TimeoutError
+ abort "4.4.7 Timed out piping to the Postfix ingress"
+ end
+ end
+ end
+end