Полезные скрипты/настройки для exim.

EXIM, sendmail, postfix, Dovecot и прочие. Решение проблем связанных с работой электронной почты

Модератор: xM

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
mediamag
лейтенант
Сообщения: 693
Зарегистрирован: 2008-10-02 20:49:21

Re: Полезные скрипты/настройки для exim.

Непрочитанное сообщение mediamag » 2010-12-01 12:49:54

auto blacklist
Нарисовал автоблеклист на основе того, что писал выше.
дамп таблицы (заливать в базу с экзимом)

Код: Выделить всё

CREATE TABLE `user_blacklist` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `sender_address` varchar(255) CHARACTER SET latin1 NOT NULL DEFAULT '',
  `local_recipient` varchar(255) CHARACTER SET latin1 NOT NULL DEFAULT '',
  `added_date` date DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=24 DEFAULT CHARSET=utf8;
Два кондишена их писать в acl_check_rcpt(на весь домен блокируемого и только на ящик - вдруг вы захотите заблочить spam@ukr.net но не блокировать весь ukr.net)

Код: Выделить всё

warn  set acl_m1             =$local_part@$domain

# deny if in local user`s blacklist (sender_address)

  deny    message       = Mailbox $sender_address of domain $sender_address_domain is in a personal blacklist of $local_part
          senders       = ${lookup mysql{SELECT `sender_address` FROM `user_blacklist` WHERE `sender_address` = ' ${quote_mysql:$sender_address}' AND `local_recipient` = '${quote_mysql:$local_part@$domain}'}}
          log_message   = Mailbox $sender_address of domain $sender_address_domain is in a personal blacklist of $local_part

