Thank you for reading this post, don't forget to subscribe!
Как мне вырезать все вложения при отправке писем во внешний мир?
Реализовать данную задачу можно с помощью программы altermime.
В данном примере использовалась следующая версия altermime
1 2 3 |
<span class="cli_prompt"># </span><span class="cli_command">altermime --version</span> <span class="cli_output">alterMIME v0.3.10 (November-2008) by Paul L Daniels - http://www.pldaniels.com/altermime</span> |
Для начала пишем небольшой скрипт.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<span class="co0">#!/bin/bash</span> <span class="re2">ALTERMIME</span>=<span class="sy0">/</span>usr<span class="sy0">/</span>bin<span class="sy0">/</span>altermime <span class="re2">SENDMAIL</span>=<span class="sy0">/</span>usr<span class="sy0">/</span>sbin<span class="sy0">/</span><span class="kw2">sendmail</span> <span class="re2">ALTERMIME_DIR</span>=<span class="sy0">/</span>tmp <span class="co0"># Ожидается, что коды завершения команд, вызываемых Postfix,</span> <span class="co0"># будут придерживаться правил, определенных в <sysexits.h>.</span> <span class="re2">TEMPFAIL</span>=75 <span class="re2">UNAVAILABLE</span>=<span class="nu0">69</span> <span class="co0"># Перейти в рабочий каталог и уведомить Postfix в случае неудачи 'cd'.</span> <span class="kw3">cd</span> <span class="re1">$ALTERMIME_DIR</span> <span class="sy0">||</span> <span class="br0">{</span> <span class="kw3">echo</span> <span class="re1">$ALTERMIME_DIR</span> does not exist; <span class="kw3">exit</span> <span class="re1">$TEMPFAIL</span>; <span class="br0">}</span> <span class="co0"># Очистка по завершении или прерывании работы.</span> <span class="kw3">trap</span> <span class="st0">"rm -f in.$$"</span> <span class="nu0">0</span> <span class="nu0">1</span> <span class="nu0">2</span> <span class="nu0">3</span> <span class="nu0">15</span> <span class="co0"># Запись почты во временный файл. Уведомление Postfix в случае неудачи.</span> <span class="kw2">cat</span> <span class="sy0">></span>in.<span class="re4">$$</span> <span class="sy0">||</span> <span class="br0">{</span> <span class="kw3">echo</span> Cannot <span class="kw2">write</span> to <span class="re1">$RIPMIME_DIR</span>; <span class="kw3">exit</span> <span class="re1">$TEMPFAIL</span>; <span class="br0">}</span> <span class="co0"># Вызываем alterMIME, передаем ей сообщение и говорим, что необходимо удалить все вложения</span> <span class="re1">$ALTERMIME</span> <span class="re5">--input</span>=in.<span class="re4">$$</span> <span class="re5">--removeall</span> <span class="sy0">||</span> <span class="br0">{</span> <span class="kw3">echo</span> Message content rejected; <span class="kw3">exit</span> <span class="re1">$UNAVAILABLE</span>; <span class="br0">}</span> <span class="co0"># Вызов sendmail для возврата сообщения обратно в Postfix</span> <span class="re1">$SENDMAIL</span> <span class="st0">"$@"</span> <span class="sy0"><</span>in.<span class="re4">$$</span> <span class="co0"># Используем код завершения sendmail, чтобы сообщить Postfix, как все прошло.</span> <span class="kw3">exit</span> <span class="re4">$?</span> |
Сохраняем его например под таким именем /etc/postfix/filter/remove_attachments.sh
И выставляем права на запуск
1 2 |
<span class="cli_prompt"># </span><span class="cli_command">chmox +x /etc/postfix/filter/remove_attachments.sh</span> |
Теперь нам необходимо описать сам транспорт для фильтрации в файле /etc/postfix/master.cf
1 2 |
altermime unix <span class="sy0">-</span> n n <span class="sy0">-</span> <span class="sy0">-</span> pipe flags<span class="sy0">=</span>DRh user<span class="sy0">=</span><a href="http://www.php.net/virtual"><span class="kw3">virtual</span></a> null_sender<span class="sy0">=</span> argv<span class="sy0">=/</span>etc<span class="sy0">/</span>postfix<span class="sy0">/</span>filter<span class="sy0">/</span>remove_attachments<span class="sy0">.</span>sh <span class="sy0">-</span>f $<span class="br0">{</span>sender<span class="br0">}</span> <span class="sy0">--</span> $<span class="br0">{</span>recipient<span class="br0">}</span> |
Теперь описываем политики фильтрации в файле /etc/postfix/main.cf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<span class="co2"># </span><span class="co2"># /etc/postfix/main.cf </span><span class="co2"># </span> <span class="co2"># Описываем пользовательский класс ограничений </span>smtpd_restriction_classes <span class="sy0">=</span> no_attachments <span class="co2"># Описываем политику проверок для данного класса </span>no_attachments <span class="sy0">=</span> <span class="co2"># В данном файле указываем получателей/домены для которых вложения не будут удаляться </span> check_recipient_access <a href="http://www.php.net/hash"><span class="kw3">hash</span></a><span class="sy0">:/</span>etc<span class="sy0">/</span>postfix<span class="sy0">/</span>local_domain <span class="co2"># В этом файле указываем отправителей для которых мы хотим включить данную политику </span> check_sender_access <a href="http://www.php.net/hash"><span class="kw3">hash</span></a><span class="sy0">:/</span>etc<span class="sy0">/</span>postfix<span class="sy0">/</span>restrict_sender <span class="co2"># В данном файле применяем пользовательский класс no_attachments к определенным отправителям </span>smtpd_sender_restrictions <span class="sy0">=</span> check_sender_access <a href="http://www.php.net/hash"><span class="kw3">hash</span></a><span class="sy0">:/</span>etc<span class="sy0">/</span>postfix<span class="sy0">/</span>sender_access <span class="co2"># Для избежания образования петель </span>altermime_destination_recipient_limit <span class="sy0">=</span> <span class="nu0">1</span> |
1 2 3 4 5 6 |
# # /etc/postfix/local_domain # vmware.local OK |
1 2 3 4 5 6 |
# # /etc/postfix/restrict_sender # alex@vmware.local FILTER altermime: |
1 2 3 4 5 6 |
# # /etc/postfix/sender_access # alex@vmware.local no_attachments |
Создаем соответствующие карты просмотра
1 2 |
<span class="cli_prompt"># </span><span class="cli_command">postmap sender_access restrict_sender local_domain</span> |
Отправляем внутри домена письмо с вложением
1 2 3 4 5 6 7 8 9 |
<span class="cli_output">Oct 8 16:48:30 centos5 postfix/smtpd[16193]: connect from alex.vmware.local[192.168.1.100]</span> <span class="cli_output">Oct 8 16:48:30 centos5 postfix/smtpd[16193]: 529151E888A: client=alex.vmware.local[192.168.1.100]</span> <span class="cli_output">Oct 8 16:48:30 centos5 postfix/cleanup[16196]: 529151E888A: message-id=<1585498302.20091008164826@vmware.local></span> <span class="cli_output">Oct 8 16:48:30 centos5 postfix/qmgr[16189]: 529151E888A: from=<alex@vmware.local>, size=86185, nrcpt=1 (queue active)</span> <span class="cli_output">Oct 8 16:48:30 centos5 postfix/smtpd[16193]: disconnect from alex.vmware.local[192.168.1.100]</span> <span class="cli_output">Oct 8 16:48:30 centos5 postfix/virtual[16197]: 529151E888A: to=<root@vmware.local>, relay=virtual, delay=0.05, delays=0.03/0.01/0/0.01, </span> <span class="cli_output">dsn=2.0.0, status=sent (delivered to maildir)</span> <span class="cli_output">Oct 8 16:48:30 centos5 postfix/qmgr[16189]: 529151E888A: removed</span> |
Теперь попробуем отправить письмо с вложением в мир
Отправляем внутри домена письмо с вложением
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<span class="cli_output">Oct 8 16:50:42 centos5 postfix/smtpd[16212]: connect from alex.vmware.local[192.168.1.100]</span> <span class="cli_output">Oct 8 16:50:42 centos5 postfix/smtpd[16212]: NOQUEUE: filter: RCPT from alex.vmware.local[192.168.1.100]: <alex@vmware.local>: Sender address triggers FILTER altermime:; </span> <span class="cli_output">from=<alex@vmware.local> to=<alex@sys-adm.org.ua> proto=ESMTP helo=<alex.vmware.local></span> <span class="cli_output">Oct 8 16:50:42 centos5 postfix/smtpd[16212]: F16B01E888A: client=alex.vmware.local[192.168.1.100]</span> <span class="cli_output">Oct 8 16:50:42 centos5 postfix/cleanup[16215]: F16B01E888A: message-id=<1805851929.20091008165039@vmware.local></span> <span class="cli_output">Oct 8 16:50:43 centos5 postfix/qmgr[16189]: F16B01E888A: from=<alex@vmware.local>, size=403011, nrcpt=1 (queue active)</span> <span class="cli_output">Oct 8 16:50:43 centos5 postfix/smtpd[16212]: disconnect from alex.vmware.local[192.168.1.100]</span> <span class="cli_output">Oct 8 16:50:43 centos5 postfix/pickup[16190]: 293401E8892: uid=1981 from=<alex@vmware.local></span> <span class="cli_output">Oct 8 16:50:43 centos5 postfix/cleanup[16215]: 293401E8892: message-id=<1805851929.20091008165039@vmware.local></span> <span class="cli_output">Oct 8 16:50:43 centos5 postfix/qmgr[16189]: 293401E8892: from=<alex@vmware.local>, size=936, nrcpt=1 (queue active)</span> <span class="cli_output">Oct 8 16:50:43 centos5 postfix/pipe[16216]: F16B01E888A: to=<alex@sys-adm.org.ua>, relay=altermime, delay=0.21, delays=0.04/0.01/0/0.16, </span> <span class="cli_output">dsn=2.0.0, status=sent (delivered via altermime service)</span> <span class="cli_output">Oct 8 16:50:43 centos5 postfix/qmgr[16189]: F16B01E888A: removed</span> <span class="cli_output">Oct 8 16:50:44 centos5 postfix/smtp[16222]: 293401E8892: to=<alex@sys-adm.org.ua>, relay=mail.domain.com.ua[xxx.xxx.xxx.xxx]:25, delay=0.99,</span> <span class="cli_output">delays=0.01/0.01/0.44/0.52, dsn=2.0.0, status=sent (250 ok 1255009844 qp 10831)</span> <span class="cli_output">Oct 8 16:50:44 centos5 postfix/qmgr[16189]: 293401E8892: removed</span> |
Как видно из log-файла письмо было передано фильтру altermime, который удалил вложения и далее отправлено адресату
Как избавиться от сообщений вида - warning: dict_nis_init: NIS domain name not set - NIS lookups disabled
Как правило сообщение появляется если вы явно не задали значение параметра alias_maps и у вас на сервере не настроена NIS (Network Information Service)
1 2 3 |
<span class="cli_prompt"># </span><span class="cli_command">postconf -d alias_maps</span> <span class="cli_output">alias_maps = hash:/etc/aliases, nis:mail.aliases</span> |
Как видно из вывода значение по умолчанию содержит ссылку на карту типа nis. Чтобы решить данную проблему достаточно указать следующее значение
1 2 3 |
<span class="co2">#/etc/postfix/main.cf </span> alias_maps <span class="sy0">=</span> <a href="http://www.php.net/hash"><span class="kw3">hash</span></a><span class="sy0">:/</span>etc<span class="sy0">/</span>aliases |
И дать команду postfix перечитать конфигурационный файл
1 2 3 |
<span class="cli_prompt"># </span><span class="cli_command">postfix reload</span> <span class="cli_output">postfix/postfix-script: refreshing the Postfix mail system</span> |
Для этого необходимо сделать соответствующую проверку в smtpd_helo_restrictions
1 2 3 4 5 6 7 8 |
<span class="co2">#/etc/postfix/main.cf </span> smtpd_helo_restrictions <span class="sy0">=</span> permit_mynetworks permit_sasl_authenticated check_helo_access <a href="http://www.php.net/hash"><span class="kw3">hash</span></a><span class="sy0">:</span><span class="re0">$config_directory</span><span class="sy0">/</span>hello_access <span class="sy0">...</span> <span class="sy0">...</span> |
В данный список вносим имя нашего сервера
1 2 3 |
<span class="co2">#/etc/postfix/hello_access </span> <a href="http://www.php.net/mail"><span class="kw3">mail</span></a><span class="sy0">.</span>sys<span class="sy0">-</span>adm<span class="sy0">.</span>org<span class="sy0">.</span>ua REJECT Don<span class="st_h">'t use my server name</span> |
Создаем карту hello_access.db и даем команду postfix перечитать конфигурационный файл
1 2 3 4 |
<span class="cli_prompt"># </span><span class="cli_command">postmap /etc/postfix/hello_access</span> <span class="cli_prompt"># </span><span class="cli_command">postfix reload</span> <span class="cli_output">postfix/postfix-script: refreshing the Postfix mail system</span> |
А теперь тестируем наше ограничение
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<span class="cli_prompt"># </span><span class="cli_command">telnet mail.sys-adm.org.ua 25</span> <span class="cli_output">Trying 213.85.107.157...</span> <span class="cli_output">Connected to mail.sys-adm.org.ua (213.85.107.157).</span> <span class="cli_output">Escape character is '^]'.</span> <span class="cli_output">220 mail.sys-adm.org.ua ESMTP</span> <span class="cli_output">helo mail.sys-adm.org.ua</span> <span class="cli_output">250 mail.sys-adm.org.ua</span> <span class="cli_output">mail from:<></span> <span class="cli_output">250 2.1.0 Ok</span> <span class="cli_output">rcpt to:<alex@sys-adm.org.ua></span> <span class="cli_output">554 5.7.1 <mail.sys-adm.org.ua>: Helo command rejected: Don't use my server name</span> <span class="cli_output">quit</span> <span class="cli_output">221 2.0.0 Bye</span> <span class="cli_output">Connection closed by foreign host.</span> |
Смотрим log-файл
1 2 3 4 5 |
<span class="cli_output">Sep 29 19:45:46 mail postfix/smtpd[25432]: connect from alex.sys-adm.org.ua[xxx.xxx.xxx.xxx]</span> <span class="cli_output">Sep 29 19:46:08 mail postfix/smtpd[25432]: NOQUEUE: reject: RCPT from alex.sys-adm.org.ua[xxx.xxx.xxx.xxx]: 554 5.7.1 <mail.sys-adm.org.ua>: </span> <span class="cli_output">Helo command rejected: Don't use my server name; from=<> to=<alex@sys-adm.org.ua> proto=SMTP helo=<mail.sys-adm.org.ua></span> <span class="cli_output">Sep 29 19:46:13 mail postfix/smtpd[25432]: disconnect from alex.sys-adm.org.ua[xxx.xxx.xxx.xxx]</span> |
Вообще то это не функция MTA, по этому по умолчанию postfix не поддерживает данный функционал. Если вам необходимы квоты, то вы можете использовать vda (virtual delivery agent) с патчем. Либо использовать альтернативные агенты доставки, например maildrop/dovecot delivery agent
Классы адресов это способ группировки адресов получателей по способу доставки их писем. Всего существует 5 встроенных классов адресов:
-
класс локальных доменов [local domain class]
-
класс виртуальных алиасов [virtual alias domain class]
-
класс виртуальных доменов [virtual mailbox domain class]
-
класс доменов ретрансляции (пересылки) [relay domain class]
-
класс домена по умолчанию [default domain class]
Каждый из предопределенных классов адресов определяет следующие три вещи:
-
Список доменов, которые являются членами данного класса: например, все локальные домены или все домены ретрансляции.
-
Транспорт доставки по умолчанию. Например, local/virtual/relay/maildrop (транспорты доставки описаны в файле master.cf). Это позволяет добиться легкости в настройке postfix, так как отпадает необходимость явно указывать роутинг в таблице транспортов
-
Список допустимых получателей для данного класса адресов. SMTP сервер postfix отвергает несуществующих получателей с сообщением «User unknown in [local/virtual/relay] table». Данная возможность позволяет избежать забивания очереди сообщениями о недоставки MAILER-DAEMON
Для решения данной задачи достаточно пречислить необходимых пользователей в файле и указать ссылку на него в параметре local_recipient_maps
1 2 3 4 5 6 7 8 9 10 11 12 |
<span class="cli_prompt"># </span><span class="cli_command">postconf -n</span> <span class="cli_output">alias_database = hash:/etc/aliases</span> <span class="cli_output">alias_maps = hash:/etc/aliases</span> <span class="cli_output">inet_interfaces = all</span> <span class="cli_output">local_recipient_maps = hash:/etc/postfix/local_mailbox, $alias_maps</span> <span class="cli_output">mydestination = $mydomain, localhost.$mydomain, localhost</span> <span class="cli_output">mydomain = vmware.local</span> <span class="cli_output">myhostname = centos5.vmware.local</span> <span class="cli_output">mynetworks = 127.0.0.0/8</span> <span class="cli_output">myorigin = $mydomain</span> <span class="cli_output">unknown_local_recipient_reject_code = 550</span> |
1 2 3 4 5 |
<span class="cli_prompt"># </span><span class="cli_command">cat /etc/postfix/local_mailbox</span> <span class="cli_output">alex OK</span> <span class="cli_output">root OK</span> <span class="cli_output">info OK</span> |
1 2 3 4 |
<span class="cli_prompt"># </span><span class="cli_command">postmap /etc/postfix/local_mailbox</span> <span class="cli_prompt"># </span><span class="cli_command">postfix reload</span> <span class="cli_output">postfix/postfix-script: refreshing the Postfix mail system</span> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<span class="cli_prompt"># </span><span class="cli_command">telnet localhost 25</span> <span class="cli_output">Trying 127.0.0.1...</span> <span class="cli_output">Connected to localhost.localdomain (127.0.0.1).</span> <span class="cli_output">Escape character is '^]'.</span> <span class="cli_output">220 centos5.vmware.local ESMTP Postfix</span> <span class="cli_output">helo localhost</span> <span class="cli_output">250 centos5.vmware.local</span> <span class="cli_output">mail from:<></span> <span class="cli_output">250 2.1.0 Ok</span> <span class="cli_output">rcpt to:<alex@vmware.local></span> <span class="cli_output">250 2.1.5 Ok</span> <span class="cli_output">data</span> <span class="cli_output">354 End data with <CR><LF>.<CR><LF></span> <span class="cli_output">Hello world</span> <span class="cli_output">.</span> <span class="cli_output">250 2.0.0 Ok: queued as 181F61804A3</span> <span class="cli_output">quit</span> <span class="cli_output">221 2.0.0 Bye</span> <span class="cli_output">Connection closed by foreign host.</span> <span class="cli_prompt"># </span><span class="cli_command">cat /var/log/maillog | grep 181F61804A3</span> <span class="cli_output">Sep 28 17:14:31 centos5 postfix/smtpd[1187]: 181F61804A3: client=localhost.localdomain[127.0.0.1]</span> <span class="cli_output">Sep 28 17:14:38 centos5 postfix/cleanup[1189]: 181F61804A3: message-id=<20090928141431.181F61804A3@centos5.vmware.local></span> <span class="cli_output">Sep 28 17:14:38 centos5 postfix/qmgr[1183]: 181F61804A3: from=<>, size=364, nrcpt=1 (queue active)</span> <span class="cli_output">Sep 28 17:14:38 centos5 postfix/local[1191]: 181F61804A3: to=<alex@vmware.local>, relay=local, delay=12, delays=12/0.01/0/0, dsn=2.0.0, status=sent (delivered to mailbox)</span> <span class="cli_output">Sep 28 17:14:38 centos5 postfix/qmgr[1183]: 181F61804A3: removed</span> |
Теперь отправим письмо системному пользователю alexander, но который не указан в /etc/postfix/local_mailbox
1 2 3 |
<span class="cli_prompt"># </span><span class="cli_command">id alexander</span> <span class="cli_output">uid=1983(alexander) gid=1983(alexander) groups=1983(alexander)</span> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<span class="cli_prompt"># </span><span class="cli_command">telnet localhost 25</span> <span class="cli_output">Trying 127.0.0.1...</span> <span class="cli_output">Connected to localhost.localdomain (127.0.0.1).</span> <span class="cli_output">Escape character is '^]'.</span> <span class="cli_output">220 centos5.vmware.local ESMTP Postfix</span> <span class="cli_output">helo localhost</span> <span class="cli_output">250 centos5.vmware.local</span> <span class="cli_output">mail from:<></span> <span class="cli_output">250 2.1.0 Ok</span> <span class="cli_output">rcpt to:<alexander@vmware.local></span> <span class="cli_output">550 5.1.1 <alexander@vmware.local>: Recipient address rejected: User unknown in local recipient table</span> <span class="cli_output">quit</span> <span class="cli_output">221 2.0.0 Bye</span> <span class="cli_output">Connection closed by foreign host.</span> |
Как мы видим postfix еще на этапе SMTP сессии сообщил о том, что такого пользователя нет.
1 2 3 4 5 |
<span class="cli_output">Sep 28 17:19:47 centos5 postfix/smtpd[1304]: connect from localhost.localdomain[127.0.0.1]</span> <span class="cli_output">Sep 28 17:20:06 centos5 postfix/smtpd[1304]: NOQUEUE: reject: RCPT from localhost.localdomain[127.0.0.1]: 550 5.1.1 <alexander@vmware.local>:</span> <span class="cli_output">Recipient address rejected: User unknown in local recipient table; from=<> to=<alexander@vmware.local> proto=SMTP helo=<localhost></span> <span class="cli_output">Sep 28 17:20:10 centos5 postfix/smtpd[1304]: disconnect from localhost.localdomain[127.0.0.1]</span> |
Итак у нас postfix со следующей конфигурацией
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<span class="cli_prompt"># </span><span class="cli_command">postconf -n</span> <span class="cli_output">alias_database = hash:/etc/aliases</span> <span class="cli_output">alias_maps = hash:/etc/aliases</span> <span class="cli_output">inet_interfaces = all</span> <span class="cli_output">local_recipient_maps = unix:passwd.byname $alias_maps</span> <span class="cli_output">mail_owner = postfix</span> <span class="cli_output">mydestination = $mydomain, localhost.$mydomain, localhost</span> <span class="cli_output">mydomain = vmware.local</span> <span class="cli_output">myhostname = centos5.vmware.local</span> <span class="cli_output">mynetworks = 127.0.0.0/8</span> <span class="cli_output">myorigin = $mydomain</span> <span class="cli_output">unknown_local_recipient_reject_code = 550</span> <span class="cli_output">virtual_gid_maps = static:1981</span> <span class="cli_output">virtual_mailbox_base = /var/spool/mail</span> <span class="cli_output">virtual_mailbox_domains = vmware.local</span> <span class="cli_output">virtual_mailbox_maps = hash:/etc/postfix/virtual_mailbox</span> <span class="cli_output">virtual_minimum_uid = 1000</span> <span class="cli_output">virtual_uid_maps = static:1981</span> |
Указываем, где хранить и в каком формате почту для пользователя alex@vmware.local
1 2 3 |
<span class="cli_prompt"># </span><span class="cli_command">cat /etc/postfix/virtual_mailbox</span> <span class="cli_output">alex@vmware.local vmware.local/alex@vmware.local/</span> |
Настройки минимальные, только чтобы описать суть проблемы. Как видно из вывода наш домен - vmware.local указан в $mydestination с помощью параметра $mydomain, а также он указан в $virtual_mailbox_domains. Т.е. мы указали один и тот же домен сразу в двух классах адресов - локальных и виртуальных. Чего не стоит никогда делать.
Теперь давайте отправим почту пользователю alex@vmware.local (в системе существует системный пользователь alex, также он описан в virtual_mailbox_maps, см. выше)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<span class="cli_prompt"># </span><span class="cli_command">telnet localhost 25</span> <span class="cli_output">Trying 127.0.0.1...</span> <span class="cli_output">Connected to localhost.localdomain (127.0.0.1).</span> <span class="cli_output">Escape character is '^]'.</span> <span class="cli_output">220 centos5.vmware.local ESMTP Postfix</span> <span class="cli_output">helo localhost</span> <span class="cli_output">250 centos5.vmware.local</span> <span class="cli_output">mail from:<></span> <span class="cli_output">250 2.1.0 Ok</span> <span class="cli_output">rcpt to:<alex@vmware.local></span> <span class="cli_output">250 2.1.5 Ok</span> <span class="cli_output">data</span> <span class="cli_output">354 End data with <CR><LF>.<CR><LF></span> <span class="cli_output">hello world</span> <span class="cli_output">.</span> <span class="cli_output">250 2.0.0 Ok: queued as 37B5A18051A</span> <span class="cli_output">quit</span> <span class="cli_output">221 2.0.0 Bye</span> <span class="cli_output">Connection closed by foreign host.</span> |
Теперь смотрим log-файл
1 2 3 4 5 6 7 8 9 |
<span class="cli_output">Sep 28 16:02:02 centos5 postfix/smtpd[531]: connect from localhost.localdomain[127.0.0.1]</span> <span class="cli_output">Sep 28 16:02:23 centos5 postfix/trivial-rewrite[532]: warning: do not list domain vmware.local in BOTH mydestination and virtual_mailbox_domains</span> <span class="cli_output">Sep 28 16:02:23 centos5 postfix/smtpd[531]: 37B5A18051A: client=localhost.localdomain[127.0.0.1]</span> <span class="cli_output">Sep 28 16:02:28 centos5 postfix/cleanup[533]: 37B5A18051A: message-id=<20090928130223.37B5A18051A@centos5.vmware.local></span> <span class="cli_output">Sep 28 16:02:28 centos5 postfix/qmgr[424]: 37B5A18051A: from=<>, size=364, nrcpt=1 (queue active)</span> <span class="cli_output">Sep 28 16:02:28 centos5 postfix/local[535]: 37B5A18051A: to=<alex@vmware.local>, relay=local, delay=16, delays=16/0.01/0/0, dsn=2.0.0, status=sent (delivered to mailbox)</span> <span class="cli_output">Sep 28 16:02:28 centos5 postfix/qmgr[424]: 37B5A18051A: removed</span> <span class="cli_output">Sep 28 16:02:29 centos5 postfix/smtpd[531]: disconnect from localhost.localdomain[127.0.0.1]</span> |
Как видим мы получили соответствующее предупреждение о том, что наш домен указан сразу в двух классах адресов. И как видно из сообщений почту была доставлена локальному пользователю alex, а не как мы хотели виртуальному.
Самое просто решение данной проблемы - это исколючить домен vmware.local из $mydestination
1 2 3 |
<span class="cli_prompt"># </span><span class="cli_command">postconf mydestination</span> <span class="cli_output">mydestination = localhost.$mydomain, localhost</span> |
Еще раз отправляем сообщение и смотрим log-файл
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<span class="cli_prompt"># </span><span class="cli_command">telnet localhost 25</span> <span class="cli_output">Trying 127.0.0.1...</span> <span class="cli_output">Connected to localhost.localdomain (127.0.0.1).</span> <span class="cli_output">Escape character is '^]'.</span> <span class="cli_output">220 centos5.vmware.local ESMTP Postfix</span> <span class="cli_output">helo localhost</span> <span class="cli_output">250 centos5.vmware.local</span> <span class="cli_output">mail from:<></span> <span class="cli_output">250 2.1.0 Ok</span> <span class="cli_output">rcpt to:<alex@vmware.local></span> <span class="cli_output">250 2.1.5 Ok</span> <span class="cli_output">data</span> <span class="cli_output">354 End data with <CR><LF>.<CR><LF></span> <span class="cli_output">hello world</span> <span class="cli_output">.</span> <span class="cli_output">250 2.0.0 Ok: queued as 6FB701804A3</span> <span class="cli_output">quit</span> <span class="cli_output">221 2.0.0 Bye</span> <span class="cli_output">Connection closed by foreign host.</span> |
1 2 3 4 5 6 7 8 |
<span class="cli_output">Sep 28 16:45:47 centos5 postfix/smtpd[828]: connect from localhost.localdomain[127.0.0.1]</span> <span class="cli_output">Sep 28 16:46:03 centos5 postfix/smtpd[828]: 6FB701804A3: client=localhost.localdomain[127.0.0.1]</span> <span class="cli_output">Sep 28 16:46:09 centos5 postfix/cleanup[836]: 6FB701804A3: message-id=<20090928134603.6FB701804A3@centos5.vmware.local></span> <span class="cli_output">Sep 28 16:46:09 centos5 postfix/qmgr[825]: 6FB701804A3: from=<>, size=364, nrcpt=1 (queue active)</span> <span class="cli_output">Sep 28 16:46:09 centos5 postfix/virtual[837]: 6FB701804A3: to=<alex@vmware.local>, relay=virtual, delay=14, delays=14/0.01/0/0.03, dsn=2.0.0, status=sent (delivered to maildir)</span> <span class="cli_output">Sep 28 16:46:09 centos5 postfix/qmgr[825]: 6FB701804A3: removed</span> <span class="cli_output">Sep 28 16:46:10 centos5 postfix/smtpd[828]: disconnect from localhost.localdomain[127.0.0.1]</span> |
Как видно из сообщения письмо доставлено виртуальному пользователю alex, о чем свидетельствует строка relay=virtual, а также формат ящика - delivered to maildir
Вывод значения по умолчанию определенного параметра
1 2 3 |
<span class="cli_prompt"># </span><span class="cli_command">postconf -d smtpd_sasl_auth_enable</span> <span class="cli_output">smtpd_sasl_auth_enable = no</span> |
Вывод текущего значения параметра
1 2 3 |
<span class="cli_prompt"># </span><span class="cli_command">postconf smtpd_sasl_auth_enable</span> <span class="cli_output">smtpd_sasl_auth_enable = yes</span> |
Вывод версии postfix
1 2 3 |
<span class="cli_prompt"># </span><span class="cli_command">postconf | grep ^mail_version</span> <span class="cli_output">mail_version = 2.6.2</span> |
Просмотр текущей очереди сообщений
1 2 3 4 5 6 7 8 9 10 |
<span class="cli_prompt"># </span><span class="cli_command">postqueue -p</span> <span class="cli_output">-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------</span> <span class="cli_output">6CE545FD1D* 1372355 Wed Aug 22 17:33:05 MAILER-DAEMON</span> <span class="cli_output"> design@sys-adm.org.ua</span> <span class="cli_output">1310D5FAE6* 56037 Wed Aug 22 17:33:33 gluck@mail.subscribe.ru</span> <span class="cli_output"> alex@sys-adm.org.ua</span> <span class="cli_output">-- 1395 Kbytes in 2 Requests.</span> |
Удаление всех писем из очереди
1 2 3 |
<span class="cli_prompt"># </span><span class="cli_command">postsuper -d ALL</span> <span class="cli_output">postsuper: Deleted: 5 messages</span> |
Повторная отправка сообщений, которые находятся в очереди
1 2 |
<span class="cli_prompt"># </span><span class="cli_command">postqueue -f</span> |
Под словом «умный» я подразумеваю избирательный метод по определенным критериям. Например, дальше в примере, мы будем «награждать» грейлистингом хосты у которых отсутствует запись в обратной зоне или они используют т.н. литеральную форму, т.е. в helo подставляют ip адрес заключенный в квадратные скобки.
1 2 3 4 5 6 7 8 9 10 11 12 |
<span class="co2">#/etc/postfix/main.cf </span> smtpd_recipient_restrictions <span class="sy0">=</span> <span class="sy0">...</span> check_helo_access pcre<span class="sy0">:/</span>etc<span class="sy0">/</span>postfix<span class="sy0">/</span>ip_literal<span class="sy0">.</span>pcre check_client_access pcre<span class="sy0">:/</span>etc<span class="sy0">/</span>postfix<span class="sy0">/</span>no_ptr<span class="sy0">.</span>pcre <span class="co2"># Определяем пользовательский класс для грейлистинга </span>greylisting <span class="sy0">=</span> check_sender_access <a href="http://www.php.net/hash"><span class="kw3">hash</span></a><span class="sy0">:/</span>etc<span class="sy0">/</span>postfix<span class="sy0">/</span>greylisting_skip_senders check_client_access cidr<span class="sy0">:/</span>etc<span class="sy0">/</span>postfix<span class="sy0">/</span>greylisting_skip_hosts check_policy_service inet<span class="sy0">:</span>127<span class="sy0">.</span>0<span class="sy0">.</span>0<span class="sy0">.</span>1<span class="sy0">:</span><span class="nu0">2525</span> |
В данном примере в качестве грейлистинга я использовал - gld, который слушает входящие соединения на порту 2525. Вы можете использовать любой грейлистинг на ваш выбор.
В данном файле мы описываем отправителей, которых мы хотим исключить из грейлистинга
1 2 3 4 5 |
#/etc/postfix/greylisting_skip_senders <> OK postmaster OK |
В данном файле мы описываем хосты, которые мы хотим исключить из грейлистинга
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
#/etc/postfix/greylisting_skip_hosts # yahooGroups: 69.147.64.0/23 OK 69.147.102.0/23 OK 66.94.237.0/24 OK 66.163.168.0/23 OK 66.218.66.0/23 OK 209.73.160.0/24 OK 209.73.164.0/24 OK 209.131.38.0/24 OK 98.136.45.0/24 OK 67.195.134.0/24 OK # rambler.ru: 81.19.66.0/23 OK 81.19.88.0/24 OK # mail.ru: 194.67.23.0/24 OK 194.67.57.0/24 OK # yandex.ru: 77.88.32.0/24 OK 87.250.248.0/24 OK 213.180.200.0/24 OK 213.180.223.0/24 OK 77.88.47.0/24 OK 77.88.60.0/23 OK # pochta.ru: 81.211.64.0/24 OK 82.204.219.0/24 OK # aha.ru/go.ru: 195.2.83.0/24 OK # kyivstar.net: 193.41.60.22 OK # Hotmail: 65.54.246.0/24 OK # Google: 209.85.132.130/32 OK 209.85.132.184/29 OK 209.85.132.241/32 OK 209.85.132.244/32 OK 209.85.132.250/32 OK 212.159.30.228/32 OK 64.233.162.176/28 OK 64.233.162.224/27 OK 64.233.182.167/32 OK 64.233.184.130/32 OK 64.233.184.224/27 OK 66.249.82.224/28 OK 66.249.92.171/32 OK 66.249.93.114/32 OK 66.249.93.27/32 OK 216.239.32.0/19 OK 64.233.160.0/19 OK 66.249.80.0/20 OK 72.14.192.0/18 OK 209.85.128.0/17 OK 66.102.0.0/20 OK 74.125.0.0/16 OK 64.18.0.0/20 OK 207.126.144.0/20 OK |
В данном файле мы описываем собственно саму политику - при отсутствии записи в обратной зоне, клиент будет награжден грейлистингом. greylisting - это пользоватлеьский класс, который определяется в файле main.cf.
1 2 3 4 |
#/etc/postfix/no_ptr.pcre /^unknown$/ greylisting |
В данном файле мы описываем политику - при использовании литеральной формы, клиент будет награжден грейлистингом.
1 2 3 4 |
#/etc/postfix/ip_literal.pcre /^\[[[:digit:]\.]*\]$/ greylisting |
1 2 3 4 |
<span class="cli_prompt"># </span><span class="cli_command">postmap /etc/postfix/greylisting_skip_senders</span> <span class="cli_prompt"># </span><span class="cli_command">postfix reload</span> <span class="cli_output">postfix/postfix-script: refreshing the Postfix mail system</span> |
1 2 3 4 5 6 7 |
#/etc/postfix/main.cf smtpd_sender_restrictions = ... check_sender_mx_access cidr:/etc/postfix/sender_mx_access ... |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#/etc/postfix/sender_mx_access 255.255.255.255 550 MX in world broadcast address 0.0.0.0/8 550 MX in block that refer to source hosts on "this" network 10.0.0.0/8 550 MX in RFC 1918 private network 127.0.0.0/8 550 MX in loopback network 169.254.0.0/16 550 MX in link local network 172.16.0.0/12 550 MX in RFC 1918 private network 192.0.2.0/24 550 MX in TEST-NET network 192.168.0.0/16 550 MX in RFC 1918 private network 198.18.0.0/15 550 MX in allocated for use in benchmark tests. RFC 2554 224.0.0.0/4 550 MX in class D multicast network 240.0.0.0/5 550 MX in class E reserved network 248.0.0.0/5 550 MX in reserved network |
Тогда при попытке отправить отправить вам письмо в лог-файле будет следующее
1 2 3 4 |
<span class="cli_output">Sep 27 11:31:44 mail postfix/smtpd[66465]: NOQUEUE: reject: RCPT from aft50.internetdsl.tpnet.pl[83.16.149.50]: </span> <span class="cli_output">550 5.7.1 <123@hal.com>: Sender address rejected: MX in loopback network; from=<123@hal.com> to=<iamjustsendingthisleter@sys-adm.org.ua> </span> <span class="cli_output">proto=SMTP helo=<aft50.internetdsl.tpnet.pl></span> |
А теперь давайте посмотрим что же не понравилось postfix в этом клиенте
1 2 3 4 5 6 |
<span class="cli_prompt"># </span><span class="cli_command">host -t mx hal.com</span> <span class="cli_output">hal.com mail is handled by 10 localhost.hal.com.</span> <span class="cli_prompt"># </span><span class="cli_command">host localhost.hal.com</span> <span class="cli_output">localhost.hal.com has address 127.0.0.1</span> |
Теперь думаю все стало понятно, врядли стоит принимать почту от клиентов у которых MX запись указывает на 127.0.0.1
1 2 3 4 |
#/etc/postfix/main.cf smtpd_sender_restrictions = check_sender_access hash:/etc/postfix/sender_access |
1 2 3 4 5 6 |
#/etc/postfix/sender_access domain.ua REJECT # Заблокировать всю почту с домена и поддоменов spamer@ REJECT # Заблокировать пользователя с любого домена <a href="mailto:spamer@domain.ua">spamer@domain.ua</a> REJECT NO SPAM # Заблокировать email. |
1 2 3 4 |
<span class="cli_prompt"># </span><span class="cli_command">postmap /etc/postfix/sender_access</span> <span class="cli_prompt"># </span><span class="cli_command">postfix reload</span> <span class="cli_output">postfix/postfix-script: refreshing the Postfix mail system</span> |
1 2 3 4 |
#/etc/postfix/main.cf header_checks = pcre:/etc/postfix/header_checks |
1 2 3 4 |
#/etc/postfix/header_checks /^(.*)name=\"(.*)\.(exe|bat|cmd|mp3)\"$/ REJECT Attachment type not allowed. File "$2" has unacceptable extension: "$3" |
Тогда при попытке отправить письмо с вложением exe/bat/cmd/mp3 в лог-файле будет следующее
1 2 3 4 |
<span class="cli_output">Sep 27 18:27:31 centos5 postfix/cleanup[2473]: 5F60118058D: message-id=<123842027.20090927184358@sys-adm.org.ua></span> <span class="cli_output">Sep 27 18:27:31 centos5 postfix/cleanup[2473]: 5F60118058D: reject: header Content-Type: APPLICATION/X-MSDOWNLOAD;? name="test.exe" from alex.sys-adm.org.ua[xxx.xxx.xxx.xxx]; </span> <span class="cli_output">from=<alex@sys-adm.org.ua> to=<root@sys-adm.org.ua> proto=ESMTP helo=<alex.sys-adm.org.ua>: 5.7.1 Attachment type not allowed. File "test.exe" has unacceptable extension: "exe"</span> |
Например у нас есть следующий алиас
1 2 3 4 |
# /etc/aliases info: user1, user2 |
Если человек отправит письмо на info и user1, то user1 получит две копии письма. К сожалению архитектура postfix на данный момент не позволяет избежать данной проблемы
Для этого достаточно задать следующие параметры в main.cf
1 2 3 4 5 |
#/etc/postfix/main.cf luser_relay = info local_recipient_maps = |
При такой настройке вся почта для не существующих пользователей будет перенаправляться пользователю info
Особенности работы данной функции:
-
будет работать только для системных пользователей и транспорта local
-
параметр local_recipient_maps нужно оставить пустым, а не комментировать, т.к. в случае комментирования у него будет значение по умолчанию
Чтобы узнать значение по умолчанию, необходимо выполнить следующую команду
1 2 3 |
<span class="cli_prompt"># </span><span class="cli_command">postconf -d local_recipient_maps</span> <span class="cli_output">local_recipient_maps = proxy:unix:passwd.byname $alias_maps</span> |
Для включения данной возможности необходимо задать параметр delay_warning_time
1 2 3 4 |
#/etc/postfix/main.cf delay_warning_time = 3h |
При такой настройке, уведомление будет отправляться через 3 часа
Существует два способа решения этой задачи: внесения изменений в main.cf или master.cf
1 2 3 4 |
#/etc/postfix/main.cf inet_interfaces = xxx.xxx.xxx.xxx, 127.0.0.1 |
1 2 3 4 5 6 |
#/etc/postfix/master.cf xxx.xxx.xxx.xxx:smtp inet n - n - - smtpd 127.0.0.1:smtp inet n - n - - smtpd |
1 2 3 4 |
<span class="cli_prompt"># </span><span class="cli_command">service postfix restart</span> <span class="cli_output">Shutting down postfix: [ OK ]</span> <span class="cli_output">Starting postfix: [ OK ]</span> |
Для этого достаточно заменить строку в master.cf
1 2 |
smtp inet n - n - - smtpd |
на следующую
1 2 |
2525 inet n - n - - smtpd |
И перезапустить postfix. После этого можно проверить изменения
1 2 3 |
<span class="cli_prompt"># </span><span class="cli_command">netstat -an | grep 2525</span> <span class="cli_output">tcp 0 0 0.0.0.0:2525 0.0.0.0:* LISTEN</span> |
Для этого достаточно выполнить следующую команду и после приветствия обязательно ввести ESMTP команду ehlo <host_name>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<span class="cli_prompt"># </span><span class="cli_command">telnet mail.sys-adm.org.ua 25</span> <span class="cli_output">Trying 213.85.107.157...</span> <span class="cli_output">Connected to mail.sys-adm.org.ua (213.85.107.157).</span> <span class="cli_output">Escape character is '^]'.</span> <span class="cli_output">220 mail.sys-adm.org.ua ESMTP</span> <span class="cli_output">ehlo mail.sys-adm.org.ua</span> <span class="cli_output">250-mail.sys-adm.org.ua</span> <span class="cli_output">250-PIPELINING</span> <span class="cli_output">250-SIZE 5242880</span> <span class="cli_output">250-ETRN</span> <span class="cli_output">250-STARTTLS</span> <span class="cli_output">250-AUTH PLAIN LOGIN</span> <span class="cli_output">250-ENHANCEDSTATUSCODES</span> <span class="cli_output">250-8BITMIME</span> <span class="cli_output">250 DSN</span> <span class="cli_output">quit</span> <span class="cli_output">221 2.0.0 Bye</span> <span class="cli_output">Connection closed by foreign host.</span> |
Строка 250-AUTH PLAIN LOGIN говорит о том, что данный сервер поддерживает два метода аутентификации - PLAIN и LOGIN.
Также из данного вывода мы можем получить следующую интересную информацию:
-
250-SIZE 5242880 - максимальный размер письма ~5 Mb.
-
250 DSN - данный сервер поддерживает DSN (Delivery Status Notifications)
-
250-STARTTLS - включена поддержка SSL/TLS для передачи писем с помощью шифрования
Для этого достаточно выполнить следующую команду
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<span class="cli_prompt"># </span><span class="cli_command">postconf -m</span> <span class="cli_output">btree</span> <span class="cli_output">cidr</span> <span class="cli_output">environ</span> <span class="cli_output">hash</span> <span class="cli_output">ldap</span> <span class="cli_output">nis</span> <span class="cli_output">pcre</span> <span class="cli_output">proxy</span> <span class="cli_output">regexp</span> <span class="cli_output">static</span> <span class="cli_output">unix</span> |
Как видно из вывода данная сборка postfix не поддерживает MySQL. Так же можно проверить с какими внешними библиотеками собран сам postfix
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<span class="cli_prompt"># </span><span class="cli_command">ldd /usr/libexec/postfix/master</span> <span class="cli_output"> linux-gate.so.1 => (0x006f1000)</span> <span class="cli_output"> libldap-2.3.so.0 => /usr/lib/libldap-2.3.so.0 (0x00c9b000)</span> <span class="cli_output"> liblber-2.3.so.0 => /usr/lib/liblber-2.3.so.0 (0x007b5000)</span> <span class="cli_output"> libpcre.so.0 => /lib/libpcre.so.0 (0x005b4000)</span> <span class="cli_output"> libsasl2.so.2 => /usr/lib/libsasl2.so.2 (0x001a6000)</span> <span class="cli_output"> libssl.so.6 => /lib/libssl.so.6 (0x0062f000)</span> <span class="cli_output"> libcrypto.so.6 => /lib/libcrypto.so.6 (0x001ce000)</span> <span class="cli_output"> libdl.so.2 => /lib/libdl.so.2 (0x00731000)</span> <span class="cli_output"> libz.so.1 => /usr/lib/libz.so.1 (0x00110000)</span> <span class="cli_output"> libdb-4.3.so => /lib/libdb-4.3.so (0x0030e000)</span> <span class="cli_output"> libnsl.so.1 => /lib/libnsl.so.1 (0x00d4b000)</span> <span class="cli_output"> libresolv.so.2 => /lib/libresolv.so.2 (0x00da9000)</span> <span class="cli_output"> libc.so.6 => /lib/libc.so.6 (0x0042b000)</span> <span class="cli_output"> libcrypt.so.1 => /lib/libcrypt.so.1 (0x00123000)</span> <span class="cli_output"> libgssapi_krb5.so.2 => /usr/lib/libgssapi_krb5.so.2 (0x00155000)</span> <span class="cli_output"> libkrb5.so.3 => /usr/lib/libkrb5.so.3 (0x007c3000)</span> <span class="cli_output"> libcom_err.so.2 => /lib/libcom_err.so.2 (0x00183000)</span> <span class="cli_output"> libk5crypto.so.3 => /usr/lib/libk5crypto.so.3 (0x0056f000)</span> <span class="cli_output"> /lib/ld-linux.so.2 (0x0040f000)</span> <span class="cli_output"> libpthread.so.0 => /lib/libpthread.so.0 (0x00a33000)</span> <span class="cli_output"> libkrb5support.so.0 => /usr/lib/libkrb5support.so.0 (0x00186000)</span> <span class="cli_output"> libkeyutils.so.1 => /lib/libkeyutils.so.1 (0x0018f000)</span> <span class="cli_output"> libselinux.so.1 => /lib/libselinux.so.1 (0x00595000)</span> <span class="cli_output"> libsepol.so.1 => /lib/libsepol.so.1 (0x005d1000)</span> |
1 2 3 4 5 |
#/etc/postfix/main.cf banner_if1 = mx1.sys-adm.org.ua ESMTP banner_if2 = mx2.sys-adm.org.ua ESMTP |
1 2 3 4 5 6 7 8 |
#/etc/postfix/master.cf xxx.xxx.xxx.xxx:smtp inet n - n - - smtpd -o smtpd_banner=$banner_if1 yyy.yyy.yyy.yyy:smtp inet n - n - - smtpd -o smtpd_banner=$banner_if2 |
Где xxx.xxx.xxx.xxx и yyy.yyy.yyy.yyy ip адрес первого и второго интерфейса соотвественно. Переменные banner_if1 и banner_if2 мы определяли в файле main.cf специально, так как в файле master.cf не допускаются пробелы в значениях параметров
Проверяем
1 2 3 4 5 6 7 8 9 |
<span class="cli_prompt"># </span><span class="cli_command">telnet xxx.xxx.xxx.xxx 25</span> <span class="cli_output">Trying xxx.xxx.xxx.xxx...</span> <span class="cli_output">Connected to xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx).</span> <span class="cli_output">Escape character is '^]'.</span> <span class="cli_output">220 mx1.sys-adm.org.ua ESMTP</span> <span class="cli_output">quit</span> <span class="cli_output">221 2.0.0 Bye</span> <span class="cli_output">Connection closed by foreign host.</span> |
1 2 3 4 5 6 7 8 9 |
<span class="cli_prompt"># </span><span class="cli_command">telnet yyy.yyy.yyy.yyy 25</span> <span class="cli_output">Trying yyy.yyy.yyy.yyy...</span> <span class="cli_output">Connected to yyy.yyy.yyy.yyy (yyy.yyy.yyy.yyy).</span> <span class="cli_output">Escape character is '^]'.</span> <span class="cli_output">220 mx2.sys-adm.org.ua ESMTP</span> <span class="cli_output">quit</span> <span class="cli_output">221 2.0.0 Bye</span> <span class="cli_output">Connection closed by foreign host.</span> |
1 2 3 4 |
#/etc/postfix/main.cf sender_bcc_maps = hash:/etc/postfix/sender_bcc_maps |
1 2 3 4 |
#/etc/postfix/sender_bcc_maps @sys-adm.org.ua <a href="mailto:sender_bcc@sys-adm.org.ua">sender_bcc@sys-adm.org.ua</a> |
1 2 3 4 |
<span class="cli_prompt"># </span><span class="cli_command">postmap /etc/postfix/sender_bcc_maps</span> <span class="cli_prompt"># </span><span class="cli_command">postfix reload</span> <span class="cli_output">postfix/postfix-script: refreshing the Postfix mail system</span> |
При такой настройке копии всех исходящих писем будут дублироваться на ящик sender_bcc@sys-adm.org.ua
1 2 3 |
/etc/postfix/main.cf recipient_bcc_maps = hash:$config_directory/recipient_bcc_maps |
1 2 3 |
$config_directory/recipient_bcc_maps @sys-adm.org.ua <a href="mailto:recipient_bcc@sys-adm.org.ua">recipient_bcc@sys-adm.org.ua</a> |
1 2 3 4 |
<span class="cli_prompt"># </span><span class="cli_command">postmap /etc/postfix/recipient_bcc_maps</span> <span class="cli_prompt"># </span><span class="cli_command">postfix reload</span> <span class="cli_output">postfix/postfix-script: refreshing the Postfix mail system</span> |
При такой настройке копии всех входящих писем будут дублироваться на ящик recipient_bcc@sys-adm.org.ua
1 2 3 4 |
#/etc/postfix/main.cf always_bcc = <a href="mailto:all@sys-adm.org.ua">all@sys-adm.org.ua</a> |
При такой настройке копии всех писем будут дублироваться на ящик all@sys-adm.org.ua
--------------------------------------------------------------------------------------------------------------------------------
1 |
<strong>Запрещение приема почты с определенных email в postfix (postfix blocking mail )</strong> |
/etc/postfix/main.cf:
smtpd_sender_restrictions = hash:/etc/postfix/access
/etc/postfix/access
spamer@domain REJECT # Заблокировать емайл.
domain REJECT # Заблокировать всю почту с домена и поддоменов
spamer@ REJECT # Заблокировать пользователя с любого домена
spamer@domain 550 NO SPAM # Выдать сообщение
192.168.1.1 REJECT # Не принимать почту с IP (или подсети)
# postmap /etc/postfix/access
# postfix reload
Перенаправление почты с внутренного адреса на внешний
В файл main.cf
recipient_bcc_maps = hash:/etc/postfix/recipient_bcc
В файл recipient_bcc
ivan@nashdomen.ru vanya@mail.ru
поле чего
postmap /etc/postfix/recipient_bcc
postfix reload