Perl: Postfix-SMTP-Proxy Problem

BoMbY

Registered User
Hallo,

ich habe gestern versucht einen simplen "Postfix Advanced After-Queue Content Filter" in Perl zu implementieren, aber irgendwie scheint das ab der zweiten Zeile vom Input zu hängen.

Im Prinzip ist das ein Inetd-Script welches sich zum nächsten SMTP-Server in der Reihe verbindet und nur die Anfragen vom STDIN weiterleitet, und die Antworten am STDOUT zurück gibt.

In der Postfix "master.cf" sieht das dann so aus:

127.0.0.1:10028 inet n n n - - spawn user=nobody argv=/usr/local/etc/srs_forward.pl 127.0.0.1 10027
Hier einmal der wesentliche Teil des Scripts:

PHP:
#!/usr/bin/perl

use strict;
use warnings;

use Sys::Syslog;
use IO::Socket::INET; 

#my $mail_content;

eval {
    openlog('srs_forward.pl', 'cons,pid', 'user');
	
# open socket
	syslog('mail|info', "Start");
	
    select STDOUT; $|++;
	
	my $sock = IO::Socket::INET->new(  PeerAddr => $ARGV[0],
									   PeerPort => $ARGV[1], 
								       Type => SOCK_STREAM
								       Proto => 'tcp' 
								) || die "Cannot connect to '$ARGV[0]:$ARGV[1]': $!";
	
# Forward SMTP greating
	my $result = <$sock>;
		
	$result =~ s/\r?\n$//;
		
	syslog('mail|info', "Return: $result");
	
	print STDOUT "$result\r\n";
		
# Handle SMTP chat	
	while ( defined( my $line = <STDIN> ) )  {
	
		$line =~ s/\r?\n$//;

# do something with the line data		
		syslog('mail|info', "Line: $line");

		print $sock "$line\r\n" || die "Send error to tcp socket: $!";
	
		$result = <$sock>;
		
		$result =~ s/\r?\n$//;
	
# do something with the result
		syslog('mail|info', "Return: $result");

		print STDOUT "$result\r\n";
		
		last if ( $line =~ m/^QUIT$/ );
	}

	# close socket
	$sock->close() || die "Cannot close socket: $!";
	
	syslog('mail|info', "Stop");
};

if ($@) {
	my $error = $@;
	
	syslog('mail|err', "$error");
	print STDOUT "550 $error\r\n";
};

exit 0;

Alles was ich im syslog finde ist folgendes:

Apr 17 21:01:45 lvps83-169-XX-XX srs_forward.pl[7426]: Return: 220 my.server.net ESMTP Postfix (Ubuntu)
Apr 17 21:01:45 lvps83-169-XX-XX srs_forward.pl[7426]: Line: EHLO my.server.net
Apr 17 21:01:45 lvps83-169-XX-XX srs_forward.pl[7426]: Return: 250-my.server.net

Danach ist hängen im Schacht, bzw. im <STDIN>. Hat jemand vielleicht eine Idee was ich noch versuchen könnte?

Ergänzung: Wenn ich das Script von der Konsole aus aufrufe und manuell mit Daten befülle funktioniert es soweit scheinbar problemlos.

Dank und Gruß,
BoMbY
 
Last edited by a moderator:
Bin selbst drauf gekommen: Nachdem der Client ein "EHLO" geschickt hat, antwortet der Server mit mehreren 250er Zeilen, aber mein Script hat nur eine berücksichtigt. Und ich hab beim Telnet-Test natürlich immer ein "HELO" benutzt. Jetzt muss ich nur noch ein paar tausend andere Fehler beheben ...
 
Back
Top