[Dovecot] dovecot bulletins?
Odhiambo Washington
odhiambo at gmail.com
Wed Jan 21 10:50:36 EET 2009
On Wed, Jan 21, 2009 at 1:28 AM, Timo Sirainen <tss at iki.fi> wrote:
> On Tue, 2009-01-20 at 23:18 +0100, Maciej Uhlig wrote:
> > Timo Sirainen:
> > > What exactly are they? I guess a global file that is served as a
> message
> > > for all users?
> > Right. With POP3 it is served once - after first user login after the
> > message was placed in bulletin database (just a plaintext file in a
> > directory, for instance).
> >
> > > That's more difficult to implement with IMAP than with
> > > POP3.
> > You know better, but... just place incoming (bulletin) mail in INBOX.
>
> Well, okay, I was thinking about a way to not duplicate the message to
> everyone's mailbox. And I guess with virtual mailboxes there's the
> problem that users can't then delete the message (or it gets deleted for
> everyone).
>
> So what you want is a mailing list for your users without actually going
> through MTA. Shouldn't be too difficult to implement as a plugin I
> guess. You'd mainly just need to somehow keep track of what messages
> have been delivered to the user. You could maybe even implement this as
> a shell script with http://wiki.dovecot.org/PostLoginScripting although
> of course then users who have long running imap sessions won't see the
> bulletins until they reconnect.
>
>
Just to chip in with my $2 cents...
I used tpop3d for a long time before switching to Dovecot and we had
Bulletins functionality using some perl hooks. Below is the perl script that
Chris Lightfoot (R.I.P), provided for this:
<QUOTE>
#!/usr/local/bin/perl
use GDBM_File;
#Implementing POP3 server bulletins using tpop3d
#$Id: README.bulletins,v 1.1 2003/08/01 12:11:38 chris Exp $
# At many large sites it is useful to be able to distribute a `bulletin'
message
# to all mail users. tpop3d can provide this functionality by having user
login
# trigger delivery of any outstanding bulletin messages via the onlogin
# handler mechanism, as for POP-before-SMTP.
# This is new and untested functionality, but the basic idea is that you
specify
# onlogin-child-wait: yes
# in tpop3d.conf, then write an auth-perl or auth-other onlogin action to
handle
# bulletin delivery. Here is a sketch of a perl subroutine that could be
used
# for this:
# onlogin_bulletins_handler REQUEST
# Deliver any bulletins which are pending for the authenticated user
# identified in the REQUEST. This subroutine is called by tpop3d, which
# will set REQUEST->{local_part} and REQUEST->{domain} to the proper
# values. Bulletins should be complete RFC822 messages stored in flat
# text files under /etc/mail/bulletins, each with the extension .msg.
# This function will use a GDBM database for each bulletin to record the
# addresses of users to whom it has been delivered, so as to ensure that
# each user receives only one copy of each bulletin. Bulletins are
# delivered to user mailboxes using the local mail transport agent, though
# this behaviour could be changed if required.
sub onlogin_bulletins_handler ($) {
my $req = shift;
my $resp = { };
#
# Iterate over list of bulletins.
#
foreach my $bull (glob("/usr/local/etc/tpop3d/bulletins/*.msg")) {
my $recips = $bull;
# Obtain and tie delivery database, creating it if it does not
# already exist.
$recips =~ s/msg$/db/;
my $r = $req->{local_part} . '@' . $req->{domain};
my %rr;
tie(%rr, 'GDBM_File', $recips, &GDBM_File::GDBM_WRCREAT, 0600);
# Attempt delivery if this user has not already been sent a copy
# of this message.
if (!exists($rr{$r})) {
# Invoke sendmail. There are better ways of doing this, but
# this is simplest. Note that it wouldn't usually be safe to
# call sendmail in this way, but tpop3d has already
# authenticated somebody using the given local-part and
# domain, so they're presumably safe strings.
system("sendmail -oi '$r' < $bull");
if ($? == 0) {
# Sendmail exits with code 0 on success.
$rr{$r} = 1;
} else {
# Sendmail (or system(3)) failed. There's not a whole lot
# we can do here, but we log a message and abort sending
# any other bulletins to this user for the moment.
untie(%rr);
return { logmsg => "sendmail failed; error code $?" };
}
}
untie(%rr);
}
# Don't log anything in case of success; we might want to note how
# many bulletins were delivered or something, of course.
return { };
}
</QUOTE>
The configuration end of tpop3d (tpop3d.conf) required the following:
# Enable authentication via an embedded perl interpreter.
auth-perl-enable: true
# auth-perl-start: perl code
# Specify a line of perl code to be executed at startup.
auth-perl-start: do '/usr/local/etc/tpop3d/bulletins.pl';
# auth-perl-finish: perl code
# Specify a line of perl code to be executed when the authentication driver
#auth-perl-finish:
# auth-perl-apop: subroutine name
# Specify the name of a perl subroutine which will be called when
#auth-perl-apop:
# auth-perl-pass: subroutine name
# Specify the name of a perl subroutine which will be called when
#auth-perl-pass:
# auth-perl-onlogin: subroutine name
# Specify the name of a perl subroutine which will be called after
auth-perl-onlogin: onlogin_bulletins_handler
Perhaps someone can easily adapt that to Dovecot using
PostLoginScripting<http://wiki.dovecot.org/PostLoginScripting>
.
In worst case scenario, one could run tpop3d for POP3 and Dovecot for IMAP
to get the functionality.
PS: tpop3d was licensed under GNU GENERAL PUBLIC LICENSE.
--
Best regards,
Odhiambo WASHINGTON,
Nairobi,KE
+254733744121/+254722743223
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
"The only time a woman really succeeds in changing a man is when he is a
baby."
- Natalie Wood
More information about the dovecot
mailing list