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

Contents of /trunk/sender.pl

Parent Directory Parent Directory | Revision Log Revision Log


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

Properties

Name Value
svn:executable

  ViewVC Help
Powered by ViewVC 1.1.26