1 package Promulger::Dispatch;
7 # XXX allow the user to specify their own Email::Sender::Transport -- apeiron,
9 use Email::Sender::Simple qw(sendmail);
12 use Promulger::Config;
14 # XXX no bounce parsing yet -- apeiron, 2010-03-13
17 my $config = Promulger::Config->config;
19 my $email = Email::Simple->new($message);
20 my $recipient = $email->header('To');
21 my $local_user = user_for_address($recipient);
22 my $sender = $email->header('From');
23 my $subject = $email->header('Subject');
25 my $list = Promulger::List->resolve($local_user);
27 reject($recipient, $sender);
31 if($local_user =~ /-request$/) {
32 handle_request($list, $sender, $local_user, $subject, $config);
36 # they don't have a request for us, so they want to post a message
37 post_message($list, $email, $config);
42 my ($list, $sender, $recipient, $subject) = @_;
44 my $sender_address = bare_address($sender);
45 if($subject =~ /^\s*subscribe/i) {
46 $list->subscribe($sender_address)
47 or already_subscribed($list, $recipient, $sender_address);
48 } elsif($subject =~ /^\s*unsubscribe/i) {
49 $list->unsubscribe($sender_address)
50 or not_subscribed($list, $recipient, $sender_address);
55 my ($list, $email, $config) = @_;
57 my $sender = $email->header('From');
58 my $sender_address = bare_address($sender);
59 my $recipient = $email->header('To');
61 unless($list->accept_posts_from($sender_address) && $list->active) {
62 reject($recipient, $sender);
66 # they're allowed to post (subscribed or not), the list is active. let's do
69 # XXX no MIME or other fancy handling for now -- apeiron, 2010-03-13
70 my $body = $email->body;
71 for my $subscriber (keys %{$list->subscribers}) {
72 #my $verped_from = Mail::Verp->encode($recipient, $subscriber);
73 # XXX we let the MTA create the message-id for us for now -- apeiron,
75 my $new_message = Email::Simple->create(
79 Subject => $email->header('Subject'),
83 # XXX no queuing or job distribution for now beyond what the MTA provides
84 # -- apeiron, 2010-03-13
85 sendmail($new_message);
89 # XXX make this actually not suck -- apeiron, 2010-03-13
91 my ($recipient, $sender) = @_;
92 my $email = Email::Simple->create(
96 Subject => 'Rejected',
99 Sorry, your message to $recipient has been denied.
106 my ($list, $recipient, $sender) = @_;
107 my $email = Email::Simple->create(
108 # XXX need admin address
112 Subject => 'Not subscribed',
115 Sorry, you are not subscribed to $list.
121 sub already_subscribed {
122 my ($list, $recipient, $sender) = @_;
123 my $email = Email::Simple->create(
127 Subject => 'Already subscribed',
130 Sorry, you are already subscribed to $list.
137 my ($full_addr) = @_;
138 my ($addr_obj) = Email::Address->parse($full_addr);
139 return $addr_obj->address;
142 sub user_for_address {
143 my ($full_addr) = @_;
144 my ($addr_obj) = Email::Address->parse($full_addr);
145 return $addr_obj->user;
148 'http://www.shadowcat.co.uk/blog/matt-s-trout/oh-subdispatch-oh-subdispatch/';