[Dovecot] mailbox not acceced
mouss
mouss at netoyen.net
Tue Feb 12 01:53:17 EET 2008
Osvaldo Alvarez Pozo wrote:
> i changed permissions, but no results
> So i added a field to the table mailbox like this:
> alter table mailbox add last_login datetime NOT NULL default
> '0000-00-00 00:00:00';
>
That's not a strictly valid date. better use a real date ('1970-01-01
00:00:00' for instance). software that accesses databases in a portable
manner may break if you use non portable dates.
> for the moment I run two cron jobs
> 1 egrep "dovecot: (imap|pop3)-login" /var/log/mail.log >/var/log/maillog
>
>
since you're using perl, no need for the egrep part. see below.
> 2 /root/accounts
> this scripts has de following content:
>
> #!/usr/bin/perl
> use DBI;
> $dbpath = "dbi:mysql:database=postfix;host=localhost";
> $dbh = DBI->connect($dbpath, "user","passwd")
> or die "Can't open database: $DBI::errstr";
> open (FICHIER ,"/var/log/maillog");
> while (<FICHIER>) {
> ($value0,$value1,undef)=split(/</);
> ($user,undef)=split(/>/,$value1);
>
>
> $requete = "update mailbox set last_login =now() where username='$user'";
> $sth = $dbh->prepare($requete);
>
> $sth->execute();
> $sth -> finish;
> }
> close FICHIER;
> $dbh -> disconnect
>
#!/usr/bin/perl
use DBI;
use strict;
my $logfile = "/var/log/mail.log"; # or $ARGV[0]...
# syslog doesn't include a year... we could use current time or stat the
logfile or ...
my $current_year='2008';
my %monthnum =
qw( Jan 1 Feb 2 Mar 3 Apr 4 May 5 Jun 6 Jul 7 Aug 8 Sep 9 Oct 10 Nov
11 Dec 12 );
my %lastaccess = ();
open(LOGFILE, "$logfile") or die "Cannot open $logfile: $!\n";
while (<LOGFILE>)
chomp;
if (! /dovecot: (imap|pop3)-login/) { next; }
my ($monthname, $day, $time, $line) = split('\s+', $_, 4);
# XXX no space in usernames...
if ($line !~ /user=<(\S+)>/) { next;}
$lastaccess{$1} = $current_year . "-" . $monthnum{$monthname} .
"-$day $time";
}
close(LOGFILE);
#foreach (keys %lastaccess) { print "$_: $lastaccess{$_}\n"; }
now you have the timestamp of last access for each user. and you can
update your table.
to avoid, a lot of UPDATE queries, create a temporrary table in the
script and use INSERT with multiple values in a single query. then
UPDATE using the temporary table.
> This solution is far from being efficient.The precition is 24 hours
> wich is ok for know. I would really love doing this from dovecot. I am
> disapointed for not being able to make it work from dovecot.
> I use debian Etch & dovecot was compiled by hand, is that important?
>
More information about the dovecot
mailing list