1 package Promulger::Dispatch;
7 # XXX allow the user to specify their own Email::Sender::Transport -- apeiron,
9 use Email::Sender::Simple qw(sendmail);
10 # XXX not yet -- apeiron, 2010-06-25
13 use Promulger::Config;
15 # XXX no bounce parsing yet -- apeiron, 2010-03-13
18 my $config = Promulger::Config->config;
20 my $email = Email::MIME->new($message);
21 my $recipient = $email->header('To');
22 my $local_user = user_for_address($recipient);
23 my $sender = $email->header('From');
24 my $subject = $email->header('Subject');
26 my $list = Promulger::List->resolve($local_user);
28 reject($recipient, $sender);
32 if($local_user =~ /-request$/) {
33 handle_request($list, $sender, $local_user, $subject, $config);
37 # they don't have a request for us, so they want to post a message
38 post_message($list, $email, $config);
43 my ($list, $sender, $recipient, $subject) = @_;
45 my $sender_address = bare_address($sender);
46 if($subject =~ /^\s*subscribe/i) {
47 print "going to subscribe $sender to " . $list->listname . "\n";
48 $list->subscribe($sender_address)
49 or already_subscribed($list, $recipient, $sender_address);
50 } elsif($subject =~ /^\s*unsubscribe/i) {
51 $list->unsubscribe($sender_address)
52 or not_subscribed($list, $recipient, $sender_address);
57 my ($list, $email, $config) = @_;
59 my $sender = $email->header('From');
60 my $sender_address = bare_address($sender);
61 my $recipient = $email->header('To');
63 unless($list->accept_posts_from($sender_address) && $list->active) {
64 reject($recipient, $sender);
68 # they're allowed to post (subscribed or not), the list is active. let's do
71 # XXX no MIME or other fancy handling for now -- apeiron, 2010-03-13
72 my $body = $email->body_str;
73 for my $subscriber (keys %{$list->subscribers}) {
74 # my $verped_from = Mail::Verp->encode($recipient, $subscriber);
76 # XXX we let the MTA create the message-id for us for now -- apeiron,
78 my $new_message = Email::MIME->create(
80 From => $sender_address,
82 Subject => $email->header('Subject'),
83 'Reply-to' => $recipient,
87 # XXX no queuing or job distribution for now beyond what the MTA provides
88 # -- apeiron, 2010-03-13
89 send_message($new_message);
95 my $config = Promulger::Config->config;
96 my ($class, $transport);
97 if($class = $config->{mailer}) {
99 $class = "Email::Sender::Transport::${class}";
102 $class = 'Email::Sender::Transport::Sendmail';
104 Class::MOP::load_class($class);
105 $transport = $class->new;
109 transport => $transport,
114 # XXX make this actually not suck -- apeiron, 2010-03-13
116 my ($recipient, $sender) = @_;
117 my $email = Email::MIME->create(
121 Subject => 'Rejected',
124 Sorry, your message to $recipient has been denied.
127 send_message($email);
131 my ($list, $recipient, $sender) = @_;
132 my $email = Email::MIME->create(
133 # XXX need admin address
137 Subject => 'Not subscribed',
140 Sorry, you are not subscribed to $list.
143 send_message($email);
146 sub already_subscribed {
147 my ($list, $recipient, $sender) = @_;
148 my $email = Email::MIME->create(
152 Subject => 'Already subscribed',
155 Sorry, you are already subscribed to $list.
158 send_message($email);
162 my ($full_addr) = @_;
163 my ($addr_obj) = Email::Address->parse($full_addr);
164 return $addr_obj->address;
167 sub user_for_address {
168 my ($full_addr) = @_;
169 my ($addr_obj) = Email::Address->parse($full_addr);
170 return $addr_obj->user;
173 'http://www.shadowcat.co.uk/blog/matt-s-trout/oh-subdispatch-oh-subdispatch/';