/[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

Annotation of /trunk/sender.pl

Parent Directory Parent Directory | Revision Log Revision Log


Revision 72 - (hide annotations)
Mon Aug 22 20:24:04 2005 UTC (18 years, 7 months ago) by dpavlin
File MIME type: text/plain
File size: 7025 byte(s)
great API change: list options are now create_list and drop_list

1 dpavlin 1 #!/usr/bin/perl -w
2    
3     use strict;
4 dpavlin 20 use blib;
5 dpavlin 72 use Nos 0.7;
6 dpavlin 1 use Getopt::Long;
7    
8 dpavlin 6 =head1 NAME
9    
10     sender.pl - command line notify sender utility
11    
12 dpavlin 8 =head1 SYNOPSYS
13    
14 dpavlin 72 sender.pl --create=mylist
15     sender.pl --drop=mylist
16 dpavlin 8 sender.pl --add=mylist members.txt
17 dpavlin 61 sender.pl --delete=mylist members.txt
18 dpavlin 9 sender.pl --list[=mylist]
19 dpavlin 14 sender.pl --queue[=mylist message.txt]
20 dpavlin 8 sender.pl --send=mylist
21    
22 dpavlin 29 In C</etc/aliases> something like:
23    
24 dpavlin 48 mylist: "| cd /path/to && ./sender.pl --inbox=mylist"
25 dpavlin 29
26 dpavlin 15 =head2 Command options
27 dpavlin 8
28     =over 20
29    
30 dpavlin 6 =cut
31    
32 dpavlin 12 my $debug = 0;
33 dpavlin 15 my $verbose = 0;
34 dpavlin 30 my $opt;
35 dpavlin 1
36     my $result = GetOptions(
37 dpavlin 72 "create=s" => \$opt->{'create'},
38     "drop=s" => \$opt->{'drop'},
39 dpavlin 30 "list:s" => \$opt->{'list'},
40     "add=s" => \$opt->{'add'},
41 dpavlin 61 "delete=s" => \$opt->{'delete'},
42 dpavlin 30 "queue:s" => \$opt->{'queue'},
43     "send:s" => \$opt->{'send'},
44     "inbox=s" => \$opt->{'inbox'},
45 dpavlin 1 "debug" => \$debug,
46 dpavlin 15 "verbose" => \$verbose,
47 dpavlin 47 "from=s" => \$opt->{'from'},
48     "driver=s" => \$opt->{'email_send_driver'},
49 dpavlin 49 "sleep=i" => \$opt->{'sleep'},
50 dpavlin 69 "aliases=s" => \$opt->{'aliases'},
51 dpavlin 1 );
52    
53 dpavlin 20 my $nos = new Nos(
54     dsn => 'dbi:Pg:dbname=notices',
55     user => 'dpavlin',
56     passwd => '',
57     debug => $debug,
58     verbose => $verbose,
59 dpavlin 1 );
60    
61 dpavlin 20 my $loader = $nos->{'loader'} || die "can't find loader?";
62    
63 dpavlin 2 my $lists = $loader->find_class('lists');
64     my $users = $loader->find_class('users');
65     my $user_list = $loader->find_class('user_list');
66 dpavlin 6 my $messages = $loader->find_class('messages');
67 dpavlin 11 my $queue = $loader->find_class('queue');
68 dpavlin 15 my $sent = $loader->find_class('sent');
69 dpavlin 2
70 dpavlin 14 $queue->set_sql( list_queue => qq{
71 dpavlin 15 SELECT messages.message, messages.date AS date, lists.name AS list
72 dpavlin 14 FROM queue
73     JOIN messages on message_id = messages.id
74     JOIN lists on list_id = lists.id
75     } );
76    
77 dpavlin 30 my $list_name;
78 dpavlin 14
79 dpavlin 72 =item --aliases=/full/path/to/aliases
80 dpavlin 30
81 dpavlin 72 Optional parametar C<--aliases> can be used to specify aliases file other
82     than default C</etc/aliases>.
83 dpavlin 30
84 dpavlin 72 =cut
85    
86     my $aliases = $opt->{'aliases'} || '/etc/aliases';
87    
88    
89     =item --create=list_name my-list@example.com
90    
91 dpavlin 30 Adds new list. You can also feed list name as first line to C<STDIN>.
92    
93 dpavlin 47 You can also add C<--from='Full name of list'> to specify full name (comment)
94     in outgoing e-mail.
95    
96 dpavlin 30 =cut
97    
98 dpavlin 72 if ($list_name = $opt->{'create'}) {
99 dpavlin 30
100     my $email = shift @ARGV || <>;
101     chomp($email);
102    
103     die "need e-mail address for list (as argument or on STDIN)\n" unless ($email);
104    
105 dpavlin 72 my $id = $nos->create_list(
106 dpavlin 30 list => $list_name,
107 dpavlin 47 from => ($opt->{'from'} || ''),
108 dpavlin 30 email => $email,
109 dpavlin 69 aliases => $aliases,
110 dpavlin 30 ) || die "can't add list $list_name\n";
111    
112 dpavlin 33 print "added list $list_name with ID $id\n";
113 dpavlin 30
114    
115 dpavlin 72 =item --drop=list_name
116    
117     Remove list.
118    
119     Optional parametar C<--aliases='/full/path/to/aliases'> can be used to
120     specify aliases file other than C</etc/aliases>.
121    
122     =cut
123    
124     } elsif ($list_name = $opt->{'drop'}) {
125    
126     my $id = $nos->drop_list(
127     list => $list_name,
128     aliases => $aliases,
129     ) || die "can't remove list $list_name\n";
130    
131     print "drop list $list_name with ID $id\n";
132    
133    
134 dpavlin 9 =item --list[=list_name]
135 dpavlin 8
136 dpavlin 14 List all available lists and users on them.
137 dpavlin 8
138 dpavlin 14 Optional value is name of list. With it, this option will produce just users
139     on that list.
140    
141 dpavlin 8 =cut
142    
143 dpavlin 30 } elsif (defined($list_name = $opt->{'list'})) {
144    
145 dpavlin 9 my @lists;
146 dpavlin 30
147     if ($list_name ne '') {
148     @lists = $lists->search( name=> $list_name )->first || die "can't find list $list_name";
149 dpavlin 9 } else {
150     @lists = $lists->retrieve_all;
151     }
152    
153     foreach my $list (@lists) {
154 dpavlin 53 print $list->name,": ",$list->from_addr," <",$list->email,">\n";
155 dpavlin 45 foreach my $u ($nos->list_members( list => $list->name )) {
156 dpavlin 57 print "\t",$u->{'name'}, " <", $u->{'email'}, ">",( $u->{'ext_id'} ? ' ['.$u->{'ext_id'}.']' : '' ),"\n";
157 dpavlin 1 }
158     }
159 dpavlin 8
160 dpavlin 30
161 dpavlin 8 =item --add=list_name
162    
163     Add users to list. Users are stored in file (which can be supplied as
164     argument) or read from C<STDIN>. List should be in following format:
165    
166     email@example.com Optional full name of person
167     dpavlin@rot13.org Dobrica Pavlinusic
168    
169     =cut
170    
171 dpavlin 30 } elsif ($list_name = $opt->{'add'}) {
172    
173 dpavlin 51 my $list = $nos->_get_list($list_name) || die "can't find list $list_name\n";
174 dpavlin 21
175 dpavlin 6 my $added = 0;
176    
177 dpavlin 2 while(<>) {
178     chomp;
179     next if (/^#/ || /^\s*$/);
180     my ($email, $name) = split(/\s+/,$_, 2);
181 dpavlin 30 $added++ if ($nos->add_member_to_list( email => $email, name => $name, list => $list_name ));
182 dpavlin 2 }
183 dpavlin 3
184 dpavlin 6 print "list ",$list->name," has $added users\n";
185    
186 dpavlin 30
187 dpavlin 61 =item --delete=list_name
188    
189     Delete users from list. User e-mails can be stored in file (which can be
190     supplied as argument) or read from C<STDIN>.
191    
192     =cut
193     } elsif ($list_name = $opt->{'delete'}) {
194    
195     my $list = $nos->_get_list($list_name) || die "can't find list $list_name\n";
196    
197     my $deleted = 0;
198    
199     while(<>) {
200     chomp;
201     next if (/^#/ || /^\s*$/);
202     my $email = $_;
203     $deleted++ if ($nos->delete_member_from_list( email => $email, list => $list_name ));
204     }
205    
206     print "list ",$list->name," lost $deleted users\n";
207    
208    
209 dpavlin 14 =item --queue[=list_name]
210 dpavlin 8
211     Queue message for later delivery. Message can be read from file (specified as
212     argument) or read from C<STDIN>.
213    
214 dpavlin 16 This option without optional parametar will display pending queue. If you
215     add C<--verbose> flag, it will display all messages in queue.
216 dpavlin 14
217 dpavlin 8 =cut
218    
219 dpavlin 30 } elsif (defined($list_name = $opt->{'queue'})) {
220 dpavlin 6
221 dpavlin 30 if ($list_name ne '') {
222 dpavlin 14 # add message to list queue
223    
224     my $message_text;
225     while(<>) {
226     $message_text .= $_;
227     }
228    
229 dpavlin 29 my $id = $nos->add_message_to_list(
230 dpavlin 30 list => $list_name,
231 dpavlin 24 message => $message_text,
232 dpavlin 32 ) || die "can't add message to list $list_name\n";
233 dpavlin 14
234 dpavlin 30 print "added message $id to list $list_name\n";
235 dpavlin 14
236     } else {
237     # list messages in queue
238    
239     foreach my $m ($queue->retrieve_all) {
240 dpavlin 15 next if ($m->all_sent && ! $verbose);
241    
242     my $l = $m->all_sent ? 'S' : 'Q';
243    
244     my $date = $m->message_id->date;
245     $date =~ s/\..+$//;
246     my $msg = $m->message_id->message;
247     $msg =~ s/\s+/ /gs;
248    
249 dpavlin 36 $l .= sprintf(" %-15s %15s : ", $m->list_id->name, $date);
250 dpavlin 15 $l .= substr($msg, 0, 79 - length($l));
251    
252 dpavlin 14 print "$l\n";
253     }
254    
255 dpavlin 6 }
256    
257 dpavlin 30
258 dpavlin 14 =item --send[=list_name]
259 dpavlin 6
260 dpavlin 16 Send e-mails waiting in queue, or with optional argument, just send messages
261     for single list.
262 dpavlin 6
263 dpavlin 47 Optional argument C<--driver=smtp> forces sending using SMTP server at
264     localhost (127.0.0.1).
265    
266 dpavlin 49 Optional argument C<--sleep=42> defines that sender will sleep 42 seconds
267     between sending e-mail.
268    
269 dpavlin 14 =cut
270 dpavlin 6
271 dpavlin 30 } elsif (defined($list_name = $opt->{'send'})) {
272 dpavlin 6
273 dpavlin 55 unless ($opt->{'email_send_driver'}) {
274     print "WARNING: this will dump debugging output to STDERR\n";
275     print "enter alternative driver (e.g. smtp): ";
276     my $d = <STDIN>;
277     chomp($d);
278     $opt->{'email_send_driver'} = $d;
279     }
280    
281 dpavlin 49 $nos->send_queued_messages(
282     list => $list_name,
283     driver => $opt->{'email_send_driver'},
284     sleep => $opt->{'sleep'},
285     );
286 dpavlin 6
287 dpavlin 30
288 dpavlin 29 =item --inbox=list_name
289    
290     Feed incomming message back into notice sender.
291    
292     =cut
293    
294 dpavlin 36 } elsif ($list_name = $opt->{'inbox'}) {
295 dpavlin 29
296 dpavlin 36 my $message;
297     while(<>) {
298     $message .= $_;
299     }
300 dpavlin 29
301 dpavlin 36 $nos->inbox_message(
302     list => $list_name,
303     message => $message,
304     ) || die "can't receive message for list $list_name";
305    
306    
307 dpavlin 1 } else {
308 dpavlin 30 die "see perldoc $0 for help\n";
309 dpavlin 1 }
310    
311 dpavlin 8 =back
312    
313 dpavlin 15
314    
315     =head2 Helper options
316    
317     =over 20
318    
319     =item --debug
320    
321     Turn on debugging output from C<Class::DBI>
322    
323     =item --verbose
324    
325     Dump more info on screen.
326    
327     =back
328    
329    
330    
331 dpavlin 8 =head1 AUTHOR
332    
333     Dobrica Pavlinusic <dpavlin@rot13.org>
334    
335     =cut
336    

Properties

Name Value
svn:executable

  ViewVC Help
Powered by ViewVC 1.1.26