PDA

Показать полную графическую версию : spamassassin - пустые письма


zelo
13-02-2009, 09:24
Здравствуйте!
После внедрения фильтра 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
Подозреваю что проблема в скрипте, поделитесь пожалуйста любой мыслью, очень нада.....

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

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

zelo
18-02-2009, 11:08
Да, я пробовал это, но при такой связке:

#!/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
ну тогда я бы делал через mailscanner, то есть схема получилась бы такая - postfix отдает на mailscanner, он пропускает через clamd и SA, и возвращает postfix'у. howto на данную тему можно на google найти.

zelo
19-02-2009, 10:28
Нашёл причину резки писем!
Письма резались если поле получателей содержит больше одного адресата.

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

"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
Решено!
Изменил скрипт до такого вида:

#!/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




© OSzone.net 2001-2012