view doc/ucis.ano/mailgateway/dnmail.php @ 1155:0b86930fbcff draft

Merge branch 'master' of git://git.sfor.ano/resdb
author SeekingFor <SeekingFor@sfor.something>
date Fri, 20 Dec 2013 20:26:22 +0000
parents e8e0adb25a6d
children
line wrap: on
line source

#!/usr/bin/php
<?php
$client = $_SERVER['REMOTE_HOST'];
stream_set_timeout(STDIN, 10000);
stream_set_timeout(STDOUT, 10000);
println('220 Mailgate.VANet.org ready');

expect(STDIN, 'HELO ');
println('250 Hello');

expectMAILFROM:
$line = expect(STDIN, 'MAIL FROM:');
if ($line === FALSE) return;
else if ($line === TRUE) goto expectMAILFROM;
else if (preg_match('/<([a-zA-Z0-9.-_]+)@([a-zA-Z0-9-.-]+)>/', $line, $frommatches) != 1) {
	println('501 Syntax error');
	goto expectMAILFROM;
}
print("250 Sender accepted\r\n");

expectRCPTTO:
$line = expect(STDIN, 'RCPT TO:');
if ($line === FALSE) return;
else if ($line === TRUE) goto expectMAILFROM;
else if (preg_match('/<([a-zA-Z0-9.-_]+)@([a-zA-Z0-9-.-]+)>/', $line, $tomatches) != 1) {
	println('501 Syntax error');
	goto expectRCPTTO;
}
if (substr($tomatches[2], -19) == '.mailgate.vanet.org') {
	$tomatches[2] = substr($tomatches[2], 0, -19);
}
if (substr($tomatches[2], -4) != '.ano' && substr($client, 0, 2) != '1.') {
	println('550 Relay access denied');
	goto expectRCPTTO;
}

$rcptto = $tomatches[1].'@'.$tomatches[2];
if (substr($tomatches[2], -4) != '.ano') {
	$mailfrom = $frommatches[1].'@'.$frommatches[2].'.mailgate.vanet.org';
} else {
	$mailfrom = $frommatches[1].'@'.$frommatches[2];
}

if (getmxrr($tomatches[2], $mxes)) {
	$mx = $mxes[0];
} else {
	$mx = $tomatches[2];
}

$server = @fsockopen($mx, 25, $dummy, $dummy, 5000);
if ($server === FALSE) {
	println('450 Could not connect to destination server: '.$tomatches[2]);
	goto expectRCPTTO;
}
stream_set_timeout($server, 10000);

if (expectremote($server, '220') === FALSE) {
	fclose($server);
	goto expectRCPTTO;
}

println($server, 'HELO mailgate.vanet.org');
if (expectremote($server, '250') === FALSE) {
	fclose($server);
	goto expectRCPTTO;
}

println($server, 'MAIL FROM:<'.$mailfrom.'>');
if (expectremote($server, '250') === FALSE) {
	fclose($server);
	goto expectRCPTTO;
}

println($server, 'RCPT TO:<'.$rcptto.'>');
if (expectremote($server, '250') === FALSE) {
	fclose($server);
	goto expectRCPTTO;
}

print('250 Reciplient accepted: '.$rcptto);

$write = NULL;
$except = NULL;
while (TRUE) {
	$read = array(STDIN, $server);
	stream_select($read, $write, $except, NULL);
	if (in_array(STDIN, $read)) {
		$line = fread(STDIN, 1024);
		if ($line === NULL || !strlen($line)) break;
		fwrite($server, $line);
	}
	if (in_array($server, $read)) {
		$line = fread($server, 1024);
		if ($line === NULL || !strlen($line)) break;
		fwrite(STDOUT, $line);
	}
}
fclose($server);

function println($stream, $str = NULL) {
	if ($str === NULL) { $str = $stream; $stream = STDOUT; }
	fwrite($stream, $str."\r\n");
}
function expect($stream, $expect) {
	while (TRUE) {
		if (feof($stream)) return FALSE;
		$line = @stream_get_line($stream, 1024, "\r\n");
		if ($line === FALSE) return FALSE;
		if (substr($line, 0, strlen($expect)) == $expect) return $line;
		switch (substr($line, 0, 4)) {
			case 'HELO': case 'DATA': case 'MAIL': case 'RCPT':
				println('503 Bad sequence of commands');
				return TRUE;
		}
		println('500 Command not recognized');
	}
}
function expectremote($stream, $expect) {
	while (TRUE) {
		if (feof($stream)) {
			println('450 End of file from remote host');
			return FALSE;
		}
		$line = @stream_get_line($stream, 1024, "\r\n");
		if ($line === FALSE) {
			println('450 Error while reading from remote host');
			return FALSE;
		}
		if (substr($line, 0, 3) != $expect) {
			println('450'.$line[3].'Remote error: '.$line);
			if ($line[3] != '-') return FALSE;
		} else {
			if ($line[3] != '-') return $line;
		}
	}
}