aboutsummaryrefslogtreecommitdiffstats
path: root/actionmailbox/lib
diff options
context:
space:
mode:
authorGeorge Claghorn <george.claghorn@gmail.com>2019-01-12 21:38:26 -0500
committerGitHub <noreply@github.com>2019-01-12 21:38:26 -0500
commit512b5316dd33a8aa36821ee9b134d6652fd4a35f (patch)
tree81e3434a480765ff76f41f7994685e9391e28aee /actionmailbox/lib
parentbb75d68fe2262199a16973c09a8b2749542c7590 (diff)
downloadrails-512b5316dd33a8aa36821ee9b134d6652fd4a35f.tar.gz
rails-512b5316dd33a8aa36821ee9b134d6652fd4a35f.tar.bz2
rails-512b5316dd33a8aa36821ee9b134d6652fd4a35f.zip
Add Exim and Qmail support to Action Mailbox
Diffstat (limited to 'actionmailbox/lib')
-rw-r--r--actionmailbox/lib/action_mailbox/relayer.rb (renamed from actionmailbox/lib/action_mailbox/postfix_relayer.rb)28
-rw-r--r--actionmailbox/lib/tasks/ingress.rake58
2 files changed, 71 insertions, 15 deletions
diff --git a/actionmailbox/lib/action_mailbox/postfix_relayer.rb b/actionmailbox/lib/action_mailbox/relayer.rb
index d43c56ed2b..e2890acb60 100644
--- a/actionmailbox/lib/action_mailbox/postfix_relayer.rb
+++ b/actionmailbox/lib/action_mailbox/relayer.rb
@@ -5,19 +5,27 @@ require "net/http"
require "uri"
module ActionMailbox
- class PostfixRelayer
- class Result < Struct.new(:output)
+ class Relayer
+ class Result < Struct.new(:status_code, :message)
def success?
!failure?
end
def failure?
- output.match?(/\A[45]\.\d{1,3}\.\d{1,3}(\s|\z)/)
+ transient_failure? || permanent_failure?
+ end
+
+ def transient_failure?
+ status_code.start_with?("4.")
+ end
+
+ def permanent_failure?
+ status_code.start_with?("5.")
end
end
CONTENT_TYPE = "message/rfc822"
- USER_AGENT = "Action Mailbox Postfix relayer v#{ActionMailbox.version}"
+ USER_AGENT = "Action Mailbox relayer v#{ActionMailbox.version}"
attr_reader :uri, :username, :password
@@ -28,18 +36,18 @@ module ActionMailbox
def relay(source)
case response = post(source)
when Net::HTTPSuccess
- Result.new "2.0.0 Successfully relayed message to Postfix ingress"
+ Result.new "2.0.0", "Successfully relayed message to ingress"
when Net::HTTPUnauthorized
- Result.new "4.7.0 Invalid credentials for Postfix ingress"
+ Result.new "4.7.0", "Invalid credentials for ingress"
else
- Result.new "4.0.0 HTTP #{response.code}"
+ Result.new "4.0.0", "HTTP #{response.code}"
end
rescue IOError, SocketError, SystemCallError => error
- Result.new "4.4.2 Network error relaying to Postfix ingress: #{error.message}"
+ Result.new "4.4.2", "Network error relaying to ingress: #{error.message}"
rescue Timeout::Error
- Result.new "4.4.2 Timed out relaying to Postfix ingress"
+ Result.new "4.4.2", "Timed out relaying to ingress"
rescue => error
- Result.new "4.0.0 Error relaying to Postfix ingress: #{error.message}"
+ Result.new "4.0.0", "Error relaying to ingress: #{error.message}"
end
private
diff --git a/actionmailbox/lib/tasks/ingress.rake b/actionmailbox/lib/tasks/ingress.rake
index f775bbdfd7..43b613ea12 100644
--- a/actionmailbox/lib/tasks/ingress.rake
+++ b/actionmailbox/lib/tasks/ingress.rake
@@ -2,12 +2,37 @@
namespace :action_mailbox do
namespace :ingress do
- desc "Pipe an inbound email from STDIN to the Postfix ingress (URL and INGRESS_PASSWORD required)"
- task :postfix do
+ task :environment do
require "active_support"
require "active_support/core_ext/object/blank"
- require "action_mailbox/postfix_relayer"
+ require "action_mailbox/relayer"
+ end
+
+ desc "Relay an inbound email from Exim to Action Mailbox (URL and INGRESS_PASSWORD required)"
+ task exim: "action_mailbox:ingress:environment" do
+ url, password = ENV.values_at("URL", "INGRESS_PASSWORD")
+
+ if url.blank? || password.blank?
+ print "URL and INGRESS_PASSWORD are required"
+ exit 64 # EX_USAGE
+ end
+
+ ActionMailbox::Relayer.new(url: url, password: password).relay(STDIN.read).tap do |result|
+ print result.message
+
+ case
+ when result.success?
+ exit 0
+ when result.transient_failure?
+ exit 75 # EX_TEMPFAIL
+ else
+ exit 69 # EX_UNAVAILABLE
+ end
+ end
+ end
+ desc "Relay an inbound email from Postfix to Action Mailbox (URL and INGRESS_PASSWORD required)"
+ task postfix: "action_mailbox:ingress:environment" do
url, password = ENV.values_at("URL", "INGRESS_PASSWORD")
if url.blank? || password.blank?
@@ -15,10 +40,33 @@ namespace :action_mailbox do
exit 1
end
- ActionMailbox::PostfixRelayer.new(url: url, password: password).relay(STDIN.read).tap do |result|
- print result.output
+ ActionMailbox::Relayer.new(url: url, password: password).relay(STDIN.read).tap do |result|
+ print "#{result.status_code} #{result.message}"
exit result.success?
end
end
+
+ desc "Relay an inbound email from Qmail to Action Mailbox (URL and INGRESS_PASSWORD required)"
+ task qmail: "action_mailbox:ingress:environment" do
+ url, password = ENV.values_at("URL", "INGRESS_PASSWORD")
+
+ if url.blank? || password.blank?
+ print "URL and INGRESS_PASSWORD are required"
+ exit 111
+ end
+
+ ActionMailbox::Relayer.new(url: url, password: password).relay(STDIN.read).tap do |result|
+ print result.message
+
+ case
+ when result.success?
+ exit 0
+ when result.transient_failure?
+ exit 111
+ else
+ exit 100
+ end
+ end
+ end
end
end