#!/usr/bin/env ruby $VERBOSE = true hpmail = ENV['HOME'] + '/mail/hp' grmail = ENV['HOME'] + '/mail/griffis1' gemail = ENV['HOME'] + '/mail/gentoo' boxes = nil # Parse incoming message into header and body # ARGV contains [ '--', 'recipient@domain' ] so need to specify $stdin header = $stdin.gets('') # paragraph mode body = $stdin.gets(nil) || '' # slurp mode, handle empty body header.gsub!(/^Status:.*\n/, '') # remove old Status header header.gsub!(/^Lines:.*\n/, '') # add Lines header header.sub!(/\Z/, "Lines: #{body.count "\n"}\n") # Modify the header to make it more suitable for scanning... this is # not the header that we'll send, though. First, join continued # lines. Second, strip headers that can lead to a false hp-match. scanhdr = header.gsub(/\n\s+(?=\S)/, ' ') scanhdr.gsub!(/^(Message-ID|References|Subject|In-Reply-To|Resent-From):.*/, '') # Sending to/from hp or from elsewhere? Need to use hp servers for # either situation since otherwise hp rejects the mail as spoofed. if scanhdr =~ /\b(compaq|cpqcorp|dec|hp)\.(com|net)\b/ boxes = [ hpmail+'/sent', hpmail+'/Outbox' ] if header !~ /^Resent-From:/ # check original header boxes.unshift hpmail+'/INBOX' end #elsif scanhdr =~ /\bgentoo\.org\b/ # boxes = [ gemail+'/sent', gemail+'/Outbox' ] else boxes = [ grmail+'/sent', grmail+'/Outbox' ] end boxes.each do |b| IO.popen('-', 'w') do |f| if f if b =~ /Outbox/ f.print(header, body) else f.print(header.sub(/\Z/, "Status: RO\n"), body) end else fname = `/usr/bin/safecat #{b}/tmp #{b}/new`.strip Kernel.exit! $?.exitstatus if $?.exitstatus != 0 if b !~ /Outbox/ # This is the maildir equivalent of Status: RO File.rename("#{b}/new/#{fname}", "#{b}/cur/#{fname}:2,S") end Kernel.exit! 0 end end if $?.exitstatus != 0 $stderr.puts "############################################################" $stderr.puts "#####" $stderr.puts "##### mailout failed to save to " + b $stderr.puts "#####" $stderr.puts "############################################################" exit $?.exitstatus end end