Отправляем первое сообщение
Чтобы сервер мог отправить сообщение, необходимо, чтобы почтовая система соответствовала минимальным требованиям большинства антиспам проверок:
- Создана A-запись для имени сервера в DNS.
- Создана PTR-запись для A-записи.
Создание А-записи
А-запись — это базовая запись в системе доменных имен, которая указывает на соответствие между удобочитаемым именем и IP-адресом. Для ее создания заходим в панель управления доменной зоной и пользуемся встроенным инструментом.
Ниже представлено несколько различных примеров, как выглядит правильная настройка.
На REG.RU:
В Timeweb:
В RU center (nic.ru):
На собственном DNS-сервере bind:
mailer IN A 156.91.13.102
* обратите внимание, что прописаны различные IP-адреса. В вашем случае будет свой адрес
Создание PTR-записи
Данные записи могут создавать только держатели IP-адресов, то есть, Интернет-провайдеры. Для того, чтобы создать такую запись, необходимо написать письмо поставщику Интернета, примерно, следующего содержания:
Здравствуйте, мой номер договора XXXXXXXX.
Прошу создать PTR-запись mailer.dmosk.ru для IP 90.156.242.197.
Некоторые Интернет провайдеры позволяют создавать подобные заявки через личный кабинет.
Если сервер арендован, то необходимо создать соответствующий тикет поставщику услуги по аренде сервера.
Проверяем отправку сообщений
Прежде чем отправлять сообщения, необходимо подождать от 4 до 8 часов. Как правило, этого достаточно, чтобы созданные ранее записи стали доступны всем промежуточным серверам DNS.
Для отправки сообщений из командной строки CentOS сначала необходимо установить следующую утилиту:
yum install mailx
После можно отправлять первое сообщение:
echo «Test text» | mail -s «Test title» -r [email protected] [email protected]
* где Test text — текст сообщения, Test title — тема, [email protected] — отправитель, [email protected] — получатель.
Лучше отправить несколько сообщений на разные почтовые системы, особенно распространенные:
- mail.ru (он же bk.ru, list.ru);
- yandex.ru;
- gmail.com;
- rambler.ru.
Если сообщения вовсе не отправляются, открываем на просмотр следующий log-файл и изучаем, что именно послужило причиной проблемы:
tail /var/log/maillog
Отсутствие вышеописанных записей, кстати, также могут повлечь отказ почтовых систем принимать Ваши письма. В таком случае, мы увидит в логах, примерно, такой текст:
postfix/smtp: BED8CC0000C3: to=<[email protected]>, relay=mx1.masterhost.ru:25, delay=0.54, delays=0.26/0.1/0.12/0.06, dsn=5.0.0, status=bounced (host mx1.masterhost.ru said: 550-Verification failed for <[email protected]> 550-Unrouteable address 550 Sender verify failed (in reply to MAIL FROM command))
Количество сообщений и одновременных подключений
В конфигурационном файле добавляем такие строки:
anvil_rate_time_unit = 60s
smtpd_client_message_rate_limit = 200
smtpd_client_recipient_rate_limit = 60
smtpd_client_connection_count_limit = 20
smtpd_client_connection_rate_limit = 40
* в данном примере мы установили следующие ограничения на количество отправляемых писем:
- anvil_rate_time_unit — параметр расчетного времени. Именно от него будут вести отчет другие значения. По умолчанию также равен 60s.
- smtpd_client_message_rate_limit — сколько клиенту можно отправлять сообщений за anvil_rate_time_unit. По умолчанию 0, то есть, ограничений нет.
- smtpd_client_recipient_rate_limit — максимальное количество получателей за anvil_rate_time_unit. По умолчанию 0, то есть, ограничений нет.
- smtpd_client_connection_count_limit — количество одновременно разрешенных подключений для клиента. По умолчанию 50.
- smtpd_client_connection_rate_limit — максимальное количество коннектов, разрешенных для клиента за anvil_rate_time_unit. По умолчанию 0, то есть, ограничений нет.
Настройка Postfix
Открываем конфигурационный файл postfix:
vi /etc/postfix/main.cf
Добавим следующие строки:
relayhost =
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/private/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_sasl_type = cyrus
smtp_sasl_mechanism_filter = login
smtp_sender_dependent_authentication = yes
sender_dependent_relayhost_maps = hash:/etc/postfix/private/sender_relay
smtp_tls_CAfile = /etc/postfix/ca.pem
smtp_use_tls = yes
* где:
- relayhost — сервер, через который нужно отправлять почту. Мы будем использовать отдельные правила, поэтому оставляем данный параметр с пустым значением.
- smtp_sasl_auth_enable — включение аутентификации на стороне клиента.
- smtp_sasl_password_maps — указывает на файл, в котором хранится база связок логин/пароль.
- smtp_sasl_security_options — опции SASL. noanonymous указывает на запрет анонимной аутентификации.
- smtp_sasl_type — задает плагин SASL для аутентификации.
- smtp_sasl_mechanism_filter — перечисляет механизмы проверки пользователя и пароля.
- smtp_sender_dependent_authentication — включает зависящую от отправителя аутентификацию, отключает кэширование SMTP-соединения.
- sender_dependent_relayhost_maps — указание на список адресов и почтовых серверов, через которые нужно отправлять письма на эти адреса.
- smtp_tls_CAfile — файл с сертификатом Яндекса.
- smtp_use_tls — указывает, использовать ли TLS для SMTP.
Создаем каталог для конфигов:
mkdir /etc/postfix/private
Создаем файл с правилами пересылки сообщений:
vi /etc/postfix/private/sender_relay
@yandex.ru smtp.yandex.ru
* в данном примере мы все сообщения, отправляемые от домена yandex.ru переправляем через сервер smtp.yandex.ru.
Создаем файл с настройкой привязки логинов и паролей:
vi /etc/postfix/private/sasl_passwd
[email protected] [email protected]:password1
[email protected] [email protected]:password2
* в данном примере мы создаем 2 учетные записи для аутентификации на яндексе. При отправке писем от [email protected] необходимо авторизоваться на сервере яндекса от этой же учетной записи с паролем password1. Соответственно, при отправке письма от [email protected] — с паролем password2.
Создаем карты для данных файлов:
postmap /etc/postfix/private/{sasl_passwd,sender_relay}
Получаем сертификат от Яндекса, для этого выполняем запрос:
openssl s_client -starttls smtp -crlf -connect smtp.yandex.ru:25
… на экран будет выведена различная информация — нам нужна вся, что заключена между ——BEGIN CERTIFICATE—— и ——END CERTIFICATE——. Копируем ее и создаем файл сертификата:
vi /etc/postfix/ca.pem
——BEGIN CERTIFICATE——
MIIGazCCBVOgAwIBAgIQcUU9mJXW4OUs5Gf0JfLtsjANBgkqhkiG9w0BAQsFADBf
…
nRG0DfdqYIuPGApFORYe
——END CERTIFICATE——
Перезапускаем Postfix:
systemctl restart postfix
Обратите внимание на 2 момента:
1) так как яндекс может обслуживать почту для любых доменов, не обязательно должен использоваться домен yandex.ru.
2) отправка сообщения должна идти строго от того пользователя, под которым идет авторизация на yandex. В противном случае, подключение не пройдет проверку и завершится ошибкой
Настройка Postfix
Если Postfix не установлен, выполняем команду:
yum install postfix
Открываем на редактирование конфигурационный файл main.cf:
vi /etc/postfix/main.cf
Снимаем комментарий с этой строчки:
myorigin = $mydomain
* параметр myorigin определяет домен, который будет подставляться отправителю, если он не указан явно.
Добавляем следующую строчку:
smtp_generic_maps = hash:/etc/postfix/generic_map
Теперь открываем файл generic_map и добавляем в него следующее:
vi /etc/postfix/generic_map
@dmosk.ru [email protected]
* данной настройкой мы будем перестраховываться — если программа отправки сообщений не подставит поле FROM будет подставлено [email protected].
Чтобы применить настройки, создаем карту:
postmap /etc/postfix/generic_map
И перезапускаем Postfix:
systemctl restart postfix
Проверяем, что постфикс правильно определяет наши домен и имя компьютера:
postconf myhostname
postconf mydomain
Мы должны получить правильные значения — в моем случае, соответственно, mailer.dmosk.ru и dmosk.ru. Эти данные берутся из локальных настроек системы. Но если, по каким-то причинам, системные имена должны отличаться, задайте жестко имя почтового сервера и домен в настройках postfix:
myhostname = mailer.dmosk.ru
mydomain = dmosk.ru
* после необходимо перезапустить почтовый сервер постфикс.
Пример
Пример для вставки в файл
main.cf
disable_vrfy_command = yes
show_user_unknown_table_name = no
smtpd_helo_required = yes
smtpd_helo_restrictions=
check_helo_access hash:/etc/postfix/helo_restrictions
permit_mynetworks,
permit_sasl_authenticated,
reject_invalid_hostname,
reject_non_fqdn_hostname,
reject_invalid_helo_hostname,
reject_unknown_helo_hostname
smtpd_sender_restrictions=
reject_non_fqdn_sender,
reject_unknown_sender_domain,
reject_unlisted_sender,
permit_mynetworks,
permit_sasl_authenticated
smtpd_recipient_restrictions=
check_sender_access hash:/etc/postfix/sender_access
reject_non_fqdn_recipient,
reject_unknown_recipient_domain,
reject_unlisted_recipient,
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination
reject_invalid_hostname
smtpd_data_restrictions=
reject_unauth_pipelining,
reject_multi_recipient_bounce
smtpd_etrn_restrictions=
permit_mynetworks,
permit_sasl_authenticated,
reject
message_size_limit = 51200000
1 |
disable_vrfy_command=yes show_user_unknown_table_name=no smtpd_helo_required=yes smtpd_helo_restrictions= check_helo_access hashetcpostfixhelo_restrictions permit_mynetworks, permit_sasl_authenticated, reject_invalid_hostname, reject_non_fqdn_hostname, reject_invalid_helo_hostname,
reject_unknown_helo_hostname smtpd_sender_restrictions= reject_non_fqdn_sender, reject_unknown_sender_domain, reject_unlisted_sender, permit_mynetworks,
permit_sasl_authenticated smtpd_recipient_restrictions= check_sender_access hashetcpostfixsender_access reject_non_fqdn_recipient, reject_unknown_recipient_domain, reject_unlisted_recipient, permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
reject_invalid_hostname smtpd_data_restrictions= reject_unauth_pipelining,
reject_multi_recipient_bounce smtpd_etrn_restrictions= permit_mynetworks, permit_sasl_authenticated, reject message_size_limit=51200000 |
Таблицы:/etc/postfix/helo_restrictions
80.84.114.82 OK
mail.aqmh.ru OK
aqmh.ru OK
aqmhdc.aqmh.com OK
mailpn.ru REJECT
stmails.ru REJECT
5.63.152.144 REJECT
1 |
80.84.114.82OK mail.aqmh.ru OK aqmh.ru OK aqmhdc.aqmh.com OK mailpn.ru REJECT stmails.ru REJECT 5.63.152.144REJECT |
/etc/postfix/sender_access
80.84.114.82 OK
mail.aqmh.ru OK
aqmh.ru OK
aqmhdc.aqmh.com OK
mailpn.ru REJECT
stmails.ru REJECT
5.63.152.144 REJECT
@mailpn.ru REJECT
1 |
80.84.114.82OK mail.aqmh.ru OK aqmh.ru OK aqmhdc.aqmh.com OK mailpn.ru REJECT stmails.ru REJECT 5.63.152.144REJECT @mailpn.ru REJECT |
Скрипт для компиляции таблиц:/etc/postfix/!update_db.sh
<em>#!/bin/bash</em>
postmap helo_restrictions sender_access transport
1 |
<em>#!/bin/bash</em> postmap helo_restrictions sender_access transport |
Установка Postfix
На этом шаге мы выполним установку Postfix. Быстрее всего будет установить пакет , включающий Postfix и несколько дополнительных программ, которые можно использовать для тестирования отправки электронной почты.
Вначале обновите базу данных пакетов:
Затем выполните установку Postfix, запустив следующую команду:
Перед окончанием установки вы увидите окно настройки конфигурации Postfix:
По умолчанию используетя опция (сайт). Это наиболее подходящая опция для нашего случая, поэтому нажмите , а затем нажмите . Если вы увидите только текст описания, нажмите для выбора пункта , а затем нажмите .
Если опция не отображается автоматически, запустите следующую команду:
После этого откроется еще один диалог настройки конфигурации System mail name (имя системной почты):
Имя системной почты System mail name должно совпадать с именем, которое вы присвоили своему серверу при его создании. После завершения настройки нажмите , а затем нажмите .
Мы установили Postfix и готовы приступить к настройке.
Размер отправляемого сообщения
Открываем конфигурационный файл, находим и правим следующее (если строки нет, создаем):
message_size_limit = 73400320
* в данном примере установлено ограничение на размер письма в 70 мб.
Необходимо, чтобы данный размер не превышал размер почтового ящика (mailbox_size_limit и virtual_mailbox_limit, которые по умолчанию имеют значения 51200000 или 50 мб), в противном случае, в логе мы увидим ошибку fatal: main.cf configuration error: mailbox_size_limit is smaller than message_size_limit.
Для этого можно либо задать значения равные (или больше) message_size_limit:
mailbox_size_limit = 73400320
virtual_mailbox_limit = 73400320
… либо отключить ограничения:
mailbox_size_limit = 0
virtual_mailbox_limit = 0
Настройка аутентификации на Postfix
Аутентификация на postfix будет выполняться методом dovecot. Для этого устанавливаем его. Заодно, устанавливаем и postfix (на случай, если его нет еще в системе). В зависимости от используемой операционной системы используем разные команды.
а) если используем Ubuntu / Debian:
apt-get update
apt-get install postfix dovecot-imapd dovecot-pop3d
б) если используем CentOS / Red Hat:
yum install postfix dovecot
После установки пакетов, разрешаем автозапуск dovecot и postfix:
systemctl enable postfix dovecot
Открываем на редактирование конфигурационный файл нашего MTA Postfix:
vi /etc/postfix/main.cf
Добавляем строки (или меняем значения):
smtpd_sasl_type = dovecot
smtpd_sasl_auth_enable = yes
smtpd_sasl_path = private/auth
smtpd_relay_restrictions =
permit_mynetworks
permit_sasl_authenticated
reject_unauth_destination
* где:
- smtpd_sasl_type — тип плагина, который используется для SASL-аутентификации. Командой postconf -a мы можем получить список механизмов аутентификации, которые поддерживаются почтовой системой.
- smtpd_sasl_auth_enable — разрешает или запрещает аутентификацию по механизму SASL.
- smtpd_sasl_path — путь до файла для обмена аутентификационной информацией. Используется для взаимодействия нескольких систем — в нашем примере Postfix + Dovecot.
-
smtpd_relay_restrictions — правила разрешения и запрета использования MTA при пересылке. В нашем случае:
- permit_mynetworks — разрешить отправку с компьютеров, чьи IP-адреса соответствуют настройке mynetworks.
- permit_sasl_authenticated — разрешить отправку писем тем, кто прошел авторизацию.
- reject_unauth_destination — запретить всем, кто не прошел проверку подлинности.
Проверяем корректность настройки:
postconf > /dev/null
Если команда не вернула ошибок, перезапускаем Postfix:
systemctl restart postfix
Переходим к настройке dovecot — открываем файл:
vi /etc/dovecot/conf.d/10-master.conf
… и приводим опцию service auth к следующему виду:
service auth {
…
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
…
}
* если соответствующей секции unix_listener нет, то ее нужно создать
Обратите внимание, что для обмена аутентификационными данными мы применяем файл /var/spool/postfix/private/auth, который в конфигурационном файле postfix был указан, как private/auth
Отключаем требование ssl для аутентификации (на текущем этапе нам это не нужно):
vi /etc/dovecot/conf.d/10-ssl.conf
Проверяем, чтобы значение ssl не было required:
ssl = yes
* нас устроит оба варианта — yes или no.
Настройки аутентификации приводим к следующему виду:
vi /etc/dovecot/conf.d/10-auth.conf
auth_mechanisms = plain login
* данные механизмы позволяют передачу данных в открытом виде.
В этом же файле проверяем, что снят комментарий со следующей строки:
!include auth-system.conf.ext
Проверяем корректность настройки dovecot:
doveconf > /dev/null
Если команда ничего не вернула, перезапускаем сервис:
systemctl restart dovecot
В качестве логина и пароля можно использовать любую системную учетную запись. Создадим ее для теста:
useradd smtptest
passwd smtptest
Мы настроили простую аутентификацию на сервере SMTP. Для проверки можно воспользоваться любым почтовым клиентом. Пример настройки thunderbird:
Пробуем отправить письмо. Отправка должна потребовать ввода логина и пароль — используем аутентификационные данные для записи, созданной выше.
Мы завершили настройку аутнтификации на postfix при отправке письма. Добавим проверку данных через LDAP.
Выбор сервера отправки в зависимости от адреса получателя
Итак, в sender_bcc_map всю локальную почту я оставляю локально, просто указывая адрес отправителя (каждый сайт шлет почту от своего ящика) и локального пользователя, к которому она будет складываться. Если у вас много сайтов, то для каждого сайта будет свой локальный пользователь. Чаще всего это так, потому что разные сайты лучше всего запускать под разными пользователями, от которых работает веб сервер. Файл с записями для sender_bcc_map выглядит так:
[email protected] user1 [email protected] user2
Если у вас использует разные ящики для отправки, то можете настроить правило для всего домена сразу:
*@site1.ru user1 *@site2.ru user2
Дальше вам нужно выяснить, как выглядит полностью адрес домена для локальной доставки почты. Это имя задается в параметре mydomain в конфиге postfix main.cf. Допустим, там указано имя сервера — websrv.site.ru. Это не принципиально, в нашем случае там можно написать все, что угодно, но лучше использовать полное доменное имя (fqdn) самого веб сервера, которое указано в DNS записи типа А.
Теперь создаем файл transport_map, в котором пишем следующее:
websrv.site.ru local
Мы явно указываем, что всю почту для домена websrv.site.ru отправлять локально. Не забываем построить индексированный файл:
# postmap /etc/postfix/transport_map
Отправляемся в конфиг main.cf и добавляем туда параметр:
transport_maps = hash:/etc/postfix/transport_map
Перезапускаем postfix и проверяем работу. При отправке почтового сообщения от имени пользователя [email protected] там должно быть примерно следующее:
websrv postfix/smtpd: CC8F0602E205: client=localhost websrv postfix/cleanup: CC8F0602E205: message-id=<[email protected]> websrv postfix/qmgr: CC8F0602E205: from=<[email protected]>, size=874, nrcpt=2 (queue active) websrv postfix/smtpd: disconnect from localhost ehlo=1 mail=1 rcpt=1 data=1 quit=1 commands=5 websrv postfix/local: CC8F0602E205: to=<[email protected]>, relay=local, delay=0.07, delays=0.06/0.01/0/0.01, dsn=2.0.0, status=sent (delivered to mailbox) websrv postfix/smtp: CC8F0602E205: to=<[email protected]>, relay=smtp.yandex.ru:465, delay=0.93, delays=0.06/0.01/0.23/0.63, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued on myt6-9bdf92ffd111.qloud-c.yandex.net as 1608951012-xOUj8gBhbE-oCJSqvIX) websrv postfix/qmgr: CC8F0602E205: removed
[email protected] | адрес, с которого сайт ведет отправку почты |
[email protected] | итоговый локальный адрес, куда идет пересылка почты |
[email protected] | внешний почтовый адрес, куда идет отправление через внешний smtp |
smtp.yandex.ru | адрес внешнего smtp сервера |
Получили в итоге то, что хотели. Внешняя почта отправляется через внешний smtp адрес, указанный в relayhost, а копии сообщений падают в локальный ящик, который находится в файле /var/mail/user1. Конкретно мне это нужно было для отладки, чтобы понять, что именно отправляет сайт.
Если вам нужно пересылать почту не локально, а на какой-то свой почтовый сервер, который вы используете для сбора и анализа отправленной почты, то настройки у вас будут немного другие.
sender_bcc_maps:
*@site1.ru [email protected] *@site2.ru [email protected]
transport_map:
backupmail.ru relay::25
В данном случае backupmail.ru это отдельный почтовый домен и почтовый сервер для него для сбора всей вашей почты. Это не обязательно может быть собственноручно настроенный почтовый сервер. Можете использовать ящик в какой-то готовой службе почты. Но имейте ввиду, если это будет какой-то бесплатный сервис, то он вас быстро заблокирует, если будете слать слишком много почты на этот ящик.
Немного общих слов о настройках
Итак, Postfix установлен. Все настройки этого почтового сервера хранятся в . В этом каталоге Вас в первую очередь должен интересовать основной файл конфигурации, называющийся .
Теперь настала пора определиться с тем, какую функцию будет выполнять ваш почтовый сервер. Собственно, для каждого из обслуживаемых доменов тут есть два варианта:
- Либо Postfix будет использоваться только для пересылки почты на другой хост.
- Либо Postfix будет сохранять почту локально, возможно и не всю, передавая часть на другой хост.
Третьего собственно не дано. В настройках Postfix есть три основных группы параметров:
- Параметры локальной доставки.
- Параметры пересылки.
- Параметры «виртуальных доменов».
Как «правильный» почтовый сервер, Postfix занимается обработкой почты для указанных в конфигурации доменов. Так вот, каждый домен может обрабатываться ровно одним из указанных способов, то есть либо как конечный домен для почты, либо как домен для пересылки, либо как виртуальный домен.
Стандартная локальная доставка основана на системе авторизации и учёта пользователей вашей системы, что значительно уменьшает её гибкость, поэтому смысла её использовать обычно нет. Вместо этого следует использовать механизм «виртуальных доменов» для доставки почты в локальные почтовые ящики. Однако рассмотреть параметры, отвечающие за локальную доставку, всё же надо, ибо на них много что завязано.
Итак, откройте файл в вашем любимом текстовом редакторе. Записи этого файла имеют вид
параметр = значение
Комментарии можно добавлять, поставив в начало строки символ . Кстати, сразу хочу сказать, что параметры, имеющие несколько значений, можно записывать одним из следующих способов:
параметр = значение1 значение2 значение3
параметр = значение1, значение2, значение3
параметр = значение1 значение2 значение3
параметр = значение1, значение2, значение3
В третьем и четвёртом случае не забудьте про пробел в начале каждой строчки с параметром. В данном примере, рассмотрим конфигурирование по способу №3.
Кстати, после того, как вы задали значение какого-либо параметра, вы можете его использовать для задания значений другим параметрам. Вам просто нужно указать имя параметра с символом $ вначале в том месте, куда вы хотите подставить его значение. Например вот так:
mydomain = example.com mydestination = mail.$mydomain
Я по возможности буду стараться указывать явные значения для как можно меньшего количества параметров, дабы уменьшить возможность ошибки и упростить изменение параметров в дальнейшем.
Теперь немного конкретики.
Переадресация системной почты
На этом шаге мы настроим переадресацию электронной почты для пользователя , чтобы сгенерированные системой сообщения, отправляемые на этот адрес, пересылались на внешний адрес электронной почты.
Файл содержит список альтернативных имен получателей электронных писем. Откройте его для редактирования:
По умолчанию он выглядит так: /etc/aliases
Единственная содержащаяся в нем директива предписывает пересылать сгенерированные системой электронные сообщения пользователю .
Добавьте в конец файла следующую строку: /etc/aliases
Для вступления изменений в силу выполните следующую команду:
При запуске команды будет построена база данных псевдонимов, используемых командой . Эти псевдонимы берутся из файла конфигурации, который вы только что отредактировали.
Протестируйте отправку электронных писем пользователю с помощью следующей команды:
Письмо должно прийти на указанный вами почтовый ящик. Если его там нет, проверьте папку «Нежелательная почта».
На этом шаге мы настроили переадресацию сгенерированных системой сообщений на ваш адрес электронной почты. Теперь мы можем включить шифрование сообщений, чтобы все отправляемые вашим сервером электронные письма были защищены от модификации во время пересылки и считались легитимными.