aboutsummaryrefslogtreecommitdiffstats
path: root/script/handle-mail-replies
diff options
context:
space:
mode:
authorRobin Houston <robin.houston@gmail.com>2011-09-07 14:59:40 +0100
committerRobin Houston <robin.houston@gmail.com>2011-09-07 14:59:40 +0100
commite73c5b6b1ffddc19ba0eef0a228ec2574d511525 (patch)
tree615dde9cce619d18b9b32b95e4788b67f9ec2b72 /script/handle-mail-replies
parenta273d096be9eacb7150b93844049eb1917cdaf4b (diff)
parent5f4a2e316da8e9415b81b9fe1d8d5effe354803b (diff)
Merge branch 'wdtk' of github.com:sebbacon/alaveteli into wdtk
Conflicts: script/handle-mail-replies
Diffstat (limited to 'script/handle-mail-replies')
-rwxr-xr-xscript/handle-mail-replies58
1 files changed, 50 insertions, 8 deletions
diff --git a/script/handle-mail-replies b/script/handle-mail-replies
index e4faeef90..5762ddd31 100755
--- a/script/handle-mail-replies
+++ b/script/handle-mail-replies
@@ -11,16 +11,58 @@
# We want to avoid loading rails unless we need it, so we start by just loading the
# config file ourselves.
-alaveteli_dir = File.join(File.dirname(__FILE__), '..')
-$:.push(File.join(alaveteli_dir, "commonlib", "rblib"))
+$alaveteli_dir = File.join(File.dirname(__FILE__), '..')
+$:.push(File.join($alaveteli_dir, "commonlib", "rblib"))
load "config.rb"
-MySociety::Config.set_file(File.join(alaveteli_dir, 'config', 'general'), true)
+MySociety::Config.set_file(File.join($alaveteli_dir, 'config', 'general'), true)
MySociety::Config.load_default
-message = $stdin.read
+def main
+ load_rails
+ raw_message = $stdin.read
+ pfa = permanently_failed_address(raw_message)
+ if pfa.nil?
+ not_a_bounce(raw_message)
+ else
+ record_bounce(pfa, raw_message)
+ end
+end
+
+def permanently_failed_address(raw_message)
+ message = TMail::Mail.parse(raw_message)
-forward_non_bounces_to = MySociety::Config.get("FORWARD_NONBOUNCE_RESPONSES_TO", "user-support@localhost")
-IO.popen("/usr/sbin/sendmail -i #{forward_non_bounces_to}", "w") do |f|
- f.write(message);
- f.close;
+ if message.header_string("Return-Path") == "<>"
+ # Some sort of auto-response
+
+ # Check for Exim’s X-Failed-Recipients header
+ failed_recipients = message.header_string("X-Failed-Recipients")
+ if !failed_recipients.nil?
+ # The X-Failed-Recipients header contains the email address that failed
+ # Check for the words "This is a permanent error." in the body, to indicate
+ # a permanent failure
+ if message.body =~ /This is a permanent error./
+ return failed_recipients
+ end
+ end
+ return nil
+ end
end
+
+def not_a_bounce(raw_message)
+ forward_non_bounces_to = MySociety::Config.get("FORWARD_NONBOUNCE_RESPONSES_TO", "user-support@localhost")
+ IO.popen("/usr/sbin/sendmail -i #{forward_non_bounces_to}", "w") do |f|
+ f.write(raw_message);
+ f.close;
+ end
+end
+
+def load_rails
+ require File.join($alaveteli_dir, 'config', 'boot')
+ require RAILS_ROOT + '/config/environment'
+end
+
+def record_bounce(email_address, bounce_message)
+ User.record_bounce_for_email(email_address, bounce_message)
+end
+
+main