[exim] Exim+sa-exim на OpenBSD

Захотелось прикрутить spamassassin к exim’y на OpenBSD. Ставил всё из пакетов: всё завелось, работает. НО! Меня смутила проверка на спам: вроде как и проверялся (о чём свидетельствуют записи в maillog), но спам вообще не отсеивало. И тут я начал пристальное изучение логов, конфигов. И понял следующее: exim отдаёт письмо якобы на проверку spamassassin’y, тот что-то делает, возвращает обратно exim’y и всё.

Пристальное изучение заголовков писем привело к тому, что напрочь отсутствуют заголовки проверки на spam, хотя в конфиге exim’a опции headers_add присутствуют (я использую конфиги из сборки vexim), а должны быть такого плана:

X-SA-Exim-Connect-IP: XX.XX.XX.XX
X-SA-Exim-Rcpt-To: postmaster@domain.ua
X-SA-Exim-Mail-From: user@otherdomain.net
X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on mail.domain.ua
X-Spam-Level: 
X-Spam-Status: No, score=-0.1 required=3.0 tests=DKIM_SIGNED,DKIM_VALID,
	DKIM_VALID_AU,FREEMAIL_FROM,SPF_PASS,T_RP_MATCHES_RCVD autolearn=unavailable
	version=3.3.2
Subject: test
X-SA-Exim-Version: 4.2.1 (built Fri Jul 27 13:39:31 EEST 2012)
X-SA-Exim-Scanned: Yes (on mail.domain.ua)

Вот оно! Видимо у меня установился не exim+sa-exim, а просто exim. Покопавшись в репозиториях, понял, придётся собирать вручную, из исходников.

Тестовый стенд: OpenBSD 5.0 i385, exim 4.76, sa-exim-4.2.1

Вот что я делал.

1) Скачиваем исходники sa-exim отсюда и распаковываем. Нас интересует файл sa-exim.h. Добавляем в него такие строки

#define SPAMC_LOCATION "/usr/local/bin/spamc"
#define SPAMASSASSIN_CONF "/etc/exim/sa-exim.conf"

Первая указывает путь к spamc (бинарник spamassassin’a), вторая — где будет лежать конфиг самого sa-exim’a после установки.

2) Заходим в порт exim’a и извлекаем его:

#cd /usr/ports/mail/exim && env FLAVOR="mysql" make extract

Далее нужно заменить файл local_scan.c из exim’a на файлик sa-exim.c из sa-exim’a и скопировать заголовочный sa-exim.h (в папке /usr/ports/pobj находятся все исходники портов, которые вы устанавливали):

#cp /home/backup/sa-exim-4.2.1/sa-exim.c /usr/ports/pobj/exim-4.76-mysql/exim-4.76/src/local_scan.c
#cp /home/backup/sa-exim-4.2.1/sa-exim.h /usr/ports/pobj/exim-4.76-mysql/exim-4.76/src/

3) Ну и самое последнее: необходимо немного пропатчить файл readconf.c из исходников exim’a, иначе при сборке будет ругаться так:

readconf.o(.text+0x5f16): In function `readconf_print':
: undefined reference to `local_scan_options_count'
readconf.o(.text+0x5f20): In function `readconf_print':
: undefined reference to `local_scan_options'

В самый вверх (можно сразу после строки #define CSTATE_STACK_SIZE 10) этого файла добавляем такое

static int my_integer_option = 42;
static uschar *my_string_option = "default string";
optionlist local_scan_options[] = {
{ "my_integer", opt_int, &my_integer_option },
{ "my_string", opt_stringptr, &my_string_option }
};
int local_scan_options_count = sizeof(local_scan_options)/sizeof(optionlist);

О том, что это за кусок кода, можно прочесть здесь

4) Теперь собираем наш порт:

#cd /usr/ports/mail/exim && env FLAVOR="mysql" make

После этого просто подменим (перед эти предварительно сделаем бэкап) только что собранный бинариник exim’a (он будет лежать в /usr/ports/pobj/exim-4.76-mysql/exim-4.76/build-OpenBSD-i386):

#/etc/rc.d/exim stop && mv /usr/local/bin/exim /usr/local/bin/exim-backup && cp /usr/ports/pobj/exim-4.76-mysql/exim-4.76/build-OpenBSD-i386/exim /usr/local/bin && /etc/rc.d/exim start

5) После этого всё работает как надо.
Кстати, всё это в автоматическом режиме делает FreeBSD при установке exim’a с поддержкой spamassassin’a

Очень важно, что бы версии Exim’a совпадали, иначе могут быть проблемы.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *