/[notice-sender]/trunk/sender.pl
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/sender.pl

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

revision 11 by dpavlin, Sat May 14 18:20:50 2005 UTC revision 17 by dpavlin, Sun May 15 16:32:36 2005 UTC
# Line 3  Line 3 
3  use strict;  use strict;
4  use Class::DBI::Loader::Pg;  use Class::DBI::Loader::Pg;
5  use Getopt::Long;  use Getopt::Long;
6  use Data::Dumper;  use Mail::CheckUser qw(check_email);
7    use Email::Valid;
8    use Email::Send;
9    
10  =head1 NAME  =head1 NAME
11    
# Line 13  sender.pl - command line notify sender u Line 15  sender.pl - command line notify sender u
15    
16   sender.pl --add=mylist members.txt   sender.pl --add=mylist members.txt
17   sender.pl --list[=mylist]   sender.pl --list[=mylist]
18   sender.pl --queue=mylist message.txt   sender.pl --queue[=mylist message.txt]
19   sender.pl --send=mylist   sender.pl --send=mylist
20    
21  =head2 All options  =head2 Command options
22    
23  =over 20  =over 20
24    
 =item --debug  
   
 Turn on debugging output from C<Class::DBI>  
   
25  =cut  =cut
26    
27  my ($list_opt,$debug) = (0,0);  my $debug = 0;
28    my $verbose = 0;
29    my $list_opt;
30  my $add_opt;  my $add_opt;
31  my $queue_opt;  my $queue_opt;
32    my $send_opt;
33    
34  my $result = GetOptions(  my $result = GetOptions(
35          "list:s" => \$list_opt,          "list:s" => \$list_opt,
36          "add=s" => \$add_opt,          "add=s" => \$add_opt,
37          "queue=s" => \$queue_opt,          "queue:s" => \$queue_opt,
38            "send:s" => \$send_opt,
39          "debug" => \$debug,          "debug" => \$debug,
40            "verbose" => \$verbose,
41  );  );
42    
43    
# Line 54  my $users = $loader->find_class('users') Line 57  my $users = $loader->find_class('users')
57  my $user_list = $loader->find_class('user_list');  my $user_list = $loader->find_class('user_list');
58  my $messages = $loader->find_class('messages');  my $messages = $loader->find_class('messages');
59  my $queue = $loader->find_class('queue');  my $queue = $loader->find_class('queue');
60    my $sent = $loader->find_class('sent');
61    
62    $queue->set_sql( list_queue => qq{
63            SELECT messages.message, messages.date AS date, lists.name AS list
64            FROM queue
65            JOIN messages on message_id = messages.id
66            JOIN lists on list_id = lists.id
67    } );
68    
69    
70  =item --list[=list_name]  =item --list[=list_name]
71    
72  List all available lists and users on them. Optional value is name of list  List all available lists and users on them.
73  and it will produce users just on that list.  
74    Optional value is name of list. With it, this option will produce just users
75    on that list.
76    
77  =cut  =cut
78    
# Line 71  if (defined($list_opt)) { Line 85  if (defined($list_opt)) {
85          }          }
86    
87          foreach my $list (@lists) {          foreach my $list (@lists) {
88                  print $list->name,"\n";                  print $list->name," <",$list->email,">\n";
89                  foreach my $user_on_list ($user_list->search(list_id => $list->id)) {                  foreach my $user_on_list ($user_list->search(list_id => $list->id)) {
90                          my $user = $users->retrieve( id => $user_on_list->user_id );                          my $user = $users->retrieve( id => $user_on_list->user_id );
91                          print "\t",$user->full_name," <", $user->email, ">\n";                          print "\t",$user->full_name," <", $user->email, ">\n";
# Line 100  argument) or read from C<STDIN>. List sh Line 114  argument) or read from C<STDIN>. List sh
114                  chomp;                  chomp;
115                  next if (/^#/ || /^\s*$/);                  next if (/^#/ || /^\s*$/);
116                  my ($email, $name) = split(/\s+/,$_, 2);                  my ($email, $name) = split(/\s+/,$_, 2);
117                    $name ||= '';
118                    if (! Email::Valid->address($email)) {
119                            print "SKIPPING $name <$email>\n";
120                            next;
121                    }
122                  print "# $name <$email>\n";                  print "# $name <$email>\n";
123                  my $this_user = $users->find_or_create({                  my $this_user = $users->find_or_create({
124                          email => $email,                          email => $email,
# Line 119  argument) or read from C<STDIN>. List sh Line 138  argument) or read from C<STDIN>. List sh
138    
139          print "list ",$list->name," has $added users\n";          print "list ",$list->name," has $added users\n";
140    
141  =item --queue=list_name  =item --queue[=list_name]
142    
143  Queue message for later delivery. Message can be read from file (specified as  Queue message for later delivery. Message can be read from file (specified as
144  argument) or read from C<STDIN>.  argument) or read from C<STDIN>.
145    
146    This option without optional parametar will display pending queue. If you
147    add C<--verbose> flag, it will display all messages in queue.
148    
149  =cut  =cut
150    
151  } elsif ($queue_opt) {  } elsif (defined($queue_opt)) {
152          my $this_list = $lists->search(  
153                  name => $queue_opt,          if ($queue_opt ne '') {
154          )->first || die "can't find list $queue_opt";                  # add message to list queue
155    
156                    my $this_list = $lists->search(
157                            name => $queue_opt,
158                    )->first || die "can't find list $queue_opt";
159    
160                    my $message_text;
161                    while(<>) {
162                            $message_text .= $_;
163                    }
164    
165                    die "no message" unless ($message_text);
166    
167                    my $this_message = $messages->find_or_create({
168                            message => $message_text
169                    }) || die "can't insert message";
170    
171                    $this_message->dbi_commit() || die "can't add message";
172    
173                    $queue->find_or_create({
174                            message_id => $this_message->id,
175                            list_id => $this_list->id,
176                    }) || die "can't add message ",$this_message->id," to list ",$this_list->id, ": ",$this_list->name;
177    
178                    $queue->dbi_commit || die "can't add message to list ",$this_list->name;
179    
180                    print "added message ",$this_message->id, " to list ",$this_list->name,"\n";
181    
182            } else {
183                    # list messages in queue        
184    
185                    foreach my $m ($queue->retrieve_all) {
186                            next if ($m->all_sent && ! $verbose);
187    
188                            my $l = $m->all_sent ? 'S' : 'Q';
189    
190                            my $date = $m->message_id->date;
191                            $date =~ s/\..+$//;
192                            my $msg = $m->message_id->message;
193                            $msg =~ s/\s+/ /gs;
194    
195                            $l .= sprintf(" %-10s %15s : ", $m->list_id->name, $date);
196                            $l .= substr($msg, 0, 79 - length($l));
197    
198                            print "$l\n";
199                    }
200    
         my $message_text;  
         while(<>) {  
                 $message_text .= $_;  
201          }          }
202    
203          die "no message" unless ($message_text);  =item --send[=list_name]
204    
205    Send e-mails waiting in queue, or with optional argument, just send messages
206    for single list.
207    
208    =cut
209    
210          my $this_message = $messages->find_or_create({  } elsif (defined($send_opt)) {
211                  message => $message_text  
212          }) || die "can't insert message";          my $my_q;
213            if ($send_opt ne '') {
214                    my $l_id = $lists->search_like( name => $send_opt )->first ||
215                            die "can't find list $send_opt";
216                    $my_q = $queue->search_like( list_id => $l_id ) ||
217                            die "can't find list $send_opt";
218            } else {
219                    $my_q = $queue->retrieve_all;
220            }
221    
222          $this_message->dbi_commit();          while (my $m = $my_q->next) {
223                    next if ($m->all_sent);
224    
225          $queue->find_or_create({                  print "sending message ",$m->message_id," enqueued on ",$m->date," to list ",$m->list_id->name,"\n";
226                  message_id => $this_message->id,                  my $msg = $m->message_id->message;
                 list_id => $this_list->id,  
         }) || die "can't add message ",$this_message->id," to list ",$this_list->id, ": ",$this_list->name;  
227    
228          print "added message ",$this_message->id, " to list ",$this_list->name,"\n";                  foreach my $u ($user_list->search(list_id => $m->list_id)) {
229    
230                            my $hdr = "To: ".$u->user_id->full_name." <". $u->user_id->email. ">\n";
231    
232                            if ($sent->search( message_id => $m->message_id, user_id => $u->user_id )) {
233                                    print "SKIP ",$u->user_id->email," message allready sent\n";
234                            } else {
235                                    print "\t",$u->user_id->email,"\n";
236                                    send IO => "$hdr\n$msg";
237                                    $sent->create({
238                                            message_id => $m->message_id,
239                                            user_id => $u->user_id,
240                                    });
241                                    $sent->dbi_commit;
242                            }
243                    }
244                    $m->all_sent(1);
245                    $m->update;
246                    $m->dbi_commit;
247            }
248    
249  } else  {  } else  {
250          die "see perldoc $0 for help";          die "see perldoc $0 for help";
# Line 157  argument) or read from C<STDIN>. Line 252  argument) or read from C<STDIN>.
252    
253  =back  =back
254    
255    
256    
257    =head2 Helper options
258    
259    =over 20
260    
261    =item --debug
262    
263    Turn on debugging output from C<Class::DBI>
264    
265    =item --verbose
266    
267    Dump more info on screen.
268    
269    =back
270    
271    
272    
273  =head1 AUTHOR  =head1 AUTHOR
274    
275  Dobrica Pavlinusic <dpavlin@rot13.org>  Dobrica Pavlinusic <dpavlin@rot13.org>

Legend:
Removed from v.11  
changed lines
  Added in v.17

  ViewVC Help
Powered by ViewVC 1.1.26