/[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 47 - (show annotations)
Tue May 24 14:02:05 2005 UTC (18 years, 11 months ago) by dpavlin
File MIME type: text/plain
File size: 5264 byte(s)
added SMTP driver, dependency on IO::All, various fixes and improvements

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

Properties

Name Value
svn:executable

  ViewVC Help
Powered by ViewVC 1.1.26