/[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 55 - (show annotations)
Wed Jun 8 14:26:31 2005 UTC (18 years, 9 months ago) by dpavlin
File MIME type: text/plain
File size: 5683 byte(s)
warn if you didn't specify driver when using --send

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

Properties

Name Value
svn:executable

  ViewVC Help
Powered by ViewVC 1.1.26