# deny if in local user`s blacklist (sender_address_domain)

  deny    message       = Mailbox $sender_address of domain $sender_address_domain is in a personal blacklist of $local_part
          senders       = ${lookup mysql{SELECT `sender_address` FROM `user_blacklist` WHERE `sender_address` = ' ${quote_mysql:$sender_address_domain}' AND `local_recipient` = '${quote_mysql:$local_part@$dom
          log_message   = Mailbox $sender_address of domain $sender_address_domain is in a personal blacklist of $local_part
Далее в acl_check_data

Код: Выделить всё

# for blacklist

  accept   condition    = ${if eq{blacklist@blabla.dp.ua}{$acl_m1}{yes}{no}}
           hosts        = +relay_from_hosts
           condition    = ${lookup mysql{INSERT INTO `user_blacklist` (sender_address, local_recipient, added_date) VALUES (TRIM(BOTH '\n' FROM '${quote_mysql:$rheader_Subject:}'), '${quote_mysql:$sender_addr
           log_message  = blacklist updated
Как работает:
Вы отправляете письмо на ящик blacklist@blabla.dp.ua (ящик должен быть создан) И в теме письма указываете или весь домен целиком блокируемого или ящик. В базе появляется запись и в следующий раз письмо для юзера, который отправил запрос на ящик blacklist!!!!! с блокируемого домена (ящика), не придёт. Спасибо mastertronу за его чудные примеры. Далее по его примерам можно автоудалять с ящика ненужные письма, но я пока оставляю их для того что бы контролировать кто слал запросы на ящик и когда, пока не прикручу простенькую табличку на пхп.
Так же на основе всего этого можно нарисовать запрос для удаления записи из базы, если вы вдруг передумали блочить когото

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

brahmann
проходил мимо

Re: Полезные скрипты/настройки для exim.

Непрочитанное сообщение brahmann » 2010-12-12 15:09:51

Задавал довеча в 7мом месяце этого года вопрос про то как при конфиге exim+mysql+postfixadmin+dspam(конфиг свой но нормально работает и если использовать конфиг Лиссяры) прикрутить перенаправления почты на скрипты, при том что постфиксадмин не дает вводить такие вещи как "|/path/to/script.sh" - потому как там проверки и все такое. Тут так и не ответили.

Перенаправление почты на скрипт при использовании Exim+Postfixadmin+Mysql+Dovecot


Вообщем решил эту задачу довольно тривиальным методом. Сначала уткнувшись в добавление таблицы. А потом подумал что проще сделать в отдельном файлике, не трогая сильно основной конфиг, нежели дописывать ПостФиксадмин чтобы он понимал еще одну табличку(я не пхп кодер ниразу). Достаточно добавить соотв роутер в нужном месте и все работает. Этот роутер не мешает алиасам которые добавляются через postfixadmin, список доменов получает уже из базы.
Собственно решение:
в configure перед роутером system_aliases(у меня так) добавляем роутер:

Код: Выделить всё

script_aliases:
  driver = redirect
  allow_defer
  allow_fail
  domains = +local_domains
  data = ${expand:${lookup{$local_part}lsearch*@{/usr/local/etc/exim/scriptaliases/$domain}}}
  retry_use_local_part
  pipe_transport = address_pipe
  file_transport = address_file
  condition = ${if exists{/usr/local/etc/exim/scriptaliases/$domain} {yes} {no} }
Собственно домены берем из mysql, смотрим есть ли на такой домен файлик в соотв пути, если есть, открываем файл домена(если есть) и в нем пытаемся найти соотв алиас(формат старого доброго /etc/aliases)
Примерно так:

Код: Выделить всё

# pwd
/usr/local/etc/exim/scriptaliases
# ls
domain.ua
# cat domain.ua
bla:    |/path/to/script.sh
#
Получаем алиас bla@domain.ua который пайпает письмо на скрипт. При этом не мешаем обычным алиасам. Которые у меня проверяются следом за этим роутером в базе.
Важно: этот роутер имеет приоритет нежели системные алиасы, так что сначала смотрим файлик домена и там алиасы если есть, а если не нашли - уже дальше идем по системным алиасам в базе смотреть(то что добавляете постфиксадмином) - потому важно чтобы не было пересекавшихся алиасов в файликах и в базе.

ЗЫ. вот вспомнил что тут спрашивал совета, и что не ответили. решил наваять - мож кому поможет

Аватара пользователя
sergio
мл. сержант
Сообщения: 79
Зарегистрирован: 2006-12-30 2:47:28
Откуда: Русь Києвська

Re: Полезные скрипты/настройки для exim.

Непрочитанное сообщение sergio » 2011-02-07 15:40:21

BLACKLIST из /var/log/exim/mainlog
При просмотре логов exim возникла идея автоматом создавать блеклист ярых спамеров из лога exim.
Эксим собран с опцией SA-Exim.
В конфиге cat sa-exim.conf установлена опция SAmsgpermrej

Код: Выделить всё

SAmsgpermrej: STOP SPAM!
которая при срабатывании отлупа пишет в лог ексима такое:
cat /var/log/exim/mainlog | grep "STOP SPAM!"
2011-02-07 12:24:57 1PmOH7-000Lof-Dq F=s.o.p0206@infoletter.com.ua H=apollo.ethnohosting.com [213.186.116.219] I=[193.239.255.166]:25 P=esmtp rejected by local_scan(): STOP SPAM!
2011-02-07 13:06:43 1PmOvY-000Mcl-7E F=dimahavchik7@mail.ru H=mbx.dc.utel.ua [213.186.112.2] I=[193.239.255.166]:25 P=smtp rejected by local_scan(): STOP SPAM!
2011-02-07 13:07:18 1PmOw6-000Mdm-6T F=ktukgk@mail.ru H=mailfw.ikea.com.kw [62.150.82.12] I=[193.239.255.166]:25 P=esmtp rejected by local_scan(): STOP SPAM!
2011-02-07 13:07:47 1PmOwZ-000Mde-KK F=ffjlhd@mail.ru H=mail.almimarine.gr [83.235.212.17] I=[193.239.255.166]:25 P=esmtp rejected by local_scan(): STOP SPAM!
Стало быть можна выудить из лога ip-адреса спамеров и заблокировать их на этапе подключения. :roll:

Скрипт, который выбирает из лога ексима адреса хостов по фразе "STOP SPAM!":
cat /usr/script/stopspam

Код: Выделить всё

#!/bin/sh -
# Из лога екзима выбираются ип адреса спамеров по фразе "STOP SPAM!", для которых будет срабатывать отсев
# в правиле eximа
# Чтобы избежать дубликатов в этом списке:
#1. Переносим существующий список в врем.файл
cat /usr/local/etc/exim/stopspamip > /var/tmp/tempdump
#2. очищаем список
echo ""  > /usr/local/etc/exim/stopspamip
#3. добавляем новые хосты к старым
cat /var/log/exim/mainlog | grep "STOP SPAM!" | awk '{print $6}' | tr -d '[(H=)]'  >> /var/tmp/tempdump
#4. отбираем уникальные адреса и получаем список со старыми+новыми адресами
cat /var/tmp/tempdump | sort | uniq >> /usr/local/etc/exim/stopspamip
и в /usr/local/etc/exim/configure (в секции ACL):

Код: Выделить всё

# Блокируем адреса, содержащиеся в файле /usr/local/etc/exim/stopspamip
 deny  hosts = net-lsearch;/usr/local/etc/exim/stopspamip
 message = HOST BLACKLISTED!
+ добавляем в крон запуск раз в сутки

Код: Выделить всё

@daily /usr/script/stopspam
ЗЫ: Используйте на свой страх и риск! Если чё не так - я не виноват.
У меня работает.

ЗЫ2: Впринципе можна вместо файла адреса можна помещать в mysql для удобства, а можна и
засносить в таблицу ну и дальше рубать их файрволом, если надо

Код: Выделить всё

for ip in `cat /usr/local/etc/exim/stopspamip`; do
${FwCMD} table 55 add $ip
done

mediamag
лейтенант
Сообщения: 693
Зарегистрирован: 2008-10-02 20:49:21

Re: Полезные скрипты/настройки для exim.

Непрочитанное сообщение mediamag » 2011-02-07 16:03:25

Есть же fail2ban, который делает тоже самое.

Аватара пользователя
koffu
сержант
Сообщения: 154
Зарегистрирован: 2008-03-23 0:51:18
Откуда: Киев
Контактная информация:

Re: Полезные скрипты/настройки для exim.

Непрочитанное сообщение koffu » 2011-10-07 14:36:23

Laa писал(а):Иногда клиенты не понимают сообщений exim-а о недоствке письма, или боунсы.
Звонят, пытаются разобраться или ругаются.
Чтобы облегчить себе жизнь, можно вложить перевод в эти сообщения.

Описываются эти файлы-темплэйты в основном конфиге так:

Код: Выделить всё

...
warn_message_file               = EXIM_DIR/warn_message_file
bounce_message_file             = EXIM_DIR/bounce_message_file
...
Ну и пример EXIM_DIR/warn_message_file:

Код: Выделить всё

Subject: Warning: message $message_exim_id delayed $warn_message_delay
Content-Type: text/plain; charset=koi8-r
****

Это сообщение было создано автоматически почтовым сервером.
(This message was created automatically by mail delivery software.)

Письмо, ${if eq{$sender_address}{$warn_message_recipients}
{которое вы отправили, }{отправленное

<$sender_address>

}}не было доставлено получателям спустя более чем
$warn_message_delay в почтовой очереди на $primary_hostname.

(A message ${if eq{$sender_address}{$warn_message_recipients}
{that you sent }{sent by

<$sender_address>

}}has not been delivered to all of its recipients after
more than $warn_message_delay on the queue on $primary_hostname.)

Идентификатор письма (The message identifier is):.$message_exim_id
Дата письма (The date of the message is):.........$h_date
Тема письма (The subject is):.....................$h_subject

Письма на следующие адреса не доставлены:
(The following address(es) have not yet been delivered:)
****
С вашей стороны не требуется никаких действий. Попытки доставить
письмо будут продолжаться некоторое время. Подобные предупреждения
возможно еще будут, если письмо не удастся доставить. Письмо
вернется к вам в ящик, если не удастся его доставить за весь период
доставки.

(No action is required on your part. Delivery attempts will
continue for some time, and this warning may be repeated at
intervals if the message remains undelivered. Eventually the
mail delivery software will give up, and when that happens,
the message will be returned to you.)
И пример второго файла EXIM_DIR/bounce_message_file:

Код: Выделить всё

Content-Type: text/plain; charset=koi8-r
Subject: Mail delivery failed ${if eq{$sender_address}{$bounce_recipient} {: returning message to sender}}
****
Это сообщение создано автоматически почтовой системой.
This message was created automatically by mail delivery software.

Сообщение, ${if eq{$sender_address}{$bounce_recipient}
  {которое отправили вы }{отправленное

<$sender_address>

}}не может быть доставлено получателям.
Это постоянная ошибка. Следующие адреса дали сбой:

A message ${if eq{$sender_address}{$bounce_recipient}
  {that you sent }{sent by

<$sender_address>

}}could not be delivered to all of its recipients.
This is a permanent error. The following address(es) failed:
****
Следующий текст был создан во время попыток доставки:
The following text was generated during the delivery attempt(s):
****
------ Вот копия письма со всеми заголовками. ------
------ This is a copy of the message, including all the headers. ------
****
------ The body of the message is $message_size characters long;
  only the first
------ $bounce_return_size_limit or so are included here.
****
Ребята, подскажите, при парсинге warn_message_file, вместо какого параметра подставляется recipient address? В документации ничего об этом нет, не могу нормально заполнить свой шаблон.

Аватара пользователя
gmn
сержант
Сообщения: 239
Зарегистрирован: 2007-02-28 18:01:37
Откуда: UA, Kiev
Контактная информация:

Полезные ACL для фильтрации спама.

Непрочитанное сообщение gmn » 2011-11-28 16:41:03

Письма, которые дошли до data, являюющиеся спамом. Не хочу их допускать до SA.
У всех у них X-Mailer, попадающий под шаблон.

Код: Выделить всё

# Bad X-Mailer (idpkh_47, etc)
deny condition = ${if match{$h_X-Mailer:}{\N(^\w+(_|\.|\s|-){1}[0-9]{2}$)\N}{1}}
     message = Bad X-Mailer $h_X-Mailer.
     log_message = REJECTED: Bad X-Mailer $h_X-Mailer
Блокируем опасные вложения в архивах (идея взята с exim wiki).
Не раз спасало правило от вирусов в архивах.

Код: Выделить всё

deny message = This message contains dangerous file(s) in .${uc:$found_extension}.
     condition = ${if <{$message_size}{600K}{1}{0}}
     demime = zip:rar
     set acl_m9 = ${run{/usr/local/etc/exim/checkarc.sh ${lc:$found_extension} $message_exim_id}}
     condition = ${if eq {$runrc}{1} {1}{0}}
     log_message = dangerous file in .${uc:$found_extension} attachment.
И сам файл checkarc.sh:

Код: Выделить всё

#!/bin/sh
# See http://wiki.exim.org/ExiscanFilenameBlocking

zipinfo=/usr/local/bin/zipinfo
unzip=/usr/local/bin/unzip
rar=/usr/local/bin/rar

# Проверяем наличие приложений
for application in ${zipinfo} ${unzip} ${rar}
do
    if [ ! -s ${application} ]; then
        echo "Приложение \`\`${application}'' не найдено!"
        exit
    fi
done

# Блокируемые файлы в архивах
EXTENS='(\.cmd$|\.com$|\.exe$)'
# Архивы
COMPAC='(zip|rar)'

# переход в рабочую директорию.
if [ ! -z "$2" ]; then
    if [ -d /var/spool/exim/scan/$2 ]; then
        cd /var/spool/exim/scan/$2
    else
        exit 1
    fi
fi


# Проверка архивов.
for i in `ls | egrep -i ".${COMPAC}$"`; do
   EXTFILE="`basename $i | sed -e 's/.*\.//' | tr [A-Z] [a-z]`"
   case "${EXTFILE}" in
     zip)
        CMD_TST="${unzip} -t $i"
        CMD_VRF="${zipinfo} -1 $i"
        ;;
     rar)
        CMD_TST="${rar} t -p- $i"
        CMD_VRF="${rar} vb -p- $i"
        ;;
     *)
        echo -n '* Extension of File <'$i'> is unknown archive compact!\n'
   esac

    ARQS="`${CMD_VRF} 2> /dev/null | gawk '{ print $1 }' | egrep -i "${EXTENS}$"`"
    if [ ! -z "$ARQS" ]; then
        echo -n '* File(s) in <'$i'>: '$ARQS'\n'
        FOUND=1
    fi
done

if [ ! -z "${FOUND}" ]; then
    exit 1
else
    exit 0
fi

ingiboy
проходил мимо
Сообщения: 3
Зарегистрирован: 2012-03-08 20:20:14

Сортировка писем по произвольным imap-папкам без sieve

Непрочитанное сообщение ingiboy » 2012-03-09 20:56:58

Модификация конфига exim из статьи Связка exim и courier-imap.

В конфиге в секции transports запрос

Код: Выделить всё

mysql_delivery:
...
	directory = ${lookup mysql{SELECT CONCAT('/data/mail/${domain}/', `maildir`) \
                            FROM `mailbox` WHERE `username`='${local_part}@${domain}'}}
...
меняем на:

Код: Выделить всё

mysql_delivery:
...
	directory = ${lookup mysql{SELECT CONCAT('/data/mail/${domain}/', `maildir`, \
					(select dir from sorter where ( \
						( \
							(locate(text,'${sender_address}')!=0 and target='sender') \
							or \
							(locate(text,'${sg{${extract{Subject}{${sg{${sg{$message_headers}{ }{_spAce_}}}{:_spAce_}{=}}}}}{_spAce_}{ }}')!=0 and target='subject') \
						) \
						and email='${local_part}@${domain}') or priority=0 order by priority desc limit 1 \
					)) \
					FROM `mailbox` WHERE `username`='${local_part}@${domain}'}}
...
Пишем 7 кил кода на PHP (скачать), чтобы создавать правила сортировки для конкретного пользователя. Неожиданно обнаружилось (а может просто не нашел?), что на этом этапе exim не имеет отдельных переменных под каждый заголовок, поэтому здоровенная борода эксимовых экспансий строк призвана всего лишь выделить заголовок Subject из многострочного поля содержащего сразу все заголовки письма.

Создаем таблицу для хранений правил сортировки с обязательной нулевой записью, которая будет определять размещение письма во "Входящие" если правил не нашлось:

Код: Выделить всё

CREATE TABLE `sorter` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `priority` int(11) NOT NULL DEFAULT '0',
  `target` varchar(255) NOT NULL DEFAULT '',
  `text` varchar(255) NOT NULL DEFAULT '',
  `dir` varchar(255) CHARACTER SET latin1 NOT NULL DEFAULT '',
  `email` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
);

INSERT INTO `sorter` SET `priority`=0;
Скриншот админки
Изображение

Скрипты берут список уже имеющихся папок на сервере.

Система неидеальна, и имеет как минимум три ограничения:
1. работает с русскими кодировками только если кодировка письма совпадает с кодировкой записей в таблице правил;
2. работает только одно правило в порядке очередности (чем выше, тем приоритетнее), так что правила с логикой И сделать не получится, только ИЛИ;
3. количество полей для обработки пока ограничено двумя - тема и отправитель.

В принципе, можно будет потом допилить под использование для выборок и других заголовков, а не только subject, возможно сделаю, если понадобится. Также была мысль написать плагин для RoundCube, но поглядев на то, как они пишутся, было решено забить на это, хоть и с большой жалостью (авось кто-нть, заинтересовавшийся реализацией, сделает это:)). Также хочу отметить, что sql-запрос тестировался на последней версии порта MySQL 5.5 для FreeBSD, так что неизвестно, покатит ли этот запрос для более старых версий.

