package MailBot::UI::OneMsg; #use MailBot::Internet; use Mail::Internet; use MailBot::Util; use MailBot::Entity; use MailBot::Config; use MailBot::UI::Loop; @ISA = qw( MailBot::UI ); use strict; # my $SENDMAIL = "/usr/bin/sendmail"; # jf test sendmail Precedence line my $gDoubleBounce = 0; #my $MAIL = "/bin/Mail"; #(-x $MAIL) or die "no $MAIL program"; sub d { MailBot::Util::debug @_; } sub vInit { my $self = shift; my $config = MailBot::Config::current; # fix Mail::Util bug defined $ENV{LOGNAME} or $ENV{LOGNAME} = (getpwuid($>))[0]; $$self{BOUNCE_ADDR} = $config -> getBounceAddr; $$self{NEVER_SEND} = $config -> neverSend; } sub vQuotaMultiplier { 1; } sub doubleBounce { my $self = shift; my $badMessage = shift; my $error = shift; eval { $gDoubleBounce++ and die "doubleBounce message double-bounced"; my $bounceAddr = $$self{BOUNCE_ADDR}; die "no bounce address" unless $bounceAddr =~ /./; my @data = ("$error\n\n", "____Here is the double-bounced message____\n\n", &MailBot::Util::messageToArray($badMessage) ); my $envelope = new MailBot::Envelope; &MailBot::Entity::setEnvelope($envelope); my $entity = build MailBot::Entity(Data => \@data); $entity -> head -> replace('to',$bounceAddr); $entity -> head -> replace('subject','GetWeb double-bounce'); $self -> vSendMessage($entity); }; if ($@) { print STDERR "triple bounce: $@"; } $gDoubleBounce = 0; die "BOUNCE: saw double-bounce. Closing down to prevent mail loop!"; } sub vGetMessage { my $self = shift; my $message = new Mail::Internet(\*STDIN); $self -> done; $self -> analyzeMessage($message); } sub analyzeMessage { my $self = shift; my $message = shift; my $header = $message -> head; my $loop; eval { $loop = new MailBot::UI::Loop($message); }; if ($@) { die $@ unless $@ =~ s/^LOOP:\s*//; $self -> doubleBounce($message,$@); } my $subject = $header -> get("Subject"); $message -> remove_sig(); my $paBody = $message -> body(); $$self{LOOP} = $loop; $self -> setIncoming($message); $self -> save($message,"incoming"); 0; } sub vSendMessage { my $self = shift; my $internet = shift; # jfj add getweb version number to headers # jfj check errors-to field my $bounceAddr = $$self{BOUNCE_ADDR}; defined $bounceAddr or $bounceAddr = ""; if (defined $$self{LOOP}) { $$self{LOOP} -> makeAutoResponse($internet, $bounceAddr); } if ($$self{NEVER_SEND}) { $internet -> print; return; } my $config = MailBot::Config::current; $ENV{SMTPHOSTS} = $config -> getIniVal("smtp","host"); $self -> save($internet,"outgoing"); $internet -> smtpsend($bounceAddr) or die "could not send to " . $internet -> get('to'); } 1;