package Clients::Camelot::Mail; use strict; use POE qw(Session); use Carp; ###################################################################### use Mail::Send; use PGP5::Pipe; use PGP5::Keyring; use User::Log; use File::Basename; use MIME::QuotedPrint (); ############################################# sub _mail { my($send, $subject, $body, $to, @cc)=@_; $send->subject($subject); $send->to($to); $send->set('Cc', @cc) if @cc; ## Send the message my $fh=$send->open('sendmail'); $fh->print($body); $fh->close; return; } ###################################################################### sub mail { my $__ARGS; if(defined $_[ARG1] or ref($_[ARG0]) ne 'HASH') { $__ARGS = [@_[ARG0..$#_]]; } else { $__ARGS = $_[ARG0]; } croak "Wrong number of parameters" unless ref($__ARGS) eq 'HASH' ? 3 == keys %$__ARGS : 3 == @$__ARGS; croak "Required parameter subject missing" if not defined (ref $__ARG eq 'HASH' ? $__ARG->{subject} : $__ARG->[0]); my $subject = (ref $__ARG eq 'HASH' ? $__ARG->{subject} : $__ARG->[0]); croak "Parameter subject must be a scalar" if ref $subject; croak "Required parameter text missing" if not defined (ref $__ARG eq 'HASH' ? $__ARG->{text} : $__ARG->[1]); my $text = (ref $__ARG eq 'HASH' ? $__ARG->{text} : $__ARG->[1]); croak "Parameter text must be a scalar" if ref $text; my @to; { my $t=(ref $__ARG eq 'HASH' ? $__ARG->{to} : $__ARG->[2]); croak "Parameter to must be an array reference or scalar" if (ref($t)||'ARRAY') ne 'ARRAY'; @to = ref $t ? @$t : $t; } my $heap=$_[HEAP]; my $__sub=sub { my $send=Mail::Send->new(); $send->set('MIME-Version', '1.0'); $send->set('Content-Type', 'text/plain; charset="iso-8859-1"'); $send->set('Content-Transfer-Encoding', 'quoted-printable'); _mail($send, $subject, scalar MIME::QuotedPrint::encode_qp($text), @to); ::mylog("Mailing '$subject' to '", join("', '", @to), "'"); }; my @ret=eval $__sub if wantarray; my $ret=eval $__sub unless wantarray; if($@) { warn $@; return; } return @ret if wantarray; return $ret; } ###################################################################### sub pgp5mail { my $__ARGS; if(defined $_[ARG1] or ref($_[ARG0]) ne 'HASH') { $__ARGS = [@_[ARG0..$#_]]; } else { $__ARGS = $_[ARG0]; } croak "Wrong number of parameters" unless ref($__ARGS) eq 'HASH' ? 3 == keys %$__ARGS : 3 == @$__ARGS; croak "Required parameter subject missing" if not defined (ref $__ARG eq 'HASH' ? $__ARG->{subject} : $__ARG->[0]); my $subject = (ref $__ARG eq 'HASH' ? $__ARG->{subject} : $__ARG->[0]); croak "Parameter subject must be a scalar" if ref $subject; croak "Required parameter text missing" if not defined (ref $__ARG eq 'HASH' ? $__ARG->{text} : $__ARG->[1]); my $text = (ref $__ARG eq 'HASH' ? $__ARG->{text} : $__ARG->[1]); croak "Parameter text must be a scalar" if ref $text; my @to; { my $t=(ref $__ARG eq 'HASH' ? $__ARG->{to} : $__ARG->[2]); croak "Parameter to must be an array reference or scalar" if (ref($t)||'ARRAY') ne 'ARRAY'; @to = ref $t ? @$t : $t; } my $heap=$_[HEAP]; my $__sub=sub { my $crypt; my(@keys, @err, $key); eval { foreach my $dest (@to) { $key=$heap->{keyring}->Find(Desc=>$dest); if($key) { push @keys, $key; } else { push @err, "Error: Unable to find PGP5 key for '$dest'"; } } $text=~s/\r//g; $text=~s/\n/\r\n/g; ::mylog("Encrypted to ", join ', ', map {$_->{Keyid}} @keys); $crypt=$heap->{pgp}->Encrypt(Text=>$text, Armor=>1, Key=>\@keys, # Ascii=>1, ); }; push @err, "Error: $@" if $@; ::mylog(join "\n", @err) if(@err); $crypt=join "\n", ('-' x 40), @err, ('-' x 40), '', $crypt if @err; my $send=Mail::Send->new(); _mail($send, $subject, $crypt, @to); ::mylog("PGP5 Mailing '$subject' to '", join("', '", @to), "'"); }; my @ret=eval $__sub if wantarray; my $ret=eval $__sub unless wantarray; if($@) { warn $@; return; } return @ret if wantarray; return $ret; } ###################################################################### sub reload { my $__ARGS; if(defined $_[ARG1] or ref($_[ARG0]) ne 'HASH') { $__ARGS = [@_[ARG0..$#_]]; } else { $__ARGS = $_[ARG0]; } croak "Wrong number of parameters" unless ref($__ARGS) eq 'HASH' ? 0 == keys %$__ARGS : 0 == @$__ARGS; my $heap=$_[HEAP]; my $__sub=sub { $heap->{pgp}=new PGP5::Pipe; die "Unable to create PGP5::Pipe\n" unless ref $heap->{pgp}; $heap->{keyring}=new PGP5::Keyring $heap->{pgp}; die "Unable to create PGP5::Keyring\n" unless ref $heap->{keyring}; ::mylog("Loaded the following keys: \n", join '', map {$_->as_string} $heap->{keyring}->List_Keys); }; my @ret=eval $__sub if wantarray; my $ret=eval $__sub unless wantarray; if($@) { warn $@; return; } return @ret if wantarray; return $ret; } ###################################################################### sub _start { my($heap, $kernel)=@_[HEAP, KERNEL]; $kernel->alias_set(q(Clients_Camelot_Mail)); $kernel->sig('USR1', 'reload'); $kernel->yield('reload'); # make sure keys are loaded $kernel->call('IKC', 'publish', q(Clients_Camelot_Mail), [qw(mail pgp5mail reload)]); } ###################################################################### POE::Session->new (__PACKAGE__, [qw(_start mail pgp5mail reload)] ); 1; __DATA__ Generated-on: Tue Sep 28 20:08:57 1999 Generated-from: /home/wcamelot/prive/user-daemon/mail.interface POE::Interface: 0.01 XML::DOM: 1.25 XML::Parser: 2.23