/[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 14 by dpavlin, Sun May 15 14:20:08 2005 UTC revision 18 by dpavlin, Sun May 15 17:01:19 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;
 use Mail::CheckUser qw(check_email);  
6  use Email::Valid;  use Email::Valid;
7  use Email::Send;  use Email::Send;
8    
# Line 18  sender.pl - command line notify sender u Line 17  sender.pl - command line notify sender u
17   sender.pl --queue[=mylist message.txt]   sender.pl --queue[=mylist message.txt]
18   sender.pl --send=mylist   sender.pl --send=mylist
19    
20  =head2 All options  =head2 Command options
21    
22  =over 20  =over 20
23    
 =item --debug  
   
 Turn on debugging output from C<Class::DBI>  
   
24  =cut  =cut
25    
26  my $debug = 0;  my $debug = 0;
27    my $verbose = 0;
28  my $list_opt;  my $list_opt;
29  my $add_opt;  my $add_opt;
30  my $queue_opt;  my $queue_opt;
31  my $send_opt;  my $send_opt;
32    my $email_opt;
33    
34  my $result = GetOptions(  my $result = GetOptions(
35          "list:s" => \$list_opt,          "list:s" => \$list_opt,
# Line 40  my $result = GetOptions( Line 37  my $result = GetOptions(
37          "queue:s" => \$queue_opt,          "queue:s" => \$queue_opt,
38          "send:s" => \$send_opt,          "send:s" => \$send_opt,
39          "debug" => \$debug,          "debug" => \$debug,
40            "verbose" => \$verbose,
41            "email=s" => \$email_opt,
42  );  );
43    
44    
# Line 59  my $users = $loader->find_class('users') Line 58  my $users = $loader->find_class('users')
58  my $user_list = $loader->find_class('user_list');  my $user_list = $loader->find_class('user_list');
59  my $messages = $loader->find_class('messages');  my $messages = $loader->find_class('messages');
60  my $queue = $loader->find_class('queue');  my $queue = $loader->find_class('queue');
61    my $sent = $loader->find_class('sent');
62    
63  $queue->set_sql( list_queue => qq{  $queue->set_sql( list_queue => qq{
64          SELECT messages.message, messages.date AS message_date, lists.name AS list          SELECT messages.message, messages.date AS date, lists.name AS list
65          FROM queue          FROM queue
66          JOIN messages on message_id = messages.id          JOIN messages on message_id = messages.id
67          JOIN lists on list_id = lists.id          JOIN lists on list_id = lists.id
# Line 86  if (defined($list_opt)) { Line 86  if (defined($list_opt)) {
86          }          }
87    
88          foreach my $list (@lists) {          foreach my $list (@lists) {
89                  print $list->name,"\n";                  print $list->name," <",$list->email,">\n";
90                  foreach my $user_on_list ($user_list->search(list_id => $list->id)) {                  foreach my $user_on_list ($user_list->search(list_id => $list->id)) {
91                          my $user = $users->retrieve( id => $user_on_list->user_id );                          my $user = $users->retrieve( id => $user_on_list->user_id );
92                          print "\t",$user->full_name," <", $user->email, ">\n";                          print "\t",$user->full_name," <", $user->email, ">\n";
# Line 101  argument) or read from C<STDIN>. List sh Line 101  argument) or read from C<STDIN>. List sh
101   email@example.com      Optional full name of person   email@example.com      Optional full name of person
102   dpavlin@rot13.org      Dobrica Pavlinusic   dpavlin@rot13.org      Dobrica Pavlinusic
103    
104    You may use C<--email> parametar at any time to set From: e-mail address for list.
105    B<This seems somewhat cludgy, and it will probably change in future>.
106    
107  =cut  =cut
108    
109  } elsif ($add_opt) {  } elsif ($add_opt) {
# Line 108  argument) or read from C<STDIN>. List sh Line 111  argument) or read from C<STDIN>. List sh
111          my $list = $lists->find_or_create({          my $list = $lists->find_or_create({
112                  name => $add_opt,                  name => $add_opt,
113          }) || die "can't add list $add_opt\n";          }) || die "can't add list $add_opt\n";
114            if ($email_opt && $list->email ne $email_opt) {
115                    $list->email($email_opt);
116                    $list->update;
117                    $list->dbi_commit;
118            }
119    
120          my $added = 0;          my $added = 0;
121    
# Line 115  argument) or read from C<STDIN>. List sh Line 123  argument) or read from C<STDIN>. List sh
123                  chomp;                  chomp;
124                  next if (/^#/ || /^\s*$/);                  next if (/^#/ || /^\s*$/);
125                  my ($email, $name) = split(/\s+/,$_, 2);                  my ($email, $name) = split(/\s+/,$_, 2);
126                    $name ||= '';
127                  if (! Email::Valid->address($email)) {                  if (! Email::Valid->address($email)) {
128                          print "SKIPPING $name <$email>\n";                          print "SKIPPING $name <$email>\n";
129                          next;                          next;
# Line 143  argument) or read from C<STDIN>. List sh Line 152  argument) or read from C<STDIN>. List sh
152  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
153  argument) or read from C<STDIN>.  argument) or read from C<STDIN>.
154    
155  This options without optional parametars it will display current queue.  This option without optional parametar will display pending queue. If you
156    add C<--verbose> flag, it will display all messages in queue.
157    
158  =cut  =cut
159    
# Line 182  This options without optional parametars Line 192  This options without optional parametars
192                  # list messages in queue                          # list messages in queue        
193    
194                  foreach my $m ($queue->retrieve_all) {                  foreach my $m ($queue->retrieve_all) {
195                          my $l = sprintf("%-10s %15s : ", $m->list_id->name, $m->message_id->date);                          next if ($m->all_sent && ! $verbose);
196                          $l .= substr($m->message_id->message, 0, 79 - length($l));  
197                          $l =~ s/[\n\r]/ /gs;                          my $l = $m->all_sent ? 'S' : 'Q';
198    
199                            my $date = $m->message_id->date;
200                            $date =~ s/\..+$//;
201                            my $msg = $m->message_id->message;
202                            $msg =~ s/\s+/ /gs;
203    
204                            $l .= sprintf(" %-10s %15s : ", $m->list_id->name, $date);
205                            $l .= substr($msg, 0, 79 - length($l));
206    
207                          print "$l\n";                          print "$l\n";
208                  }                  }
209    
# Line 192  This options without optional parametars Line 211  This options without optional parametars
211    
212  =item --send[=list_name]  =item --send[=list_name]
213    
214  Send e-mail waiting in queue for all lists, or with optional argument for  Send e-mails waiting in queue, or with optional argument, just send messages
215  just single list.  for single list.
216    
217  =cut  =cut
218    
219  } elsif (defined($send_opt)) {  } elsif (defined($send_opt)) {
220    
221            my $my_q;
         die "send option not yet implemented";  
   
         my @q;  
222          if ($send_opt ne '') {          if ($send_opt ne '') {
223  #               @q => $queue->search( name => 'foo' );                  my $l_id = $lists->search_like( name => $send_opt )->first ||
224                            die "can't find list $send_opt";
225                    $my_q = $queue->search_like( list_id => $l_id ) ||
226                            die "can't find list $send_opt";
227            } else {
228                    $my_q = $queue->retrieve_all;
229          }          }
230          foreach my $q (@q) {  
231                            while (my $m = $my_q->next) {
232                    next if ($m->all_sent);
233    
234                    print "sending message ",$m->message_id," enqueued on ",$m->date," to list ",$m->list_id->name,"\n";
235                    my $msg = $m->message_id->message;
236    
237                    foreach my $u ($user_list->search(list_id => $m->list_id)) {
238    
239                            my $hdr = "To: ".$u->user_id->full_name." <". $u->user_id->email. ">\n";
240    
241                            if ($sent->search( message_id => $m->message_id, user_id => $u->user_id )) {
242                                    print "SKIP ",$u->user_id->email," message allready sent\n";
243                            } else {
244                                    print "\t",$u->user_id->email,"\n";
245    
246                                    # FIXME do real sending :-)
247                                    send IO => "$hdr\n$msg";
248    
249                                    $sent->create({
250                                            message_id => $m->message_id,
251                                            user_id => $u->user_id,
252                                    });
253                                    $sent->dbi_commit;
254                            }
255                    }
256                    $m->all_sent(1);
257                    $m->update;
258                    $m->dbi_commit;
259          }          }
260    
261  } else  {  } else  {
# Line 216  just single list. Line 264  just single list.
264    
265  =back  =back
266    
267    
268    
269    =head2 Helper options
270    
271    =over 20
272    
273    =item --debug
274    
275    Turn on debugging output from C<Class::DBI>
276    
277    =item --verbose
278    
279    Dump more info on screen.
280    
281    =item --email
282    
283    Used to specify e-mail address where needed.
284    
285    =back
286    
287    
288    
289  =head1 AUTHOR  =head1 AUTHOR
290    
291  Dobrica Pavlinusic <dpavlin@rot13.org>  Dobrica Pavlinusic <dpavlin@rot13.org>

Legend:
Removed from v.14  
changed lines
  Added in v.18

  ViewVC Help
Powered by ViewVC 1.1.26