/[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 32 - (show annotations)
Mon May 16 22:32:58 2005 UTC (18 years, 11 months ago) by dpavlin
File MIME type: text/plain
File size: 5149 byte(s)
uniqe hashes are now really unique for each list-user-message pair

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: "| /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 "email=s" => \$opt->{'email'},
44 );
45
46 my $nos = new Nos(
47 dsn => 'dbi:Pg:dbname=notices',
48 user => 'dpavlin',
49 passwd => '',
50 debug => $debug,
51 verbose => $verbose,
52 );
53
54 my $loader = $nos->{'loader'} || die "can't find loader?";
55
56 my $lists = $loader->find_class('lists');
57 my $users = $loader->find_class('users');
58 my $user_list = $loader->find_class('user_list');
59 my $messages = $loader->find_class('messages');
60 my $queue = $loader->find_class('queue');
61 my $sent = $loader->find_class('sent');
62
63 $queue->set_sql( list_queue => qq{
64 SELECT messages.message, messages.date AS date, lists.name AS list
65 FROM queue
66 JOIN messages on message_id = messages.id
67 JOIN lists on list_id = lists.id
68 } );
69
70 my $list_name;
71
72
73 =item --new=list_name my-list@example.com
74
75 Adds new list. You can also feed list name as first line to C<STDIN>.
76
77 =cut
78
79 if ($list_name = $opt->{'new'}) {
80
81 my $email = shift @ARGV || <>;
82 chomp($email);
83
84 die "need e-mail address for list (as argument or on STDIN)\n" unless ($email);
85
86 my $l = $nos->_get_list($list_name) || $nos->_add_list(
87 list => $list_name,
88 email => $email,
89 ) || die "can't add list $list_name\n";
90
91 print "added list $list_name with ID ",$l->id,"\n";
92
93
94 =item --list[=list_name]
95
96 List all available lists and users on them.
97
98 Optional value is name of list. With it, this option will produce just users
99 on that list.
100
101 =cut
102
103 } elsif (defined($list_name = $opt->{'list'})) {
104
105 my @lists;
106
107 if ($list_name ne '') {
108 @lists = $lists->search( name=> $list_name )->first || die "can't find list $list_name";
109 } else {
110 @lists = $lists->retrieve_all;
111 }
112
113 foreach my $list (@lists) {
114 print $list->name," <",$list->email,">\n";
115 foreach my $user_on_list ($user_list->search(list_id => $list->id)) {
116 my $user = $users->retrieve( id => $user_on_list->user_id );
117 print "\t",$user->full_name," <", $user->email, ">\n";
118 }
119 }
120
121
122 =item --add=list_name
123
124 Add users to list. Users are stored in file (which can be supplied as
125 argument) or read from C<STDIN>. List should be in following format:
126
127 email@example.com Optional full name of person
128 dpavlin@rot13.org Dobrica Pavlinusic
129
130 You may use C<--email> parametar at any time to set From: e-mail address for list.
131 B<This seems somewhat cludgy, and it will probably change in future>.
132
133 =cut
134
135 } elsif ($list_name = $opt->{'add'}) {
136
137 my $list = $lists->find_or_create({
138 name => $list_name,
139 }) || die "can't add 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(" %-10s %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 =cut
208
209 } elsif (defined($list_name = $opt->{'send'})) {
210
211 $nos->send_queued_messages($list_name);
212
213
214 =item --inbox=list_name
215
216 Feed incomming message back into notice sender.
217
218 =cut
219
220 } elsif ($opt->{'inbox'}) {
221
222 warn "inbox option is not implemented";
223
224 } else {
225 die "see perldoc $0 for help\n";
226 }
227
228 =back
229
230
231
232 =head2 Helper options
233
234 =over 20
235
236 =item --debug
237
238 Turn on debugging output from C<Class::DBI>
239
240 =item --verbose
241
242 Dump more info on screen.
243
244 =item --email
245
246 Used to specify e-mail address where needed.
247
248 =back
249
250
251
252 =head1 AUTHOR
253
254 Dobrica Pavlinusic <dpavlin@rot13.org>
255
256 =cut
257

Properties

Name Value
svn:executable

  ViewVC Help
Powered by ViewVC 1.1.26