/[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 49 - (show annotations)
Tue May 24 16:44:34 2005 UTC (18 years, 11 months ago) by dpavlin
File MIME type: text/plain
File size: 5457 byte(s)
removed unneeded --bounce flag, cleanup, added --sleep (default: 3s)

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->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 = $lists->find_or_create({
140 name => $list_name,
141 }) || die "can't add list $list_name\n";
142
143 my $added = 0;
144
145 while(<>) {
146 chomp;
147 next if (/^#/ || /^\s*$/);
148 my ($email, $name) = split(/\s+/,$_, 2);
149 $added++ if ($nos->add_member_to_list( email => $email, name => $name, list => $list_name ));
150 }
151
152 print "list ",$list->name," has $added users\n";
153
154
155 =item --queue[=list_name]
156
157 Queue message for later delivery. Message can be read from file (specified as
158 argument) or read from C<STDIN>.
159
160 This option without optional parametar will display pending queue. If you
161 add C<--verbose> flag, it will display all messages in queue.
162
163 =cut
164
165 } elsif (defined($list_name = $opt->{'queue'})) {
166
167 if ($list_name ne '') {
168 # add message to list queue
169
170 my $message_text;
171 while(<>) {
172 $message_text .= $_;
173 }
174
175 my $id = $nos->add_message_to_list(
176 list => $list_name,
177 message => $message_text,
178 ) || die "can't add message to list $list_name\n";
179
180 print "added message $id to list $list_name\n";
181
182 } else {
183 # list messages in queue
184
185 foreach my $m ($queue->retrieve_all) {
186 next if ($m->all_sent && ! $verbose);
187
188 my $l = $m->all_sent ? 'S' : 'Q';
189
190 my $date = $m->message_id->date;
191 $date =~ s/\..+$//;
192 my $msg = $m->message_id->message;
193 $msg =~ s/\s+/ /gs;
194
195 $l .= sprintf(" %-15s %15s : ", $m->list_id->name, $date);
196 $l .= substr($msg, 0, 79 - length($l));
197
198 print "$l\n";
199 }
200
201 }
202
203
204 =item --send[=list_name]
205
206 Send e-mails waiting in queue, or with optional argument, just send messages
207 for single list.
208
209 Optional argument C<--driver=smtp> forces sending using SMTP server at
210 localhost (127.0.0.1).
211
212 Optional argument C<--sleep=42> defines that sender will sleep 42 seconds
213 between sending e-mail.
214
215 =cut
216
217 } elsif (defined($list_name = $opt->{'send'})) {
218
219 $nos->send_queued_messages(
220 list => $list_name,
221 driver => $opt->{'email_send_driver'},
222 sleep => $opt->{'sleep'},
223 );
224
225
226 =item --inbox=list_name
227
228 Feed incomming message back into notice sender.
229
230 =cut
231
232 } elsif ($list_name = $opt->{'inbox'}) {
233
234 my $message;
235 while(<>) {
236 $message .= $_;
237 }
238
239 $nos->inbox_message(
240 list => $list_name,
241 message => $message,
242 ) || die "can't receive message for list $list_name";
243
244
245 } else {
246 die "see perldoc $0 for help\n";
247 }
248
249 =back
250
251
252
253 =head2 Helper options
254
255 =over 20
256
257 =item --debug
258
259 Turn on debugging output from C<Class::DBI>
260
261 =item --verbose
262
263 Dump more info on screen.
264
265 =back
266
267
268
269 =head1 AUTHOR
270
271 Dobrica Pavlinusic <dpavlin@rot13.org>
272
273 =cut
274

Properties

Name Value
svn:executable

  ViewVC Help
Powered by ViewVC 1.1.26