Аватара пользователя
konstantine
ефрейтор
Сообщения: 55
Зарегистрирован: 2009-03-14 11:51:17

Re: Полезные скрипты/настройки для exim.

Непрочитанное сообщение konstantine » 2012-06-05 4:58:29

Мужики вы BEST of the BEST !
Уже! юзаю много анти спам скрипт настроек Экзима от Лиссяры и спама 70% режиться.....

Ещё раз благодарю за разжёвывания.
@lissyara: Решений "искаропки" под конкретную задачу - катастрофически мало.
Любое боле-мене серьёзное решение - это кручение коробки под себя.

dimidrol80
рядовой
Сообщения: 38
Зарегистрирован: 2008-06-07 17:50:21
Контактная информация:

RoundRobin алгоритм на perl

Непрочитанное сообщение dimidrol80 » 2012-10-15 15:10:15

Данный скрипт реализует алгоритм Round-Robin (Вкратце первое письмо отправляеться первому пользователю второе ->второму т. д) Используеться для разпределения заказов между менеджерами.

Создаем таблицы для записи кому и куда
Первая таблица счетчик сообщений
OrgUnit -должен совпадать с таким же с таблицы round. может быть несколько списков.

Код: Выделить всё

DROP TABLE IF EXISTS `roundmail`;
CREATE TABLE `roundmail` (
  `Id` int(100) NOT NULL AUTO_INCREMENT,
  `SumCount` int(4) DEFAULT NULL,
  `OrgUnit` varchar(25) DEFAULT NULL,
  PRIMARY KEY (`Id`)
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
Вторая таблица описание кому перенаправлять почту
username - почтовый адрес менеджера
orgunit -почтовый адрес списока рассылки (адрес может и не существовать тогда надо править router configurations)
actieve -активный пользователь или нет (если стоит 0 тогда письмо пользователю отправляться не будет)

Код: Выделить всё

DROP TABLE IF EXISTS `round`;
CREATE TABLE `round` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) NOT NULL DEFAULT '',
  `orgunit` varchar(255) NOT NULL DEFAULT '',
  `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `active` tinyint(4) NOT NULL DEFAULT '1',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
В глобальной конфигурации /usr/local/etc/exim/configure

Код: Выделить всё

perl_startup= do '/usr/local/etc/exim/round.pl'

В секции routers

Код: Выделить всё

begin routers
# Здесь проверки на спам и т. д.
RoundRobin_router:
driver = redirect
domains = +local_domains
#debug_print = true
condition = ${if eqi{$local_part@$domain}{${lookup mysql{SELECT `OrgUnit` FROM `round` WHERE `OrgUnit`='$local_part@$domain' LIMIT 0,1}}}{yes}{no}} 
data = ${perl{RoundRobin}{$local_part@$domain}}
unseen
Сам скрипт

Код: Выделить всё

#!/usr/bin/perl -w

use strict;
use vars '$User';
use vars '$SelectUser';
use vars '$ref';

sub RoundRobin {
    if ($_[0]){
    use DBI;
    $User = $_[0];
    #Connect to local Database
# Здесь подставить вашых пользователя и пароль для соеденения с базой данных
    my $dbh = DBI->connect("DBI:mysql:database=exim;host=localhost", "exim", "YourPassword", {'RaiseError' => 1});
#Для дебага можна раскоментировать
#    DBI->trace(2);
#Запрос количества писем
    my $sth = $dbh->prepare("SELECT SumCount from roundmail where OrgUnit=\"$User\";") or die "Не  могу  подготовить : $dbh -> errstr\n" ;
    $sth->execute() or die "Не могу выполнить: $sth -> errstr";
        if(my $ref = $sth->fetchrow_array()){
        my $Count = $ref-1;
#Запрос количества пользователей
        my $sth = $dbh->prepare("SELECT COUNT(*) from round where active = true and OrgUnit=\"$User\" order by id limit 1;") or die "Не  могу  подготовить : $dbh -> errstr\n";
        $sth->execute() or die "Не могу выполнить: $sth -> errstr";
            if(my $MailMax = $sth->fetchrow_array()){
            my $MailCount=$ref+1;
                if ($MailCount > $MailMax){
                $MailCount = 1;
                }
#Обновление количества текущих писем
            my $sth = $dbh->prepare("UPDATE roundmail set SumCount=$MailCount where OrgUnit=\"$User\";") or die "Не  могу  подготовить : $dbh -> errstr\n";
            $sth->execute() or die "Не могу выполнить: $sth -> errstr";
#Запрос пользователя которому предназначаеться письмо
            my $sth1 = $dbh->prepare("SELECT username FROM round WHERE active = true AND orgunit = \"$User\" ORDER BY id LIMIT $Count,1;") or die "Не  могу  подготовить : $dbh -> errstr\n";
            $sth1->execute() or die "Не могу выполнить: $sth -> errstr";
            $SelectUser = $sth1->fetchrow_array();
            }
        }
    $sth->finish();
    $dbh->disconnect();
    return $SelectUser;
    }
}
Скрипт может быть не идеальным. Если есть замечания и предложения с радостью их выслушаю :smile:
В планах дописать данный скрипт с логированием в базу данных :oops:

andreysv
проходил мимо
Сообщения: 6
Зарегистрирован: 2012-05-17 18:25:10

Re: Полезные скрипты/настройки для exim.

Непрочитанное сообщение andreysv » 2013-08-08 12:22:13

добрый день всем.
назрела необходимость зарубить возможность отправки почты любым способом пользователю:
1. через смтп почтовым клиентом
2. с помощью php mail

первый пункт нашел как реализовать - в конфиге exim есть блеклист доменов отправителей.
второй пункт не нашел, можно запретить функцию php mail(), но локально для пользователя этого сделать не получается, закрывается дл всего сервера, а надо конкретному пользователю блочить отправку. (php работает как fastcgi)

помогите с пунктом 2

Аватара пользователя
gmn
сержант
Сообщения: 239
Зарегистрирован: 2007-02-28 18:01:37
Откуда: UA, Kiev
Контактная информация:

Re: Полезные скрипты/настройки для exim.

Непрочитанное сообщение gmn » 2013-08-09 14:56:23

где-то так ...

check_smtp:
...
deny !authenticated = *
message = "Relay denied without authentification."
...
discard condition = ${if match_local_part{$authenticated_id}{lsearch;/usr/local/etc/exim/acl/blocked_senders} {yes}{no}}
log_message = BLOCKED: Sender $authenticated_id
...

check_not_smtp:
...
discard condition = ${if match_local_part{$authenticated_id}{lsearch;/usr/local/etc/exim/acl/blocked_senders} {yes}{no}}
log_message = BLOCKED: Sender $authenticated_id
...

P.S. Первое для smtp, второе не для smtp (php mail, например).
В файле blocked_senders логины заблокированных юзеров.

morfaur
проходил мимо

Re:

Непрочитанное сообщение morfaur » 2013-11-29 9:09:36

Alex Keda писал(а):Прибиваем спам, отправляемый как рикошет:
(когда спамеры подставляют адрес юзера в обратный адрес - сам огрёб позавчера несколько сотен писем :)) Вариант примитивный - но должен работать.
в ACL data:

Код: Выделить всё

# bounce test
        deny    message         = Message that generate bounce not coming from main hosts
                condition       = ${if !match{$message_body}{X-Bounce-ID}{yes}{no}}
                condition       = ${if eq{$sender_address}{}{yes}{no}}
в транспорте:

Код: Выделить всё

remote_smtp:
        driver                  = smtp
        headers_add             = "X-Bounce-ID: $primary_hostname"
вроде пашет, но тестирование пока не завершено :)

Комментарий участника gmn:
Да, вариант. Но будет работать если сервер-отправитель NDR будет включать часть исходного сообщения.
А не все включают хотя бы заголовки исходного сообщения.
Да и в таком случае отлупы на письма, отправленные с сайтов на хостинге не будут приняты.
Подробнее о моем вопросе здесь - http://forum.lissyara.su/viewtopic.php?f=20&t=4168

GandjaFuzz
проходил мимо

Re: Полезные скрипты/настройки для exim.

Непрочитанное сообщение GandjaFuzz » 2014-02-18 20:59:31

lucas писал(а):Блокировка спамеров на этапе connect:

Код: Выделить всё

hostlist bad_hosts = 1.2.3.0/24 : 2.3.0.0/16 (или файл с адресами)

acl_smtp_connect = acl_check_connect

acl_check_connect:

deny message = brrr...?
hosts = +bad_hosts

accept
куда все это вставить ?

Аватара пользователя
sergio
мл. сержант
Сообщения: 79
Зарегистрирован: 2006-12-30 2:47:28
Откуда: Русь Києвська

Re: Полезные скрипты/настройки для exim.

Непрочитанное сообщение sergio » 2014-10-30 17:44:13

Хороший FAQ по EXIM, правда на английском.
Перенесите, если не туда запостил

crush13
проходил мимо
Сообщения: 8
Зарегистрирован: 2015-09-17 15:40:30

Полезные скрипты/настройки для exim.

Непрочитанное сообщение crush13 » 2015-10-16 9:19:33

Фильтрация писем c исполняемыми файлами внутри архивов 7z, zip, rar. Просто и со вкусом, не нужны отдельные скрипты.
Включаем проверку mime

Код: Выделить всё

acl_smtp_mime = acl_check_mime
Сам ACL:

Код: Выделить всё

acl_check_mime:

# Проверка вложений на исполняемые файлы
deny    message                 = We do not accept attachments like: $mime_filename
        condition               = ${if match{$mime_filename}{\N\.(exe|com|vbs|bat|pif|scr|hta|js|jse|cmd|chm|cpl|jsp|reg|vbe|lnk|ocx|msi|dll|sys|cab)$\N}}

# Проверка архивов на вложенные исполняемые файлы
deny    message                 = Probably this message contains dangerous file in attachment: $mime_filename
        condition               = ${if match{$mime_filename}{\N(?i)\.(zip|rar|7z)$\N}}
        decode                  = default
        condition               = ${if match{${run{/usr/local/bin/7z l $mime_decoded_filename}}}{\N(?i)\.(exe|com|vbs|bat|pif|scr|hta|js|jse|cmd|chm|cpl|jsp|reg|vbe|lnk|ocx
        log_message             = Rejected mail with dangerous attachement: filename=$mime_filename, content-type=$mime_content_type, recipients=$recipients

accept
Откуда было взято, уже не помню, но пригодится всем.
P.S. Обращайте внимание на версию p7zip и путь к нему, мне пришлось собрать новый пакет, так как старый пакет не понимал архивы формата RAR.
Путь можно проверить командой в консоли:

Код: Выделить всё

where is 7z
7z: /usr/local/bin/7z

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

Полезные скрипты/настройки для exim.

Непрочитанное сообщение xM » 2015-10-30 21:37:01

Полезный тест вашего почтового сервера.
Пишете письмо на test@allaboutspam.com и через некоторое время получаете в баунсе ссылку на результаты теста вашего сервера на предмет
поддержки технологий защиты от спам.
IT voodoo blog https://kostikov.co

doker
сержант
Сообщения: 207
Зарегистрирован: 2008-11-18 16:20:26

Полезные скрипты/настройки для exim.

Непрочитанное сообщение doker » 2017-01-10 15:13:26

crush13 писал(а):Фильтрация писем c исполняемыми файлами внутри архивов 7z, zip, rar. Просто и со вкусом, не нужны отдельные скрипты.
Включаем проверку mime
а как быть если в архиве файлы кириллицей ? у меня не отрабатывает ((

Отправлено спустя 10 минут 34 секунды:
с zip`м проблема

