[MASOCH-L] Blacklists manuais - MTA

Leandro Carlos Rodrigues leandro at allchemistry.com.br
Tue Jul 28 11:09:13 -03 2015


Em 28/07/2015 09:23, Davi Peres escreveu:
> o meu fica dando timeout
>
> Jul 28 09:22:45 defumado postfix/smtpd[25454]: warning: problem talking to
> server private/policy2: Connection timed out

Achei a causa do problema. O Perl não faz flush automático do STDOUT. 
Descobri isso agora.

Teria que dar um comando de "autoflush" para que o final da saída 
(quebra dupla de linha) chegue ao Postfix e este encerre a sessão com o 
programa.

Segue anexo novo script com esta correção.

>
> Em 28 de julho de 2015 07:05, Leandro Carlos Rodrigues <
> leandro at allchemistry.com.br> escreveu:
>
>> Em 27/07/2015 21:15, casfre at gmail.com escreveu:
>>
>>> Agora a  questão é a seguinte: quando o script termina o processamento,
>>>>>>> ele deve mandar a mesma lista, adicionando os novos atributos ou
>>>>> alterando
>>>>>>> os valores para STDOUT e o Postfix pegar? É isso mesmo?
>>>>>>>
>>>>>
>>>>> Achei aqui como passar de volta a resposta para o Postfix:
>>>>>
>>>>>     http://www.postfix.org/access.5.html
>>>>>
>>>>> Com isso o problema foi resolvido. Valeu pelas informações!
>>> Que bom que funcionou. Já achou a informação que precisava, mas me lembro
>>> de ter visto no código em Perl vários "return" com ações que o Postfix
>>> acataria (se bem entendi).:-)
>>>
>> É tipo isso mesmo Cássio. Só que invés de return, teria que jogar isso no
>> STDOUT. Olha em anexo o script que eu escrevi e funcionou perfeitamente
>> para meus colegas.
>>
>> Porém um destes colegas está tendo problemas para passar o helo_name, que
>> sempre vem vazio. Achei estranho pois eu não me lembro de ter recebido
>> mensagens de e-mail sem HELO. Eu estou vendo junto com ele o que pode ser
>> isso. Eu tenho uma teoria que a regra na qual ele faz a consulta através
>> deste script vem antes do HELO do SMTP dele. Posso estar falando uma baita
>> besteira, porque não conheço o Postfix, então se tiver uma teoria melhor do
>> porque isso acontece me avisa ai beleza?
>>
>>
>>> Obrigado.
>>>
>>> Cássio.
>>>
>>
>> __
>> masoch-l list
>> https://eng.registro.br/mailman/listinfo/masoch-l
>>
>>
> __
> masoch-l list
> https://eng.registro.br/mailman/listinfo/masoch-l

-------------- next part --------------
#!/usr/bin/perl -w
#
# Este é um script que processa o SPFBL dentro do Postfix.
#
# Atenção! Para utilizar este serviço, solicite a liberação das consultas 
# no servidor 54.94.137.168 através do endereço leandro at allchemistry.com.br 
# ou altere o IP 54.94.137.168 deste script para seu servidor SPFBL próprio.
#
# Se a mensagem não estiver listada, o cabeçalho Received-SPFBL
# será adicionado com o resultado do SPFBL.
#
# Para implementar este script no Postfix, 
# adicione as seguintes linhas no arquivo master.cf:
#
#    policy-spfbl  unix  -       n       n       -       -       spawn
#        user=nobody argv=/usr/bin/spfblquery.pl
#

use IO::Socket::INET;

# Captura os atributos do Postfix passados pelo STDIN.
my %attributes;
foreach $line ( <STDIN> ) {
    chomp( $line );
    my ($key, $value) = split(/=/, $line, 2);
    $attributes{$key} = $value;
}

# Associa os parâmetros SPFBL através dos atributos do Postfix.
my $client_address = $attributes{"client_address"};
my $sender = $attributes{"sender"};
my $helo_name = $attributes{"helo_name"};

# auto-flush on socket
$| = 1;

# Create a connecting socket.
my $socket = new IO::Socket::INET (
    PeerHost => '54.94.137.168',
    PeerPort => '9877',
    Proto => 'tcp',
    Timeout => 16
);
die "Can't connect to SPFBL server!\n" unless $socket;

# Data to send to a server.
my $query = "$client_address $sender $helo_name\n";
my $size = $socket->send($query);

# Notify server that request has been sent.
shutdown($socket, 1);
 
# Receive a response of up to 4096 characters from server.
my $result = "";
$socket->recv($result, 4096);
$socket->close();
$result =~ s/\s+$//;

#
# Unbuffer standard output.
#
STDOUT->autoflush(1);

# Saída de acordo com documentação do Postfix.
if ($result =~ /^LISTED/) {
    STDOUT->print("action=REJECT [RBL] You are blocked in this server for seven days.\n\n");
} elsif ($result =~ /^ERROR: HOST NOT FOUND/) {
    STDOUT->print("action=DEFER [SPF] A transient error occurred when checking SPF record from $sender, preventing a result from being reached. Try again later.\n\n");
} elsif ($result =~ /^ERROR: QUERY/) {
    STDOUT->print("action=DEFER [SPF] A transient error occurred when checking SPF record from $sender, preventing a result from being reached. Try again later.\n\n");
} elsif ($result =~ /^ERROR: /) {
    STDOUT->print("action=REJECT [SPF] One or more SPF records from $sender could not be interpreted. Please see http://www.openspf.org/SPF_Record_Syntax for details.\n\n");
} elsif ($result =~ /^NONE /) {
    STDOUT->print("action=PREPEND Received-SPFBL: $result\n\n");
} elsif ($result =~ /^PASS /) {
    STDOUT->print("action=PREPEND Received-SPFBL: $result\n\n");
} elsif ($result =~ /^FAIL/) {
    STDOUT->print("action=REJECT [SPF] $sender is not allowed to send mail from $client_address. Please see http://www.openspf.org/why.html?sender=$sender&ip=$client_address for details.\n\n");
} elsif ($result =~ /^SOFTFAIL /) {
    STDOUT->print("action=PREPEND Received-SPFBL: $result\n\n");
} elsif ($result =~ /^NEUTRAL /) {
    STDOUT->print("action=PREPEND Received-SPFBL: $result\n\n");
} else {
    STDOUT->print("action=DEFER [SPF] A transient error occurred when checking SPF record from $sender, preventing a result from being reached. Try again later.\n\n");
}

exit 0;


More information about the masoch-l mailing list