[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