Отправлено спустя 15 минут 37 секунд:
doker писал(а):
crush13 писал(а):Фильтрация писем c исполняемыми файлами внутри архивов 7z, zip, rar. Просто и со вкусом, не нужны отдельные скрипты.
Включаем проверку mime
а как быть если в архиве файлы кириллицей ? у меня не отрабатывает ((

Отправлено спустя 10 минут 34 секунды:
с zip`м проблема
решение
{match{${run{/usr/bin/unzip -v -O WIN-1251 $mime_decoded_filename}}}{\N(?i)\.(APP)\n\N}}

Аватара пользователя
gmn
сержант
Сообщения: 239
Зарегистрирован: 2007-02-28 18:01:37
Откуда: UA, Kiev
Контактная информация:

Полезные скрипты/настройки для exim.

Непрочитанное сообщение gmn » 2017-01-10 18:07:57

Использовать 7z.

Код: Выделить всё

condition = ${if match{$mime_filename}{\N(?i)\.(7z|arj|bz2|gz|rar|uue|z|zip|xz)$\N}}
condition = ${if match{${run{/usr/local/bin/7z l $mime_decoded_filename}}} {\N(?i)\.(com|pif|scr|lnk|exe|js|zip|jar|bat|cmd)\N} }

doker
сержант
Сообщения: 207
Зарегистрирован: 2008-11-18 16:20:26

Полезные скрипты/настройки для exim.

Непрочитанное сообщение doker » 2017-01-11 9:48:47

gmn писал(а):Использовать 7z.
использую,не отрабатывает

Аватара пользователя
gmn
сержант
Сообщения: 239
Зарегистрирован: 2007-02-28 18:01:37
Откуда: UA, Kiev
Контактная информация:

Полезные скрипты/настройки для exim.

Непрочитанное сообщение gmn » 2017-01-11 10:41:27

doker писал(а):
gmn писал(а):Использовать 7z.
использую,не отрабатывает
Правило указывать в acl_smtp_mime.

Код: Выделить всё

warn decode = default

deny message = This message contains dangerous file(s) in ${uc:${extract{-1}{.}{$mime_filename}}} attachment.
     condition = ${if <{$message_size}{2500K}}
     condition = ${if match{$mime_filename}{\N(?i)\.(7z|arj|bz2|gz|rar|uue|z|zip|xz)$\N}}
     condition = ${if match{${run{/usr/local/bin/7z l $mime_decoded_filename}}} {\N(?i)\.(com|pif|scr|lnk|exe|js|zip|jar|bat|cmd)\N} }
     log_message = ...

doker
сержант
Сообщения: 207
Зарегистрирован: 2008-11-18 16:20:26

Полезные скрипты/настройки для exim.

Непрочитанное сообщение doker » 2017-01-11 11:31:54

моё, пока не указал unzip пропускал архивы с кириллицей

Код: Выделить всё

acl_check_mime:

  warn
       condition = ${if match{$mime_filename}{\N(?i)\.(ZIP)$\N}}
       condition = ${if def:sender_host_address}
       decode = default
       condition = ${if or{\
                            {match{${run{/usr/bin/unzip -v -O WIN-1251 $mime_decoded_filename}}}{\N(?i)\.(APP|ZIP)\n\N}}\
                            {match{${run{/usr/bin/7z l $mime_decoded_filename}}}{\N(?i)\.(APP|ZIP)\n\N}}\
                           {match{${run{/usr/bin/unrar l $mime_decoded_filename}}}{\N(?i)\.(APP|ZIP)\n\N}}\
                           {match{${run{/bin/tar -tf $mime_decoded_filename}}}{\N(?i)\.(APP|ZIP)\n\N}}}}
        set acl_m0 = 33
         set acl_m1 =  A arhive attachment contains a Windows-executable file - blocked because we are afraid of new viruses not recognized [yet] by antiviruses.
        set acl_m2= $sender_address
        set acl_m3 = 1 #не посылаь в архив
        log_message = forbidden attachment: filename=$mime_filename, content-type=$mime_content_type,recipients=$recipients


  accept


Аватара пользователя
sergio
мл. сержант
Сообщения: 79
Зарегистрирован: 2006-12-30 2:47:28
Откуда: Русь Києвська

Полезные скрипты/настройки для exim.

Непрочитанное сообщение sergio » 2018-10-29 15:01:21

подскажите. а как удалять вложения с двойным раширением?
Типа:
файл.exe.zip или file.doc.xls?

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35454
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Полезные скрипты/настройки для exim.

Непрочитанное сообщение Alex Keda » 2019-01-14 20:48:43

а зачем?
Убей их всех! Бог потом рассортирует...

Аватара пользователя
32мб
рядовой
Сообщения: 10
Зарегистрирован: 2020-06-06 0:10:28

Полезные скрипты/настройки для exim.

Непрочитанное сообщение 32мб » 2020-06-06 2:38:20

Проверка SPF

Еще один способ проверки SPF внутри ACL, что-бы был :roll: Говорят что другой пример на перле чуть тормозной и грузит систему, но я не проверял.

Для начала нам нужна утилита spfquery, устанавливается в дебиане вот так:

Код: Выделить всё

apt install spfquery
Установка тянет за собой libspf2, других зависимостей (пока) нет.

Затем в ACL где у вас acl_smtp_rcpt, в дебиане /etc/exim4/conf.d/acl/30_exim4-config_check_rcpt

Код: Выделить всё

  # Запрашиваем проверку SPF
  warn
     set acl_m_spf = ${run{/usr/bin/spfquery -ip "$sender_host_address" -sender "$sender_address" -helo "$sender_helo_name"}{}{}}
     set acl_m_spf = $runrc
  # Отсеиваем почту, ненужное плз закомментить =) 
  deny condition  = ${if ={$acl_m_spf}{1}} # Адрес, откуда пришло мыло, не прописан в SPF
  deny condition  = ${if ={$acl_m_spf}{3}} # Адрес не имеет права отправлять почту с этого домена
  deny condition  = ${if ={$acl_m_spf}{4}} # Адрес так-же не имеет права отправлять почту с этого домена, но домену на это пох.
  deny condition  = ${if ={$acl_m_spf}{5}} # SPF не найдена вообще
  deny condition  = ${if ={$acl_m_spf}{7}} # В SPF какая-то непонятная муть
  
  # Или вообще проще вместо всех deny выше (все закомментировать) разрешить только нормальные SPF записи =)
  #  require condition = ${if ={$acl_m_spf}{2}} 
Если ничего из deny не комментить, то может получиться сильно строго :oops:




Какие есть коды вообще:
1 - домен отправителя не делает никаких утверждений об ip-адресе. Этот результат должен быть интерпретирован так, как если бы SPF-записи вообще не существовало.
2 - Все нормально - ip-адрес уполномочен отправлять почту для домена-отправителя.
3 - Все плохо - ip-адрес не имеет права отправлять почту для домена отправителя.
4 - ip-адрес не уполномочен отправлять почту для домена-отправителя, но домен-отправитель не может или не хочет декларировать строго, что такая почта никогда не сможет прийти с него - softfail.
5 - запись SPF не найдена вообще
6 - Внутренняя ошибка (например, недоступен DNS-сервер).
7 - Ошибка синтаксиса одной или более SPF записей.

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

Полезные скрипты/настройки для exim.

Непрочитанное сообщение xM » 2020-06-06 2:42:49

А зачем эти велосипеды, когда есть стандартные операторы для работы с SPF непосредственно из ACL Exim
http://exim.org/exim-html-current/doc/h ... dmarc.html
IT voodoo blog https://kostikov.co