diff options
author | Robin Houston <robin.houston@gmail.com> | 2011-09-07 14:59:40 +0100 |
---|---|---|
committer | Robin Houston <robin.houston@gmail.com> | 2011-09-07 14:59:40 +0100 |
commit | e73c5b6b1ffddc19ba0eef0a228ec2574d511525 (patch) | |
tree | 615dde9cce619d18b9b32b95e4788b67f9ec2b72 /script/handle-mail-replies | |
parent | a273d096be9eacb7150b93844049eb1917cdaf4b (diff) | |
parent | 5f4a2e316da8e9415b81b9fe1d8d5effe354803b (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-x | script/handle-mail-replies | 58 |
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 |