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:
Alles was ich im syslog finde ist folgendes:
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
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:
Hier einmal der wesentliche Teil des Scripts:127.0.0.1:10028 inet n n n - - spawn user=nobody argv=/usr/local/etc/srs_forward.pl 127.0.0.1 10027
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: