/[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 53 - (show annotations)
Wed May 25 15:20:38 2005 UTC (18 years, 10 months ago) by dpavlin
File MIME type: text/plain
File size: 5457 byte(s)
added full from address to --list

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 $nos->send_queued_messages(
218 list => $list_name,
219 driver => $opt->{'email_send_driver'},
220 sleep => $opt->{'sleep'},
221 );
222
223
224 =item --inbox=list_name
225
226 Feed incomming message back into notice sender.
227
228 =cut
229
230 } elsif ($list_name = $opt->{'inbox'}) {
231
232 my $message;
233 while(<>) {
234 $message .= $_;
235 }
236
237 $nos->inbox_message(
238 list => $list_name,
239 message => $message,
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