[Qmail-it] This user has no Maildir... o una cosa simile

Tullio Andreatta ML t.andreatta at troppoavanti.it
Mon Aug 7 14:05:22 CEST 2006


> Maria è una dipendente dell'azienda e ha come suo indirizzo
> maria at azienda.it. Questo utente esiste sia nel server principale sia nel
> mio serverino.
> Carlo è un collaboratore esterno dell'azienda ed ha l'indirizzo
> carlo at azienda.it. Questo utente la posta se la scarica dal server
> principale e quindi nel serverino non esiste traccia di lui.
> ... quando Maria invia un messaggio a Carlo ... il serverino risponderà
 > che Carlo non è un utente del dominio @azienda.it e che quindi il 
messaggio
 > non potrà essere recapitato.
> Esiste un modo umano per risolvere la cosa?

Umano? Non credo, penso che si debba andare verso il divino ... :-)

Francamente, l'unico modo che mi viene in mente e' che in qualche modo
il catch-all di azienda.it (~alias/.qmail-default) contenga un
programmino che riaccodi con SMTP l'e-mail verso il server remoto.

Qualcosa tipo questo (da verificare, qui non ho sottomano un interprete
perl per provarlo - l'ho scritto partendo dagli esempi del manuale
perlipc(1) ):

#!/usr/bin/perl
use Socket;
sub die_100(@) { warn join(' ', @_)."\n"; exit(100); }
sub die_111(@) { warn join(' ', @_)."\n"; exit(111); }
$remote  = shift || die_111("Usage: $0 smtp_server_address < msg");
$X_LOOP_PREVENTION = "X-Requeued-To: ".$remote;
$msg = $X_LOOP_PREVENTION;
while (defined($line = <STDIN>)) {
  chomp($line);
  die_100($ENV{'RECIPIENT'}.": loop detected")
   if ($line eq $X_LOOP_PREVENTION);
  $line =~ s/^\./../;
  $msg .= "\r\n".$line;
}
$iaddr = inet_aton($remote) || die_111("bad address: $remote");
$paddr = sockaddr_in(25, $iaddr);
$proto = getprotobyname('tcp');
socket(SOCK, PF_INET, SOCK_STREAM, $proto) || die_111("socket: $!");
connect(SOCK, $paddr) || die_111("$remote: $!");
select SOCK; $| = 1;
for (;;) {
  die_111("$remote: $!") unless (defined($line = <SOCK>));
  last if ($line =~ /^220 /);
  die_111("$remote: $line") if ($line !~ /^220-/);
}
print SOCK "HELO relay.to.$remote\r\n";
for (;;) {
  die_111("$remote: $!") unless (defined($line = <SOCK>));
  last if ($line =~ /^250 /);
  die_111("$remote: HELO: $line") if ($line !~ /^250-/);
}
print SOCK "MAIL FROM:<".$ENV{'SENDER'}.">\r\n";
for (;;) {
  die_111("$remote: $!") unless (defined($line = <SOCK>));
  last if ($line =~ /^250 /);
  die_111("$remote: MAIL: $line") if ($line !~ /^250-/);
}
print SOCK "RCPT TO:<".$ENV{'RECIPIENT'}.">\r\n";
for (;;) {
  die_111("$remote: $!") unless (defined($line = <SOCK>));
  last if ($line =~ /^250 /);
  die_100("$remote: RCPT: $line") if ($line !~ /^250-/);
}
print SOCK "DATA\r\n";
die_111("$remote: $!") unless (defined($line = <SOCK>));
die_111("$remote: RCPT: $line") if ($line !~ /^354 /);
print SOCK $msg;
print SOCK "\r\n.\r\n";
die_111("$remote: $!") unless (defined($line = <SOCK>));
die_111("$remote: DATA: $line") if ($line !~ /^250 /);
print SOCK "QUIT\r\n";
$line = <SOCK>;
exit(0);

-- 
Tullio Andreatta

Disclaimer: "Please treat this email message in a reasonable way, or we
     might get angry" ( http://www.goldmark.org/jeff/stupid-disclaimers )



More information about the Qmail-it mailing list