changeset 67:e8e0adb25a6d draft

Added mail gateway script
author ivo <ivo@UFO-Net.nl>
date Wed, 23 Jun 2010 18:41:39 +0200
parents 70a0167e1b20
children 4ace60b88ec0
files doc/ucis.ano/mailgateway/dnmail.php
diffstat 1 files changed, 136 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/ucis.ano/mailgateway/dnmail.php	Wed Jun 23 18:41:39 2010 +0200
@@ -0,0 +1,136 @@
+#!/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;
+		}
+	}
+}