You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
postfixadmin/ADDITIONS/mkeveryone.pl

168 lines
4.0 KiB
Perl

#!/usr/bin/perl
#
# Generate an 'everybody' alias for a domain.
#
# Create the file /etc/mkeveryone.conf
# chmod 640 /etc/mkeveryone.conf
# Example of mkeveryone.conf
#
# userid=postfix
# passwd=postfix
# db=postfix
# host=localhost
# port=3306
# domain=domain.tld
# target=everybody@domain.tld
# ignore=vacation@domain.tld
# ignore=spam@domain.tld
# ignore=newsletter@domain.tld
# ignore=root@domain.tld
#
# Save this file in, for example, /usr/local/sbin/mkeveryone.pl
# chmod 750 /usr/local/sbin/mkeveryone.pl
#
# Run the script!
#
use DBI;
use Time::Local;
use POSIX qw(EAGAIN);
use Fcntl;
use IO;
use IO::File;
my $timeNow=time();
my $DATFILE = "/etc/mkeveryone.conf";
my $FILEHANDLE = "";
# database information
my $db="postfix";
my $host="localhost";
my $port="3306";
my $userid="postfix";
my $passwd="postfix";
my $domain="domain.tld";
my $target="everyone@$domain";
my @ignore;
my @dest;
open (FILEHANDLE, $DATFILE);
while ( $LINE = <FILEHANDLE> ) {
if ( length $LINE > 0 ) {
chomp $LINE;
$RETURNCODE = 0;
SWITCH: {
$LINE =~ /^ignore/i and do {
$LINE =~ s/^ignore// && $LINE =~ s/=// && $LINE =~ s/^ //g;
@ignore = (@ignore,$LINE);
};
$LINE =~ /^userid/i and do {
# Userid found.";
$LINE =~ s/^userid// && $LINE =~ s/=// && $LINE =~ s/^ //g;
$userid = $LINE;
};
$LINE =~ /^passwd/i and do {
# Passwd found.";
$LINE =~ s/^passwd// && $LINE =~ s/=// && $LINE =~ s/^ //g;
$passwd = $LINE;
};
$LINE =~ /^db/i and do {
# Database found.";
$LINE =~ s/^db// && $LINE =~ s/=// && $LINE =~ s/^ //g;
$db = $LINE;
};
$LINE =~ /^host/i and do {
# Database host found.";
$LINE =~ s/^host// && $LINE =~ s/=// && $LINE =~ s/^ //g;
$host = $LINE;
};
$LINE =~ /^port/i and do {
# Database host found.";
$LINE =~ s/^port// && $LINE =~ s/=// && $LINE =~ s/^ //g;
$port = $LINE;
};
$LINE =~ /^target/i and do {
# Database host found.";
$LINE =~ s/^target// && $LINE =~ s/=// && $LINE =~ s/^ //g;
$target = $LINE;
};
$LINE =~ /^domain/i and do {
# Database host found.";
$LINE =~ s/^domain// && $LINE =~ s/=// && $LINE =~ s/^ //g;
$domain = $LINE;
};
}
}
}
print "Connecting to database $db on $host:$port...\n\r";
print "Target email address is $target...\n\r";
my $connectionInfo="DBI:mysql:database=$db;$host:$port";
# make connection to database
$dbh = DBI->connect($connectionInfo,$userid,$passwd);
# Delete the old message...prepare and execute query
$query = "SELECT username FROM mailbox WHERE domain='$domain';";
$sth = $dbh->prepare($query);
$sth->execute();
# assign fields to variables
$sth->bind_columns(\$username);
my $ign="false";
while($sth->fetch()) {
$ign = "false";
foreach $ignored ( @ignore ) {
if ( $username eq $ignored ){
$ign = "true";
}
}
if ( $ign eq "false" ) {
@dest = (@dest,$username);
}
}
# Delete the old aliases...prepare and execute query
$query = "DELETE FROM alias WHERE address='$target';";
$sth = $dbh->prepare($query);
$sth->execute();
print "Record deleted from the database.\r\n";
$sth->finish();
$goto = join(",",@dest);
print "$goto\n\r\n\r";
# Insert the new message...prepare and execute query
$query = "INSERT INTO alias (address,goto,domain,created,modified) VALUES ('$target','$goto','$domain',now(),now());";
$sth = $dbh->prepare($query);
$sth->execute();
print "Record added to the database.\r\n";
$sth->finish();
# disconnect from databse
$dbh->disconnect;