#!/usr/bin/perl -w # mail-admin.pl # command-line script for manipulating Postfix + MySQL e-mail database # Copyright 2004, Tex Thompson use strict; use DBI; use File::Basename; use Getopt::Long; # Confguration Information $0 = basename $0; my $dbh = &get_dbh; my $mail_user = $ENV{'USER'}; my $add_alias; my $print = 0; GetOptions( "user=s", \$mail_user, "add_alias=s", \$add_alias, "print", \$print, ); if ( $add_alias ) { &add_alias( $mail_user, $add_alias ); } if ( $print ) { &print_local_aliases( $mail_user ); &print_remote_aliases( $mail_user ); } # close everything down and exit the program $dbh->disconnect or die "Error closing database connection\n"; ############### # subroutines # ############### sub add_alias { my ($user,$alias) = shift; print "Delivering mail to $alias for user $user ...\n"; my $uid = uid( $user ); my $gid = gid( $user ); my $sql; $sql = "INSERT INTO aliases (vuid,vgid,alias,maildir) "; $sql .= "VALUES (?,?,?,?);"; my $sth = $dbh->prepare( $sql ) or die $dbh->errstr; $sth->execute( $uid,$gid,$alias,$user ) or warn $sth->errstr; if ($@) { print "Error executing SQL statement!\n"; } } sub print_local_aliases { my $user = shift; # local aliases my ($vuid,$vgid,$address,$maildir); my $sql = 'SELECT vuid,vgid,alias,maildir FROM aliases'; $sql .= " WHERE maildir='$user'"; my $sth = $dbh->prepare( $sql ) or die $dbh->errstr; $sth->execute() or warn $sth->errstr; $sth->bind_columns( \($vuid,$vgid,$address,$maildir) ); print "Mail aliases delivered locally to $user:\n"; while ( $sth->fetch ) { print "\t$address\n"; } } sub print_remote_aliases { my $user = shift; # remote aliases my ($alias,$rcpt,$sql); $sql = 'SELECT alias,rcpt FROM remote_aliases '; $sql .= "WHERE alias LIKE \"$user@%\""; my $sth = $dbh->prepare( $sql ) or die $dbh->errstr; print "$sql\n"; $sth->execute() or warn $sth->errstr; $sth->bind_columns( \($alias, $rcpt) ); print "Remote addresses for $user:\n"; if ( $sth->fetch ) { while( $sth->fetch ) { print "\t$alias -> $rcpt\n"; } } else { print "\tNo matching addresses\n"; } } sub uid { my $username = shift; my $retval = `id -u $username`; print $retval; if ( $retval eq '' ) { warn "Error obtaining gid information for $username\n"; } else { return $retval; } } sub gid { my $username = shift; my $retval = `id -g $username`; if ( $retval eq '' ) { warn "Error obtaining gid information for $username\n"; } else { return $retval; } } sub get_dbh { my $db_user = 'foo'; my $db_pass = 'ba'; my $db_table = 'maildb'; my $dsn = "DBI:mysql:$db_table"; my $dbh = DBI->connect( $dsn, $db_user, $db_pass ) or die "Error connecting to database\n"; return $dbh; }