/[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 15 by dpavlin, Sun May 15 16:25:01 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 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 options without optional parametars it will display current queue.
147    
148  =cut  =cut
149    
150  } elsif ($queue_opt) {  } elsif (defined($queue_opt)) {
151          my $this_list = $lists->search(  
152                  name => $queue_opt,          if ($queue_opt ne '') {
153          )->first || die "can't find list $queue_opt";                  # add message to list queue
154    
155                    my $this_list = $lists->search(
156                            name => $queue_opt,
157                    )->first || die "can't find list $queue_opt";
158    
159                    my $message_text;
160                    while(<>) {
161                            $message_text .= $_;
162                    }
163    
164                    die "no message" unless ($message_text);
165    
166                    my $this_message = $messages->find_or_create({
167                            message => $message_text
168                    }) || die "can't insert message";
169    
170                    $this_message->dbi_commit() || die "can't add message";
171    
172                    $queue->find_or_create({
173                            message_id => $this_message->id,
174                            list_id => $this_list->id,
175                    }) || die "can't add message ",$this_message->id," to list ",$this_list->id, ": ",$this_list->name;
176    
177                    $queue->dbi_commit || die "can't add message to list ",$this_list->name;
178    
179                    print "added message ",$this_message->id, " to list ",$this_list->name,"\n";
180    
181            } else {
182                    # list messages in queue        
183    
184                    foreach my $m ($queue->retrieve_all) {
185                            next if ($m->all_sent && ! $verbose);
186    
187                            my $l = $m->all_sent ? 'S' : 'Q';
188    
189                            my $date = $m->message_id->date;
190                            $date =~ s/\..+$//;
191                            my $msg = $m->message_id->message;
192                            $msg =~ s/\s+/ /gs;
193    
194                            $l .= sprintf(" %-10s %15s : ", $m->list_id->name, $date);
195                            $l .= substr($msg, 0, 79 - length($l));
196    
197                            print "$l\n";
198                    }
199    
         my $message_text;  
         while(<>) {  
                 $message_text .= $_;  
200          }          }
201    
202          die "no message" unless ($message_text);  =item --send[=list_name]
203    
204    Send e-mail waiting in queue for all lists, or with optional argument for
205    just single list.
206    
207    =cut
208    
209          my $this_message = $messages->find_or_create({  } elsif (defined($send_opt)) {
210                  message => $message_text  
211          }) || die "can't insert message";          my $my_q;
212            if ($send_opt ne '') {
213                    my $l_id = $lists->search_like( name => $send_opt )->first ||
214                            die "can't find list $send_opt";
215                    $my_q = $queue->search_like( list_id => $l_id ) ||
216                            die "can't find list $send_opt";
217            } else {
218                    $my_q = $queue->retrieve_all;
219            }
220    
221          $this_message->dbi_commit();          while (my $m = $my_q->next) {
222                    next if ($m->all_sent);
223    
224          $queue->find_or_create({                  print "sending message ",$m->message_id," enqueued on ",$m->date," to list ",$m->list_id->name,"\n";
225                  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;  
226    
227          print "added message ",$this_message->id, " to list ",$this_list->name,"\n";                  foreach my $u ($user_list->search(list_id => $m->list_id)) {
228    
229                            my $hdr = "To: ".$u->user_id->full_name." <". $u->user_id->email. ">\n";
230    
231                            if ($sent->search( message_id => $m->message_id, user_id => $u->user_id )) {
232                                    print "SKIP ",$u->user_id->email," message allready sent\n";
233                            } else {
234                                    print "\t",$u->user_id->email,"\n";
235                                    send IO => "$hdr\n$msg";
236                                    $sent->create({
237                                            message_id => $m->message_id,
238                                            user_id => $u->user_id,
239                                    });
240                                    $sent->dbi_commit;
241                            }
242                    }
243                    $m->all_sent(1);
244                    $m->update;
245                    $m->dbi_commit;
246            }
247    
248  } else  {  } else  {
249          die "see perldoc $0 for help";          die "see perldoc $0 for help";
# Line 157  argument) or read from C<STDIN>. Line 251  argument) or read from C<STDIN>.
251    
252  =back  =back
253    
254    
255    
256    =head2 Helper options
257    
258    =over 20
259    
260    =item --debug
261    
262    Turn on debugging output from C<Class::DBI>
263    
264    =item --verbose
265    
266    Dump more info on screen.
267    
268    =back
269    
270    
271    
272  =head1 AUTHOR  =head1 AUTHOR
273    
274  Dobrica Pavlinusic <dpavlin@rot13.org>  Dobrica Pavlinusic <dpavlin@rot13.org>

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

  ViewVC Help
Powered by ViewVC 1.1.26