/[notice-sender]/trunk/Nos.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /trunk/Nos.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 60 by dpavlin, Tue Jun 21 21:24:10 2005 UTC revision 67 by dpavlin, Fri Jul 8 17:00:20 2005 UTC
# Line 16  our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all' Line 16  our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'
16  our @EXPORT = qw(  our @EXPORT = qw(
17  );  );
18    
19  our $VERSION = '0.5';  our $VERSION = '0.6';
20    
21  use Class::DBI::Loader;  use Class::DBI::Loader;
22  use Email::Valid;  use Email::Valid;
# Line 27  use Email::Simple; Line 27  use Email::Simple;
27  use Email::Address;  use Email::Address;
28  use Mail::DeliveryStatus::BounceParser;  use Mail::DeliveryStatus::BounceParser;
29  use Class::DBI::AbstractSearch;  use Class::DBI::AbstractSearch;
30    use Mail::Alias;
31    use Cwd qw(abs_path);
32    
33    
34  =head1 NAME  =head1 NAME
# Line 120  sub new { Line 122  sub new {
122    
123  =head2 new_list  =head2 new_list
124    
125  Create new list. Required arguments are name of C<list> and  Create new list. Required arguments are name of C<list>, C<email> address
126  C<email> address.  and path to C<aliases> file.
127    
128   $nos->new_list(   $nos->new_list(
129          list => 'My list',          list => 'My list',
130          from => 'Outgoing from comment',          from => 'Outgoing from comment',
131          email => 'my-list@example.com',          email => 'my-list@example.com',
132            aliases => '/etc/mail/mylist',
133            archive => '/path/to/mbox/archive',
134   );   );
135    
136  Returns ID of newly created list.  Returns ID of newly created list.
# Line 154  sub new_list { Line 158  sub new_list {
158  }  }
159    
160    
161    =head2 delete_list
162    
163    Delete list from database.
164    
165     my $ok = delete_list(
166            list => 'My list'
167     );
168    
169    Returns false if list doesn't exist.
170    
171    =cut
172    
173    sub delete_list {
174            my $self = shift;
175    
176            my $args = {@_};
177    
178            croak "need list to delete" unless ($args->{'list'});
179    
180            $args->{'list'} = lc($args->{'list'});
181    
182            my $lists = $self->{'loader'}->find_class('lists');
183    
184            my $this_list = $lists->search( name => $args->{'list'} )->first || return;
185    
186            $this_list->delete || croak "can't delete list\n";
187    
188            return $lists->dbi_commit || croak "can't commit";
189    }
190    
191    
192  =head2 add_member_to_list  =head2 add_member_to_list
193    
194  Add new member to list  Add new member to list
# Line 343  sub delete_member_from_list { Line 378  sub delete_member_from_list {
378          my $this_user = $user->search( email => $args->{'email'} )->first || croak "can't find user: ".$args->{'email'};          my $this_user = $user->search( email => $args->{'email'} )->first || croak "can't find user: ".$args->{'email'};
379          my $this_list = $list->search( name => $args->{'list'} )->first || croak "can't find list: ".$args->{'list'};          my $this_list = $list->search( name => $args->{'list'} )->first || croak "can't find list: ".$args->{'list'};
380    
381          my $this_user_list = $user_list->search_where( list_id => $this_list->id, user_id => $this_list->id )->first || return;          my $this_user_list = $user_list->search_where( list_id => $this_list->id, user_id => $this_user->id )->first || return;
382    
383          $this_user_list->delete || croak "can't delete user from list\n";          $this_user_list->delete || croak "can't delete user from list\n";
384    
# Line 489  sub send_queued_messages { Line 524  sub send_queued_messages {
524                          if ($sent->search( message_id => $m->message_id, user_id => $u->user_id )) {                          if ($sent->search( message_id => $m->message_id, user_id => $u->user_id )) {
525                                  print "SKIP $to_email message allready sent\n";                                  print "SKIP $to_email message allready sent\n";
526                          } else {                          } else {
527                                  print "=> $to_email\n";                                  print "=> $to_email ";
528    
529                                  my $secret = $m->list_id->name . " " . $u->user_id->email . " " . $m->message_id;                                  my $secret = $m->list_id->name . " " . $u->user_id->email . " " . $m->message_id;
530                                  my $auth = Email::Auth::AddressHash->new( $secret, $self->{'hash_len'} );                                  my $auth = Email::Auth::AddressHash->new( $secret, $self->{'hash_len'} );
# Line 515  sub send_queued_messages { Line 550  sub send_queued_messages {
550                                  $m_obj->header_set('X-Nos-Hash', $hash);                                  $m_obj->header_set('X-Nos-Hash', $hash);
551    
552                                  # really send e-mail                                  # really send e-mail
553                                    my $sent_status;
554    
555                                  if (@email_send_options) {                                  if (@email_send_options) {
556                                          send $email_send_driver => $m_obj->as_string, @email_send_options;                                          $sent_status = send $email_send_driver => $m_obj->as_string, @email_send_options;
557                                  } else {                                  } else {
558                                          send $email_send_driver => $m_obj->as_string;                                          $sent_status = send $email_send_driver => $m_obj->as_string;
559                                  }                                  }
560    
561                                  $sent->create({                                  croak "can't send e-mail: $sent_status\n\nOriginal e-mail follows:\n".$m_obj->as_string unless ($sent_status);
562                                          message_id => $m->message_id,                                  my @bad = @{ $sent_status->prop('bad') };
563                                          user_id => $u->user_id,                                  croak "failed sending to ",join(",",@bad) if (@bad);
564                                          hash => $hash,  
565                                  });                                  if ($sent_status) {
566                                  $sent->dbi_commit;  
567                                            $sent->create({
568                                                    message_id => $m->message_id,
569                                                    user_id => $u->user_id,
570                                                    hash => $hash,
571                                            });
572                                            $sent->dbi_commit;
573    
574                                            print " - $sent_status\n";
575    
576                                    } else {
577                                            warn "ERROR: $sent_status\n";
578                                    }
579    
580                                  if ($sleep) {                                  if ($sleep) {
581                                          warn "sleeping $sleep seconds\n";                                          warn "sleeping $sleep seconds\n";
# Line 642  sub inbox_message { Line 691  sub inbox_message {
691    
692  Beware of dragons! You shouldn't need to call those methods directly.  Beware of dragons! You shouldn't need to call those methods directly.
693    
694    
695    =head2 _add_aliases
696    
697    Add new list to C</etc/aliases> (or equivavlent) file
698    
699     my $ok = $nos->add_aliases(
700            list => 'My list',
701            email => 'my-list@example.com',
702            aliases => '/etc/mail/mylist',
703            archive => '/path/to/mbox/archive',
704    
705     );
706    
707    C<archive> parametar is optional.
708    
709    Return false on failure.
710    
711    =cut
712    
713    sub _add_aliases {
714            my $self = shift;
715    
716            my $arg = {@_};
717    
718            croak "need list and email options" unless ($arg->{'list'} && $arg->{'email'});
719    
720            my $aliases = $arg->{'aliases'} || croak "need aliases";
721    
722            unless (-e $aliases) {
723                    warn "aliases file $aliases doesn't exist, creating empty\n";
724                    open(my $fh, '>', $aliases) || croak "can't create $aliases: $!";
725                    close($fh);
726                    chmod 0777, $aliases || warn "can't change permission to 0777";
727            }
728    
729            my $a = new Mail::Alias($aliases) || croak "can't open aliases file $aliases: $!";
730    
731            my $target = '';
732    
733            if (my $archive = $arg->{'archive'}) {
734                    $target .= "$archive, ";
735    
736                    if (! -e $archive) {
737                            warn "please make sure that file $archive is writable for your e-mail user (defaulting to bad 777 permission for now)";
738    
739                            open(my $fh, '>', $archive) || croak "can't create archive file $archive: $!";
740                            close($fh);
741                            chmod 0777, $archive || croak "can't chmod archive file $archive to 0777: $!";
742                    }
743            }
744    
745            # resolve my path to absolute one
746            my $self_path = abs_path($0);
747            $self_path =~ s#/[^/]+$##;
748            $self_path =~ s#/t/*$#/#;
749    
750            $target .= qq#| cd $self_path && ./sender.pl --inbox="$arg->{'list'}"#;
751    
752            unless ($a->append($arg->{'email'}, $target)) {
753                    croak "can't add alias ".$a->error_check;
754            }
755    
756            return 1;
757    }
758    
759  =head2 _add_list  =head2 _add_list
760    
761  Create new list  Create new list
# Line 650  Create new list Line 764  Create new list
764          list => 'My list',          list => 'My list',
765          from => 'Outgoing from comment',          from => 'Outgoing from comment',
766          email => 'my-list@example.com',          email => 'my-list@example.com',
767            aliases => '/etc/mail/mylist',
768   );   );
769    
770  Returns C<Class::DBI> object for created list.  Returns C<Class::DBI> object for created list.
# Line 668  sub _add_list { Line 783  sub _add_list {
783    
784          my $name = lc($arg->{'list'}) || confess "can't add list without name";          my $name = lc($arg->{'list'}) || confess "can't add list without name";
785          my $email = lc($arg->{'email'}) || confess "can't add list without e-mail";          my $email = lc($arg->{'email'}) || confess "can't add list without e-mail";
786            my $aliases = lc($arg->{'aliases'}) || confess "can't add list without path to aliases file";
787    
788          my $from_addr = $arg->{'from'};          my $from_addr = $arg->{'from'};
789    
790          my $lists = $self->{'loader'}->find_class('lists');          my $lists = $self->{'loader'}->find_class('lists');
791    
792            $self->_add_aliases(
793                    list => $name,
794                    email => $email,
795                    aliases => $aliases,
796            ) || croak "can't add alias $email for list $name";
797    
798          my $l = $lists->find_or_create({          my $l = $lists->find_or_create({
799                  name => $name,                  name => $name,
800                  email => $email,                  email => $email,
# Line 691  sub _add_list { Line 814  sub _add_list {
814  }  }
815    
816    
817    
818  =head2 _get_list  =head2 _get_list
819    
820  Get list C<Class::DBI> object.  Get list C<Class::DBI> object.
# Line 735  methods below). Line 859  methods below).
859    
860  my $nos;  my $nos;
861    
862    
863    =head2 new
864    
865    Create new SOAP object
866    
867     my $soap = new Nos::SOAP(
868            dsn => 'dbi:Pg:dbname=notices',
869            user => 'dpavlin',
870            passwd => '',
871            debug => 1,
872            verbose => 1,
873            hash_len => 8,
874            aliases => '/etc/aliases',
875     );
876    
877    =cut
878    
879  sub new {  sub new {
880          my $class = shift;          my $class = shift;
881          my $self = {@_};          my $self = {@_};
882    
883            croak "need aliases parametar" unless ($self->{'aliases'});
884    
885          bless($self, $class);          bless($self, $class);
886    
887          $nos = new Nos( @_ ) || die "can't create Nos object";          $nos = new Nos( @_ ) || die "can't create Nos object";
# Line 759  sub new { Line 903  sub new {
903  sub NewList {  sub NewList {
904          my $self = shift;          my $self = shift;
905    
906            croak "self is not Nos::SOAP object" unless (ref($self) eq 'Nos::SOAP');
907    
908            my $aliases = $self->{'aliases'} || croak "need 'aliases' argument to new constructor";
909    
910          if ($_[0] !~ m/^HASH/) {          if ($_[0] !~ m/^HASH/) {
911                  return $nos->new_list(                  return $nos->new_list(
912                          list => $_[0], from => $_[1], email => $_[2],                          list => $_[0], from => $_[1], email => $_[2],
913                            aliases => $aliases,
914                  );                  );
915          } else {          } else {
916                  return $nos->new_list( %{ shift @_ } );                  return $nos->new_list( %{ shift @_ }, aliases => $aliases );
917          }          }
918  }  }
919    
920    
921    =head2 DeleteList
922    
923     $ok = DeleteList(
924            list => 'My list',
925     );
926    
927    =cut
928    
929    sub DeleteList {
930            my $self = shift;
931    
932            if ($_[0] !~ m/^HASH/) {
933                    return $nos->delete_list(
934                            list => $_[0],
935                    );
936            } else {
937                    return $nos->delete_list( %{ shift @_ } );
938            }
939    }
940    
941  =head2 AddMemberToList  =head2 AddMemberToList
942    
943   $member_id = AddMemberToList(   $member_id = AddMemberToList(
# Line 801  sub AddMemberToList { Line 970  sub AddMemberToList {
970    
971  Returns array of hashes with user informations, see C<list_members>.  Returns array of hashes with user informations, see C<list_members>.
972    
973    Returning arrays from SOAP calls is somewhat fuzzy (at least to me). It
974    seems that SOAP::Lite client thinks that it has array with one element which
975    is array of hashes with data.
976    
977  =cut  =cut
978    
979  sub ListMembers {  sub ListMembers {
# Line 814  sub ListMembers { Line 987  sub ListMembers {
987                  $list_name = $_[0]->{'list'};                  $list_name = $_[0]->{'list'};
988          }          }
989    
990          return $nos->list_members( list => $list_name );          return [ $nos->list_members( list => $list_name ) ];
991    }
992    
993    
994    =head2 DeleteMemberFromList
995    
996     $member_id = DeleteMemberFromList(
997            list => 'My list',
998            email => 'e-mail@example.com',
999     );
1000    
1001    =cut
1002    
1003    sub DeleteMemberFromList {
1004            my $self = shift;
1005    
1006            if ($_[0] !~ m/^HASH/) {
1007                    return $nos->delete_member_from_list(
1008                            list => $_[0], email => $_[1],
1009                    );
1010            } else {
1011                    return $nos->delete_member_from_list( %{ shift @_ } );
1012            }
1013  }  }
1014    
1015    
1016  =head2 AddMessageToList  =head2 AddMessageToList
1017    
1018   $message_id = AddMessageToList(   $message_id = AddMessageToList(

Legend:
Removed from v.60  
changed lines
  Added in v.67

  ViewVC Help
Powered by ViewVC 1.1.26