[Dovecot] mailbox not acceced
Hi I wonder how can I know if a mailbox is not beeing consulted. I mean I have severals mailboxs but I know some account are not used. I like to know how to determine wich mail accounts are not beeing used. Is there any way in dovecot to know the las time a user loged in to dovecot?
Thanks
Osvaldo Alvarez Pozo wrote:
Hi I wonder how can I know if a mailbox is not beeing consulted. I mean I have severals mailboxs but I know some account are not used. I like to know how to determine wich mail accounts are not beeing used. Is there any way in dovecot to know the las time a user loged in to dovecot?
Thanks
I'm using dovecot's ability to use "pre execution" scripts.
Basically i have in my imap protocol definition in dovecot.conf an alternate mail_executable
protocol imap { ... mail_executable = /usr/local/bin/imap-wrapper.sh ... }
And that executable has the following:
---- snip ---- #!/bin/sh
# Filesystem based timestamp in user's home directory and protocol used echo imap > /var/spool/lastlogin/$UID
# Finally execute the imap/pop3 binary. If you use both, you'll need two scripts. exec /usr/lib/dovecot/imap ---- snip ----
I echo the protocol into the file because i have both pop and imap available to my users and this way i can keep track when was the last time they accessed their mailbox (ls -l /var/spool/lastlogin/username) and which protocol they used in that access (cat /var/spool/lastlogin/username).
There are inumerous possibilities of course.
Regards,
Hugo Monteiro.
-- ci.fct.unl.pt:~# cat .signature
Hugo Monteiro Email : hugo.monteiro@fct.unl.pt Telefone : +351 212948300 Ext.15307
Centro de Informática Faculdade de Ciências e Tecnologia da Universidade Nova de Lisboa Quinta da Torre 2829-516 Caparica Portugal Telefone: +351 212948596 Fax: +351 212948548 www.ci.fct.unl.pt apoio@fct.unl.pt
ci.fct.unl.pt:~# _
i was looking your mail and as I have a data base i added a field to de data base I modified the script so it lokks like this.
#!/bin/sh echo "update mailbox set last_log = now() WHERE username = '$USER'" | mysql postfix exec /usr/dovecot/libexec/dovecot/pop3
but nothing gets written to the field. I think there is a problem with the value of variable $USER, as this is a shell script. Any Ideas?
On Feb 11, 2008 1:42 PM, Hugo Monteiro <hugo.monteiro@fct.unl.pt> wrote:
Osvaldo Alvarez Pozo wrote:
Hi I wonder how can I know if a mailbox is not beeing consulted. I mean I have severals mailboxs but I know some account are not used. I like to know how to determine wich mail accounts are not beeing used. Is there any way in dovecot to know the las time a user loged in to dovecot?
Thanks
I'm using dovecot's ability to use "pre execution" scripts.
Basically i have in my imap protocol definition in dovecot.conf an alternate mail_executable
protocol imap { ... mail_executable = /usr/local/bin/imap-wrapper.sh ... }
And that executable has the following:
---- snip ---- #!/bin/sh
# Filesystem based timestamp in user's home directory and protocol used echo imap > /var/spool/lastlogin/$UID
# Finally execute the imap/pop3 binary. If you use both, you'll need two scripts. exec /usr/lib/dovecot/imap ---- snip ----
I echo the protocol into the file because i have both pop and imap available to my users and this way i can keep track when was the last time they accessed their mailbox (ls -l /var/spool/lastlogin/username) and which protocol they used in that access (cat /var/spool/lastlogin/username).
There are inumerous possibilities of course.
Regards,
Hugo Monteiro.
-- ci.fct.unl.pt:~# cat .signature
Hugo Monteiro Email : hugo.monteiro@fct.unl.pt Telefone : +351 212948300 Ext.15307
Centro de Informática Faculdade de Ciências e Tecnologia da Universidade Nova de Lisboa Quinta da Torre 2829-516 Caparica Portugal Telefone: +351 212948596 Fax: +351 212948548 www.ci.fct.unl.pt apoio@fct.unl.pt
ci.fct.unl.pt:~# _
Osvaldo Alvarez Pozo wrote:
i was looking your mail and as I have a data base i added a field to de data base I modified the script so it lokks like this.
#!/bin/sh echo "update mailbox set last_log = now() WHERE username = '$USER'" | mysql postfix exec /usr/dovecot/libexec/dovecot/pop3
but nothing gets written to the field. I think there is a problem with the value of variable $USER, as this is a shell script. Any Ideas?
You should be using $UID and not $USER.
Regards,
Hugo Monteiro.
-- ci.fct.unl.pt:~# cat .signature
Hugo Monteiro Email : hugo.monteiro@fct.unl.pt Telefone : +351 212948300 Ext.15307
Centro de Informática Faculdade de Ciências e Tecnologia da Universidade Nova de Lisboa Quinta da Torre 2829-516 Caparica Portugal Telefone: +351 212948596 Fax: +351 212948548 www.ci.fct.unl.pt apoio@fct.unl.pt
ci.fct.unl.pt:~# _
Hugo Monteiro wrote:
Osvaldo Alvarez Pozo wrote:
i was looking your mail and as I have a data base i added a field to de data base I modified the script so it lokks like this.
#!/bin/sh echo "update mailbox set last_log = now() WHERE username = '$USER'" | mysql postfix exec /usr/dovecot/libexec/dovecot/pop3
but nothing gets written to the field. I think there is a problem with the value of variable $USER, as this is a shell script. Any Ideas?
You should be using $UID and not $USER.
and mysql postfix -e "update ...." instead of echo "..." | mysql ...
I did some test & the value of $UID is zero. how could I recover the value of the logged user? Thanks.
On Feb 11, 2008 6:57 PM, mouss <mouss@netoyen.net> wrote:
Hugo Monteiro wrote:
Osvaldo Alvarez Pozo wrote:
i was looking your mail and as I have a data base i added a field to de data base I modified the script so it lokks like this.
#!/bin/sh echo "update mailbox set last_log = now() WHERE username = '$USER'" | mysql postfix exec /usr/dovecot/libexec/dovecot/pop3
but nothing gets written to the field. I think there is a problem with the value of variable $USER, as this is a shell script. Any Ideas?
You should be using $UID and not $USER.
and mysql postfix -e "update ...." instead of echo "..." | mysql ...
Hi did another test if I run from the console mysql postfix -e "update mailbox set last_log = now() WHERE username = 'info@lab.fr'" the field last_log gets updated. but no way to make it work from /etc/dovecot.dovecot.conf
On Feb 11, 2008 8:21 PM, Osvaldo Alvarez Pozo <nebano@gmail.com> wrote:
I did some test & the value of $UID is zero. how could I recover the value of the logged user? Thanks.
On Feb 11, 2008 6:57 PM, mouss <mouss@netoyen.net> wrote:
Hugo Monteiro wrote:
Osvaldo Alvarez Pozo wrote:
i was looking your mail and as I have a data base i added a field to de data base I modified the script so it lokks like this.
#!/bin/sh echo "update mailbox set last_log = now() WHERE username = '$USER'" | mysql postfix exec /usr/dovecot/libexec/dovecot/pop3
but nothing gets written to the field. I think there is a problem with the value of variable $USER, as this is a shell script. Any Ideas?
You should be using $UID and not $USER.
and mysql postfix -e "update ...." instead of echo "..." | mysql ...
On Mon, 11 Feb 2008, Osvaldo Alvarez Pozo wrote:
Hi did another test if I run from the console mysql postfix -e "update mailbox set last_log = now() WHERE username = 'info@lab.fr'" the field last_log gets updated. but no way to make it work from /etc/dovecot.dovecot.conf
Sounds like a permissions problem. Put something like the following in a file readable only by root, which is what the PostLogin script runs as unless you've configured it to drop privileges before it runs:
$ cat foo.mysql # MySQL connection data [client] user=someone password=whatever
Then, change the line to:
mysql --defaults-file=foo.mysql postfix -e "update ..."
I also think that $USER is the variable you want, not $UID. UID = user ID, which is usually numeric. But, dovecot sets USER to something useful (IIRC, it depends on what variables you use elsewhere in your config as to whether it includes the domain.).
Best, Ben
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';
for the moment I run two cron jobs 1 egrep "dovecot: (imap|pop3)-login" /var/log/mail.log >/var/log/maillog
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
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?
Thanks a lot
On Feb 11, 2008 8:34 PM, Benjamin R. Haskell <dovecot@benizi.com> wrote:
On Mon, 11 Feb 2008, Osvaldo Alvarez Pozo wrote:
Hi did another test if I run from the console mysql postfix -e "update mailbox set last_log = now() WHERE username = 'info@lab.fr'" the field last_log gets updated. but no way to make it work from /etc/dovecot.dovecot.conf
Sounds like a permissions problem. Put something like the following in a file readable only by root, which is what the PostLogin script runs as unless you've configured it to drop privileges before it runs:
$ cat foo.mysql # MySQL connection data [client] user=someone password=whatever
Then, change the line to:
mysql --defaults-file=foo.mysql postfix -e "update ..."
I also think that $USER is the variable you want, not $UID. UID = user ID, which is usually numeric. But, dovecot sets USER to something useful (IIRC, it depends on what variables you use elsewhere in your config as to whether it includes the domain.).
Best, Ben
On Mon, 11 Feb 2008, Osvaldo Alvarez Pozo wrote:
i changed permissions, but no results
Are you sure the connection is opened correctly? If I were debugging this on my machine I'd:
- Add something to check that the MySQL connection is fine:
mysql postfix -e "select now()" > /root/dovecot-debug
- and that USER contains what you think it contains:
echo $USER >> /root/dovecot-debug
[ 3) or more generally: ]
env | sort >> /root/dovecot-debug
[... cron jobs ...]
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?
It shouldn't be, no. This still seems more like a MySQL problem than something specific to Dovecot.
Best, Ben
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?
On Mon, 11 Feb 2008, Hugo Monteiro wrote:
Osvaldo Alvarez Pozo wrote:
Hi I wonder how can I know if a mailbox is not beeing consulted. I mean I have severals mailboxs but I know some account are not used. I like to know how to determine wich mail accounts are not beeing used. Is there any way in dovecot to know the las time a user loged in to dovecot?
Thanks
I'm using dovecot's ability to use "pre execution" scripts.
Basically i have in my imap protocol definition in dovecot.conf an alternate mail_executable
protocol imap { ... mail_executable = /usr/local/bin/imap-wrapper.sh ... }
And that executable has the following:
---- snip ---- #!/bin/sh
# Filesystem based timestamp in user's home directory and protocol used echo imap > /var/spool/lastlogin/$UID
# Finally execute the imap/pop3 binary. If you use both, you'll need two scripts. exec /usr/lib/dovecot/imap ---- snip ----
I echo the protocol into the file because i have both pop and imap available to my users and this way i can keep track when was the last time they accessed their mailbox (ls -l /var/spool/lastlogin/username) and which protocol they used in that access (cat /var/spool/lastlogin/username).
There are inumerous possibilities of course.
For a summary of recent-past emails about this, see: http://dovecot.org/list/dovecot/2007-November/027148.html
To make the script in this email work for both POP3 and IMAP:
$ cat /root/dovecot-login.sh
#!/bin/sh
PROTO=basename $0
echo $PROTO > /var/spool/lastlogin/$UID
exec /usr/libexec/dovecot/$PROTO
$ ln -s /root/dovecot-login.sh /root/imap $ ln -s /root/dovecot-login.sh /root/pop3
In dovecot.conf:
protocol imap { ... mail_executable = /root/imap ... }
protocol pop3 { ... mail_executable = /root/pop3 ... }
Best, Ben
Osvaldo Alvarez Pozo wrote:
Hi I wonder how can I know if a mailbox is not beeing consulted. I mean I have severals mailboxs but I know some account are not used. I like to know how to determine wich mail accounts are not beeing used. Is there any way in dovecot to know the las time a user loged in to dovecot?
you can parse the logs.
participants (4)
-
Benjamin R. Haskell
-
Hugo Monteiro
-
mouss
-
Osvaldo Alvarez Pozo