/[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 6 by dpavlin, Sat May 14 12:31:27 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;
6  use Data::Dumper;  use Email::Valid;
7    use Email::Send;
8    
9  =head1 NAME  =head1 NAME
10    
11  sender.pl - command line notify sender utility  sender.pl - command line notify sender utility
12    
13    =head1 SYNOPSYS
14    
15     sender.pl --add=mylist members.txt
16     sender.pl --list[=mylist]
17     sender.pl --queue[=mylist message.txt]
18     sender.pl --send=mylist
19    
20    =head2 Command options
21    
22    =over 20
23    
24  =cut  =cut
25    
26  my ($list_opt,$debug) = (0,0);  my $debug = 0;
27    my $verbose = 0;
28    my $list_opt;
29  my $add_opt;  my $add_opt;
30  my $queue_opt;  my $queue_opt;
31    my $send_opt;
32    my $email_opt;
33    
34  my $result = GetOptions(  my $result = GetOptions(
35          "list"  => \$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            "email=s" => \$email_opt,
42  );  );
43    
44    
# Line 38  my $lists = $loader->find_class('lists') Line 57  my $lists = $loader->find_class('lists')
57  my $users = $loader->find_class('users');  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 $message_list = $loader->find_class('message_list');  my $queue = $loader->find_class('queue');
61    my $sent = $loader->find_class('sent');
62    
63    $queue->set_sql( list_queue => qq{
64            SELECT messages.message, messages.date AS date, lists.name AS list
65            FROM queue
66            JOIN messages on message_id = messages.id
67            JOIN lists on list_id = lists.id
68    } );
69    
70    
71    =item --list[=list_name]
72    
73    List all available lists and users on them.
74    
75    Optional value is name of list. With it, this option will produce just users
76    on that list.
77    
78  if ($list_opt) {  =cut
79          foreach my $list ($lists->retrieve_all) {  
80                  print $list->name,"\n";  if (defined($list_opt)) {
81            my @lists;
82            if ($list_opt ne '') {
83                    @lists = $lists->search( name=> $list_opt )->first || die "can't find list $list_opt";
84            } else {
85                    @lists = $lists->retrieve_all;
86            }
87    
88            foreach my $list (@lists) {
89                    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";
93                  }                  }
94          }          }
95    
96    =item --add=list_name
97    
98    Add users to list. Users are stored in file (which can be supplied as
99    argument) or read from C<STDIN>. List should be in following format:
100    
101     email@example.com      Optional full name of person
102     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
108    
109  } elsif ($add_opt) {  } elsif ($add_opt) {
110          #my $noticer = $loader->find_class('Noticer') || die "can't find my class!";          #my $noticer = $loader->find_class('Noticer') || die "can't find my class!";
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 60  if ($list_opt) { Line 123  if ($list_opt) {
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)) {
128                            print "SKIPPING $name <$email>\n";
129                            next;
130                    }
131                  print "# $name <$email>\n";                  print "# $name <$email>\n";
132                  my $this_user = $users->find_or_create({                  my $this_user = $users->find_or_create({
133                          email => $email,                          email => $email,
# Line 79  if ($list_opt) { Line 147  if ($list_opt) {
147    
148          print "list ",$list->name," has $added users\n";          print "list ",$list->name," has $added users\n";
149    
150  } elsif ($queue_opt) {  =item --queue[=list_name]
151          my $this_list = $lists->search(  
152                  name => $queue_opt,  Queue message for later delivery. Message can be read from file (specified as
153          )->first || die "can't find list $queue_opt";  argument) or read from C<STDIN>.
154    
155    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
159    
160    } elsif (defined($queue_opt)) {
161    
162            if ($queue_opt ne '') {
163                    # add message to list queue
164    
165                    my $this_list = $lists->search(
166                            name => $queue_opt,
167                    )->first || die "can't find list $queue_opt";
168    
169                    my $message_text;
170                    while(<>) {
171                            $message_text .= $_;
172                    }
173    
174                    die "no message" unless ($message_text);
175    
176                    my $this_message = $messages->find_or_create({
177                            message => $message_text
178                    }) || die "can't insert message";
179    
180                    $this_message->dbi_commit() || die "can't add message";
181    
182                    $queue->find_or_create({
183                            message_id => $this_message->id,
184                            list_id => $this_list->id,
185                    }) || die "can't add message ",$this_message->id," to list ",$this_list->id, ": ",$this_list->name;
186    
187                    $queue->dbi_commit || die "can't add message to list ",$this_list->name;
188    
189                    print "added message ",$this_message->id, " to list ",$this_list->name,"\n";
190    
191            } else {
192                    # list messages in queue        
193    
194                    foreach my $m ($queue->retrieve_all) {
195                            next if ($m->all_sent && ! $verbose);
196    
197                            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";
208                    }
209    
         my $message_text;  
         while(<>) {  
                 $message_text .= $_;  
210          }          }
211    
212          die "no message" unless ($message_text);  =item --send[=list_name]
213    
214          my $this_message = $messages->find_or_create({  Send e-mails waiting in queue, or with optional argument, just send messages
215                  message => $message_text  for single list.
         }) || die "can't insert message";  
216    
217          $this_message->dbi_commit();  =cut
218    
219    } elsif (defined($send_opt)) {
220    
221            my $my_q;
222            if ($send_opt ne '') {
223                    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    
231            while (my $m = $my_q->next) {
232                    next if ($m->all_sent);
233    
234          $message_list->find_or_create({                  print "sending message ",$m->message_id," enqueued on ",$m->date," to list ",$m->list_id->name,"\n";
235                  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;  
236    
237          print "added message ",$this_message->id, " to list ",$this_list->name,"\n";                  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  {
262          die $0.'          die "see perldoc $0 for help";
         --list                          show all lists and users  
         --add=name_of_list < users.txt  add users (email@example.com full name)  
         --queue=name_of_list < message  queue message for sending to list  
         --debug  
 ';  
263  }  }
264    
265    =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
290    
291    Dobrica Pavlinusic <dpavlin@rot13.org>
292    
293    =cut
294    

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

  ViewVC Help
Powered by ViewVC 1.1.26