/[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 69 - (show annotations)
Tue Aug 2 18:28:57 2005 UTC (18 years, 8 months ago) by dpavlin
File MIME type: text/plain
File size: 6550 byte(s)
added --aliases to specify aliases file other than /etc/aliases

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

Properties

Name Value
svn:executable

  ViewVC Help
Powered by ViewVC 1.1.26