/[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 48 - (show annotations)
Tue May 24 15:19:44 2005 UTC (18 years, 11 months ago) by dpavlin
File MIME type: text/plain
File size: 5492 byte(s)
handle bounces correctly

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

Properties

Name Value
svn:executable

  ViewVC Help
Powered by ViewVC 1.1.26