MySQL Multi Policy Server befindet sich noch im BETA Status bzw. Entwicklungsphase.
Download komplett unter → Downloads
Status
- Postgrey funktioniert soweit schon. (Valid ist noch nicht fertig.)
- Autoresponder funktioniert.
Folgende Funktionen soll MMPS dann können wenn es fertig ist
- Postgrey per User / Domain aktivieren / deaktivieren.
- Delay per User / Domain
- Valid per User / Domain
Datenbank Layout
CREATE TABLE `autoresponder_mail` ( `id` int(11) NOT NULL auto_increment, `sender` varchar(255) NOT NULL, `sender_name` varchar(255) NOT NULL, `subject` varchar(255) NOT NULL, `message` text NOT NULL, `von_timestamp` int(11) NOT NULL, `bis_timestamp` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `sender` (`sender`) ) TYPE=MyISAM COMMENT='Autoresponder Tabelle' AUTO_INCREMENT=2 ; -- -- Daten für Tabelle `autoresponder_mail` -- INSERT INTO `autoresponder_mail` (`id`, `sender`, `sender_name`, `subject`, `message`, `von_timestamp`, `bis_timestamp`) VALUES (1, ' test@example.com', 'TEST HELIX', 'Bin nicht im Büro', 'Hallo,\r\n\r\nich bin zurzeit nicht im Büro.\r\n\r\nAb 30. Mai 2008 bin ich wieder da.\r\n\r\nGruß\r\n\r\nMaximilian Thoma\r\n\r\näüö?ß', 0, 999999999); CREATE TABLE `black_mail` ( `id` int(11) NOT NULL auto_increment, `recipient` varchar(255) NOT NULL, `sender` varchar(255) NOT NULL, `aktiv` int(2) NOT NULL default '1', PRIMARY KEY (`id`) ) TYPE=MyISAM COMMENT='Blacklist' AUTO_INCREMENT=1 ; CREATE TABLE `grey_active` ( `id` int(11) NOT NULL auto_increment, `client_address` varchar(255) NOT NULL, `recipient` varchar(255) NOT NULL, `sender` varchar(255) NOT NULL, `timestamp` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `recipient` (`recipient`,`sender`) ) TYPE=MyISAM COMMENT='Aktiven Greylistenings' AUTO_INCREMENT=38 ; CREATE TABLE `grey_mail` ( `id` int(11) NOT NULL auto_increment, `name` varchar(255) NOT NULL COMMENT 'Domain oder Mailadresse', `delay` int(11) NOT NULL COMMENT 'Verzögerung bis es durch Greylistening freigegeben wird', `valid` int(11) NOT NULL COMMENT 'Wie lange gilt die Freigabe in Sekunden', PRIMARY KEY (`id`), KEY `name` (`name`) ) TYPE=MyISAM COMMENT='User/Domains für die Greylistening aktiviert ist' AUTO_INCREMENT=3 ; -- -- Daten für Tabelle `grey_mail` -- INSERT INTO `grey_mail` (`id`, `name`, `delay`, `valid`) VALUES (1, ' postmaster@example.com', 60, 3600), (2, ' test@example.com', 15, 3600); CREATE TABLE `pps_log` ( `id` int(11) NOT NULL auto_increment, `sender` varchar(255) NOT NULL, `recipient` varchar(255) NOT NULL, `client_address` varchar(255) NOT NULL, `timestamp` int(11) NOT NULL, `comment` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) TYPE=MyISAM COMMENT='MTHPPS LOG' AUTO_INCREMENT=1 ; CREATE TABLE `white_mail` ( `id` int(11) NOT NULL auto_increment, `recipient` varchar(255) NOT NULL, `sender` varchar(255) NOT NULL, `aktiv` int(2) NOT NULL default '1', PRIMARY KEY (`id`) ) TYPE=MyISAM COMMENT='Whitelist' AUTO_INCREMENT=1 ;
PHP Script
<?php
// MySQL Multi Policy Server V.1.0
// Maximilian Thoma
// http://www.thoma.cc
// info@thoma.cc
//////////////////////////////////////////////////////////////////////////////////////
// OPTIONS
//////////////////////////////////////////////////////////////////////////////////////
$mysqlhost="localhost";
$mysqluser="mps";
$mysqlpass="PASSWORD";
$mysqldb="multipolicyserver";
//////////////////////////////////////////////////////////////////////////////////////
// Ab hier nichts mehr ändern !
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
// DB Class
//////////////////////////////////////////////////////////////////////////////////////
class db {
var $link_id = 0;
var $query_id = 0;
var $record = array();
var $errdesc = "";
var $errno = 0;
var $show_error = 0;
var $server = "";
var $user = "";
var $password = "";
var $database = "";
var $appname = "MySQL Postgrey Policy Server";
function db($server,$user,$password,$database) {
$this->server=$server;
$this->user=$user;
$this->password=$password;
$this->database=$database;
$this->connect();
}
function connect() {
$this->link_id=mysql_connect($this->server,$this->user,$this->password);
if (!$this->link_id) $this->print_error("Link-ID == false, connect failed");
if ($this->database!="") $this->select_db($this->database);
}
function geterrdesc() {
$this->error=mysql_error();
return $this->error;
}
function geterrno() {
$this->errno=mysql_errno();
return $this->errno;
}
function select_db($database="") {
if ($database!="") $this->database=$database;
if(!@mysql_select_db($this->database, $this->link_id)) $this->print_error("cannot use database ".$this->database);
}
function query($query_string) {
global $query_count;
//echo $query_string."<br>";
$query_count++;
$this->query_id = mysql_query($query_string,$this->link_id);
if (!$this->query_id) $this->print_error("Invalid SQL: ".$query_string);
return $this->query_id;
}
function fetch_array($query_id=-1) {
if ($query_id!=-1) $this->query_id=$query_id;
$this->record = mysql_fetch_array($this->query_id);
return $this->record;
}
function fetch_row($query_id=-1) {
if ($query_id!=-1) $this->query_id=$query_id;
$this->record = mysql_fetch_row($this->query_id);
return $this->record;
}
function fetch_object($query_id=-1) {
if ($query_id!=-1) $this->query_id=$query_id;
$this->record = mysql_fetch_object($this->query_id);
return $this->record;
}
function free_result($query_id=-1) {
if ($query_id!=-1) $this->query_id=$query_id;
return @mysql_free_result($this->query_id);
}
function query_first($query_string) {
$this->query($query_string);
$returnarray=$this->fetch_array($this->query_id);
$this->free_result($this->$query_id);
return $returnarray;
}
function num_rows($query_id=-1) {
if ($query_id!=-1) $this->query_id=$query_id;
return mysql_num_rows($this->query_id);
}
function num_fields($query_id=-1) {
if ($query_id!=-1) $this->query_id=$query_id;
return mysql_num_fields($this->query_id);
}
function field_name($query_id=-1,$num) {
if ($query_id!=-1) $this->query_id=$query_id;
return mysql_field_name($this->query_id,$num);
}
function insert_id() {
return mysql_insert_id($this->link_id);
}
function print_error($errormsg) {
$this->errdesc=mysql_error();
$this->errno=mysql_errno();
$errormsg="Database error in $this->appname: $errormsg\n<br>";
$errormsg.="mysql error: $this->errdesc\n<br>";
$errormsg.="mysql error number: $this->errno\n<br>";
$errormsg.="Date: ".date("d.m.Y @ H:i")."\n<br>";
$errormsg.="Script: ".getenv("REQUEST_URI")."\n<br>";
$errormsg.="Referer: ".getenv("HTTP_REFERER")."\n<br><br>";
if($this->show_error) $errormsg = "$errormsg";
else $errormsg = "\n $errormsg \n";
die("</table>Database Error!\n".$errormsg);
}
}
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
// DB INIT
//////////////////////////////////////////////////////////////////////////////////////
$db = new db($mysqlhost,$mysqluser,$mysqlpass,$mysqldb);
//////////////////////////////////////////////////////////////////////////////////////
// STDIN
//////////////////////////////////////////////////////////////////////////////////////
if ($fp=fopen("php://stdin","r")) {
while($stop!=1){
$line = fgets($fp,512);
$teile = explode("=", $line);
$stdin[$teile[0]]=$teile[1];
// Entfernen von Leerzeilen und Zeilenumbrüchen
$stdin[$teile[0]] = preg_replace("/\r|\n/s", "", $stdin[$teile[0]]);
if($line=="\n"){$stop=1;}
}
fclose($fp);
}
//////////////////////////////////////////////////////////////////////////////////////
// LOG
//$zeit=time();
//$db->query("INSERT INTO pps_log (zeit, recipient, sender, client_address) VALUES ('$zeit', '$stdin[recipient]', '$stdin[sender]', '$stdin[client_address]')");
// Mailadressen zerlegen
$sender_expl=explode('@',$stdin[sender]);
$sender_domain=$sender_expl[1];
$recipient_expl=explode('@',$stdin[recipient]);
////////////////////////////////////////////////////////////////////////////////
/// WHITELIST
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// BLACKLIST
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// POSTGREYLISTENING
////////////////////////////////////////////////////////////////////////////////
// Überprüfen ob Domain oder User überhaupt mthpostgrey verwendet ?
$grey_req1=$db->query("SELECT * FROM grey_mail WHERE name='$stdin[recipient]'");
$grey_fet=$db->fetch_array($grey_req1);
$grey_sec=$grey_fet[delay];
$user_on=$db->num_rows($grey_req1);
if($user_on==0){
$action="DUNNO";
$stdout = fopen('php://stdout', 'w');
fwrite($stdout,"action=$action\n\n");
fclose($stdout);
exit;
} else {
$grey_test1_q=$db->query("SELECT * FROM grey_active WHERE sender='$stdin[sender]' AND recipient='$stdin[recipient]' AND client_address='$stdin[client_address]'");
$grey_test1_r=$db->num_rows($grey_test1_q);
if($grey_test1_r==0){
$action="defer_if_permit 1 MySQL Multi Policy Server is active. Refer to http://www.thoma.cc/ - Greylisted for: ".$wartezeit1." Seconds.";
$stdout = fopen('php://stdout', 'w');
fwrite($stdout,"action=$action\n\n");
fclose($stdout);
$a_time=time();
$db->query("INSERT INTO grey_active (sender, recipient, client_address,timestamp) VALUES ('$stdin[sender]','$stdin[recipient]','$stdin[clie$
exit;
} else {
$grey_test2_q=$db->query("SELECT * FROM grey_active WHERE sender='$stdin[sender]' AND recipient='$stdin[recipient]' AND client_address='$stdin[client_address]'");
$grey_test3_r=$db->fetch_array($db->query("SELECT * FROM grey_mail WHERE name='$stdin[recipient]'"));
$delay_time=$grey_test3_r[delay];
//$valid_time=$grey_test3_r[valid];
$grey_test2_r=$db->fetch_array($grey_test2_q);
$first_time=$grey_test2_r[timestamp];
$b_time=time();
//$time_valid_max=$b_time+$valid_time;
$time_delay=$b_time+$delay_time;
// Überprüfen ob Delay Time schon vorbei ist
if($delay_time<(time()-$first_time)){
$action="DUNNO";
$action2="PREPEND X-MTHPPS: Greylistening Filter active.";
$stdout = fopen('php://stdout', 'w');
fwrite($stdout,"action=$action2\n\n");
fwrite($stdout,"action=$action\n\n");
fclose($stdout);
} else {
$wartezeit1=$delay_time-(time()-$first_time);
$action="defer_if_permit 2 MySQL Multi Policy Server is active. Refer to http://www.thoma.cc/ - Greylisted for: ".$wartezeit1." Seconds.";
$stdout = fopen('php://stdout', 'w');
fwrite($stdout,"action=$action\n\n");
fclose($stdout);
exit;
}
}
}
////////////////////////////////////////////////////////////////////////////////
/// AUTORESPONDER
////////////////////////////////////////////////////////////////////////////////
$auto_test1_q=$db->query("SELECT * FROM autoresponder_mail where sender='$stdin[recipient]'");
$auto_test1_r=$db->num_rows($auto_test1_q);
if($auto_test1_r!=0){
$auto_test1_r2=$db->fetch_array($auto_test1_q);
$empfaenger = $stdin[sender];
$betreff = $auto_test1_r2[subject];
$text = $auto_test1_r2[message];
mail($empfaenger, $betreff, $text, "From: $auto_test1_r2[sender_name] <$auto_test1_r2[sender]>");
}
//////////////////////////////////////////////////////////////////////////////////////
//$action="DUNNO";
//$stdout = fopen('php://stdout', 'w');
//fwrite($stdout,"action=$action\n\n");
//fclose($stdout);
//////////////////////////////////////////////////////////////////////////////////////
?>
Anpassungen main.cf
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_recipient, reject_unauth_destination, reject_unauth_pipelining, reject_invalid_hostname, check_policy_service inet:127.0.0.1:9990
Anpassungen master.cf
127.0.0.1:9990 inet n n n – 0 spawn user=phppostgrey argv=/opt/dev_postgrey/bin/php -f /postgrey/postgrey_v4.php