Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программное обеспечение Linux и FreeBSD (http://forum.oszone.net/forumdisplay.php?f=11)
-   -   spamassassin - пустые письма (http://forum.oszone.net/showthread.php?t=131843)

zelo 13-02-2009 09:24 1037106

spamassassin - пустые письма
 
Здравствуйте!
После внедрения фильтра spamassassin на smtp сервере postfix, появилась особенность - стали приходить пустые письма. Вот пример:

Код:

Return-Path: <favoritesa387@visitlanka.com>
Received: from Win-Relay ([10.0.0.3])
        by mserv.mydomain.local
        for admin@mydomain.ru;
        Fri, 13 Feb 2009 02:54:28 +0300
Received: from relay.mydomain.ru ([10.0.0.21])
 by Win-Relay (NAVIEG 2.1 bld 63) with SMTP id M2009021302555904113
 for <admin@mydomain.ru>; Fri, 13 Feb 2009 02:55:59 +0300
Received: from spamfilter (localhost [127.0.0.1])
        by localhost (Postfix) with ESMTP id 0491B4B815
        for <admin@mydomain.ru>; Fri, 13 Feb 2009 02:54:28 +0300 (MSK)
Message-Id: <20090212235428.0491B4B815@relay.mydomain.ru>
Date: Fri, 13 Feb 2009 02:54:28 +0300 (MSK)
From: favoritesa387@visitlanka.com

Как видите письмо состоит лишь из поля отправителя.

Подозреваю что вной всему послужил скрипт обеспечивающий связку postfix + spamassassin, ниже описание связки:
Код:


# cat /usr/local/etc/postfix/master.cf
...

smtp      inet  n      -      n      -      -      smtpd  -o      content_filter=spamfilter

...

localhost:10027 inet    n      -      n      -      33      smtpd
    -o content_filter=
    -o local_recipient_maps=
    -o relay_recipient_maps=
    -o smtpd_helo_restrictions=
    -o smtpd_client_restrictions=
    -o smtpd_sender_restrictions=
    -o mynetworks=127.0.0.0/8
    -o smtpd_recipient_restrictions=permit_mynetworks,reject
    -o myhostname=localhost

spamfilter      unix    -      n      n      -      33      pipe    flags=R        user=spamd      argv=/usr/local/bin/spamcс localhost:10027" "spamfilter" "${sender}" "${recipient}" "/usr/local/bin/spamc"

А это скрипт связки, который принимает письмо от postfix через pipe и возвращает их ему же по протоколу SMTP на порт 10027.
Код:


# cat /usr/local/bin/spamcc

#!/usr/bin/perl -w
use strict;
use Net::SMTP;
my $host = &sall_ch(shift(@ARGV), '"');
my $ehlo = &sall_ch(shift(@ARGV), '"');

my $mail_from  = &sall_ch(shift(@ARGV), '"');
my $rcpt_to    = &sall_ch(shift(@ARGV), '"');
my $spamc      = &sall_ch(shift(@ARGV), '"');

if (!defined($host)||!defined($ehlo)||!defined($mail_from)||!defined($rcpt_to)) {
  die("use $0 <host> <ehlo> <mail_from> <rcpt_to> [cmd]\n");
}

if (defined($spamc)) {
    open(CF, "$spamc |") or undef($spamc);
}

my $smtp = Net::SMTP->new($host);
$smtp->hello($ehlo);
$smtp->mail($mail_from);
$smtp->to($rcpt_to);

$smtp->data();
if (defined($spamc)) {
    while(<CF>) {
        next if (/^delivered\-to\:/i);
        $smtp->datasend($_);
    }
}
else {
    while(<>) {
        next if (/^delivered\-to\:/i);
        $smtp->datasend($_);
    }
}
$smtp->dataend();
close(CF) if defined($spamc);

$smtp->quit;
exit 0;

############################################################
sub sall_ch($$) {
    my($string, $chars) = (shift(), shift());
    return(undef) unless defined($string);
    $string =~ s/^[\Q$chars\E]+//;
    $string =~ s/[\Q$chars\E]+$//;
    return($string);
}

Подозреваю что проблема в скрипте, поделитесь пожалуйста любой мыслью, очень нада.....

zelo 17-02-2009 15:31 1041298

Подозреваю что проблема в скрипте, поделитесь пожалуйста любой мыслью, очень нада.....

czecz 17-02-2009 17:18 1041413

а зачем такие сложности, вот же простой howto как связать postfix и SA (spamassassin) : http://www.xnote.com/howto/postfix-spamassassin.html

без всяких усложнений типа localhost:10027

zelo 18-02-2009 11:08 1042050

Да, я пробовал это, но при такой связке:
Код:

#!/bin/bash
/usr/local/bin/spamc | /usr/sbin/sendmail -i "$@"
exit $?

...sendmail пересылает письмо снова на постфикс и оно циклится, плюс ко всему, в постфиксе настроены пранспорты, которых sendmail не знает, в частности одним из них является локальный сервис антивируса ClamSMTPd, который принимает почту на 127.0.0.1:10025. Может этого можно избежать? Не знаю как....

czecz 18-02-2009 14:21 1042237

ну тогда я бы делал через mailscanner, то есть схема получилась бы такая - postfix отдает на mailscanner, он пропускает через clamd и SA, и возвращает postfix'у. howto на данную тему можно на google найти.

zelo 19-02-2009 10:28 1042979

Нашёл причину резки писем!
Письма резались если поле получателей содержит больше одного адресата.

Обычно, если получатель один, то скрипт вызывался вот с такими параметрами:
Код:

"localhost:10027" "spamfilter" "outbox@hotbox.com" "inbox@domain.ru" "/usr/local/bin/spamc"
А если получателей два и более, то с такими:
Код:

"localhost:10027" "spamfilter" "outbox@domain.ru" "inbox1@domain.ru" "inbox2@domain.ru" "/usr/local/bin/spamc"
В этом случае параметр "inbox2@domain.ru" замещал параметр "/usr/local/bin/spamc" и происходило то о чём я говорил в самом начале...

Друзья! Помогите доработать скрипт!

zelo 19-02-2009 17:36 1043331

Решено!
Изменил скрипт до такого вида:
Код:

#!/usr/bin/perl -w
use strict;
use Net::SMTP;
my $host = &sall_ch(shift(@ARGV), '"');
my $ehlo = &sall_ch(shift(@ARGV), '"');

my $spamc      = &sall_ch(shift(@ARGV), '"');
my $mail_from  = &sall_ch(shift(@ARGV), '"');
my $rcpt_to    = &sall_ch(shift(@ARGV), '"');
my $rcpt_to01    = &sall_ch(shift(@ARGV), '"');
my $rcpt_to02    = &sall_ch(shift(@ARGV), '"');
my $rcpt_to03    = &sall_ch(shift(@ARGV), '"');
my $rcpt_to04    = &sall_ch(shift(@ARGV), '"');
my $rcpt_to05    = &sall_ch(shift(@ARGV), '"');
my $rcpt_to06    = &sall_ch(shift(@ARGV), '"');
my $rcpt_to07    = &sall_ch(shift(@ARGV), '"');
my $rcpt_to08    = &sall_ch(shift(@ARGV), '"');
my $rcpt_to09    = &sall_ch(shift(@ARGV), '"');
my $rcpt_to10    = &sall_ch(shift(@ARGV), '"');
my $rcpt_to11    = &sall_ch(shift(@ARGV), '"');
my $rcpt_to12    = &sall_ch(shift(@ARGV), '"');
my $rcpt_to13    = &sall_ch(shift(@ARGV), '"');
my $rcpt_to14    = &sall_ch(shift(@ARGV), '"');
my $rcpt_to15    = &sall_ch(shift(@ARGV), '"');
my $rcpt_to16    = &sall_ch(shift(@ARGV), '"');
my $rcpt_to17    = &sall_ch(shift(@ARGV), '"');
my $rcpt_to18    = &sall_ch(shift(@ARGV), '"');
my $rcpt_to19    = &sall_ch(shift(@ARGV), '"');
my $rcpt_to00    = &sall_ch(shift(@ARGV), '"');

#if (!defined($host)||!defined($ehlo)||!defined($mail_from)||!defined($rcpt_to)) {
#  die("use $0 <host> <ehlo> <mail_from> <rcpt_to> [cmd]\n");
#}

if (defined($spamc)) {
    open(CF, "$spamc |") or undef($spamc);
}

my $smtp = Net::SMTP->new($host);
$smtp->hello($ehlo);
$smtp->mail($mail_from);
$smtp->to($rcpt_to);
$smtp->to($rcpt_to01);
$smtp->to($rcpt_to02);
$smtp->to($rcpt_to03);
$smtp->to($rcpt_to04);
$smtp->to($rcpt_to05);
$smtp->to($rcpt_to06);
$smtp->to($rcpt_to07);
$smtp->to($rcpt_to08);
$smtp->to($rcpt_to09);
$smtp->to($rcpt_to10);
$smtp->to($rcpt_to11);
$smtp->to($rcpt_to12);
$smtp->to($rcpt_to13);
$smtp->to($rcpt_to14);
$smtp->to($rcpt_to15);
$smtp->to($rcpt_to16);
$smtp->to($rcpt_to17);
$smtp->to($rcpt_to18);
$smtp->to($rcpt_to19);
$smtp->to($rcpt_to00);

$smtp->data();
if (defined($spamc)) {
    while(<CF>) {
        next if (/^delivered\-to\:/i);
        $smtp->datasend($_);
    }
}
else {
    while(<>) {
        next if (/^delivered\-to\:/i);
        $smtp->datasend($_);
    }
}
$smtp->dataend();

close(CF) if defined($spamc);

$smtp->quit;

exit 0;

############################################################
sub sall_ch($$) {
    my($string, $chars) = (shift(), shift());
    return(undef) unless defined($string);
    $string =~ s/^[\Q$chars\E]+//;
    $string =~ s/[\Q$chars\E]+$//;
    return($string);
}

....смешное конечно решение, но пойдёт :-D


Время: 17:38.

Время: 17:38.
© OSzone.net 2001-