Как настроить Sendmail или Postfix для работы с Postbox
Чтобы отправлять почту через Postbox, нужно настроить почтовый сервер. В этой статье я расскажу как настроить Sendmail или Postfix на Ubuntu 24.04 для отправки почты через Postbox по 587 порту.
Начнем с создания виртуальной машины на Ubuntu 24.04. Имя укажем demo
, а имя пользователя yc-user
. Они не
обязательно должны именно такими, но так проще будет ориентироваться в статье, понимая откуда взялись эти значения.
Подготовка
Еще нам потребуется настроенный адрес в Postbox и API-ключ для отправки почты.
Создадим API-ключ
- Создайте сервисный аккаунт. Он обязательно должен быть в том же каталоге, что и адрес в Postbox.
- Добавьте ему роль
postbox.sender
. - Создайте API-ключ и скопируйте его. Для большей безопасности, вы можете ограничить скоуп прав ключа той же ролью
postbox.sender
.
Убедитесь, что 587 порт открыт
Для этого выполните:
sudo ufw allow 587/tcp
Установка Sendmail
Для начала, установим sendmail
. Для этого возьмем виртуальную машину на Ubuntu 24.04.
Зайдем на нее и выполним следующие команды:
sudo apt-get update
sudo apt install sendmail
Установим пакет sendmail-cf
для настройки конфигурации:
sudo apt install sendmail-cf
Откройте файл sendmail.mc
(файл конфигурации макросов): Откройте файл sendmail.mc, обычно расположенный в /etc/mail/sendmail.mc
.
sudo vim /etc/mail/sendmail.mc
Во-первых, удалите или закомментируйте строки:
DAEMON_OPTIONS(`Family=inet, Name=MTA-v4, Port=smtp, Addr=127.0.0.1')dnl
DAEMON_OPTIONS(`Family=inet, Name=MSP-v4, Port=submission, M=Ea, Addr=127.0.0.1')dnl
Вместо них добавьте:
DAEMON_OPTIONS(`Port=smtp, Name=MTA')dnl
DAEMON_OPTIONS(`Port=submission, Name=MSA, M=Ea')dnl
Это позволит sendmail
слушать все доступные сетевые интерфейсы, а не только 127.0.0.1
.
И добавьте/измените следующие строки:
define(`confDOMAIN_NAME', `nikolaymatrosov.ru')dnl
MASQUERADE_AS(`nikolaymatrosov.ru')
FEATURE(`masquerade_envelope')dnl
define(`SMART_HOST', `postbox.cloud.yandex.net')dnl
define(`RELAY_MAILER_ARGS', `TCP $h 587')dnl
define(`ESMTP_MAILER_ARGS', `TCP $h 587')dnl
FEATURE(`authinfo', `hash -o /etc/mail/authinfo.db')dnl
TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
Не забудьте заменить nikolaymatrosov.ru
на ваш домен.
Вставьте эти строки перед строкой MAILER_DEFINITIONS
. Иначе при применении конфигурации вы получите ошибку вида:
ERROR: FEATURE() should be before MAILER()
Создайте или отредактируйте /etc/mail/authinfo
:
sudo vim /etc/mail/authinfo
И добавьте следующее содержимое:
AuthInfo:postbox.cloud.yandex.net "U:API_KEY" "P:AQVN***" "M:PLAIN"
Где:
postbox.cloud.yandex.net
адрес Postbox.- Имя пользователя
API_KEY
, как указано в документации - Пароль — API-ключ вида
AQVN***
, который вы создали ранее.
Сгенерируйте файл authinfo.db
, запустив следующую команду для хеширования информации об аутентификации:
sudo makemap hash /etc/mail/authinfo < /etc/mail/authinfo
Убедитесь, что файл authinfo.db
создан в /etc/mail
.
sudo ls /etc/mail/authinfo.db
Перестройте файл конфигурации sendmail.cf
, выполнив:
sudo -s
m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
exit
Перезапустите службу sendmail
, чтобы применить изменения:
sudo systemctl restart sendmail
Отправьте тестовое письмо. Для этого выполните:
vim email.txt
Вставьте в файл следующее содержимое:
From: "Sendmail test" <sendmail@nikolaymatrosov.ru>
To: reciver@example.com
Subject: Demo from Sendmail
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Hello,
This is a test email sent using Sendmail.
Не забудьте заменить адреса получателя и отправителя на свои.
Отправьте письмо:
sendmail -tv < email.txt
Если все настроено правильно, то письмо будет отправлено, а вы увидите примерно такой лог:
reciver@example.com... Connecting to [127.0.0.1] via relay...
220 nikolaymatrosov.ru ESMTP Sendmail 8.18.1/8.18.1/Debian-2; Wed, 29 Jan 2025 16:04:54 GMT; (No UCE/UBE) logging access from: localhost(OK)-localhost [127.0.0.1]
>>> EHLO demo.ru-central1a.internal
250-nikolaymatrosov.ru Hello localhost [127.0.0.1], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-EXPN
250-VERB
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
250-AUTH DIGEST-MD5 CRAM-MD5 LOGIN PLAIN
250-DELIVERBY
250 HELP
>>> VERB
250 2.0.0 Verbose mode
>>> MAIL From:<yc-user@demo.ru-central1a.internal> SIZE=216 AUTH=yc-user@demo.ru-central1a.internal
250 2.1.0 <yc-user@demo.ru-central1a.internal>... Sender ok
>>> RCPT To:<reciver@example.com>
>>> DATA
250 2.1.5 <reciver@example.com>... Recipient ok
354 End data with <CR><LF>.<CR><LF>
>>> .
050 <reciver@example.com>... Connecting to postbox.cloud.yandex.net. port 587 via relay...
050 220 postbox.cloud.yandex.net ESMTP Service Ready
050 >>> EHLO nikolaymatrosov.ru
050 250-Hello nikolaymatrosov.ru
050 250-PIPELINING
050 250-8BITMIME
050 250-ENHANCEDSTATUSCODES
050 250-CHUNKING
050 250-STARTTLS
050 250 SIZE 47185920
050 >>> STARTTLS
050 220 2.0.0 Ready to start TLS
050 >>> EHLO nikolaymatrosov.ru
050 250-Hello nikolaymatrosov.ru
050 250-PIPELINING
050 250-8BITMIME
050 250-ENHANCEDSTATUSCODES
050 250-CHUNKING
050 250-AUTH PLAIN LOGIN
050 250-REQUIRETLS
050 250 SIZE 47185920
050 >>> AUTH PLAIN **Redacted Auth Info**
050 235 2.0.0 Authentication succeeded
050 >>> MAIL From:<yc-user@nikolaymatrosov.ru> SIZE=457 AUTH=<>
050 250 2.0.0 Roger, accepting mail from <yc-user@nikolaymatrosov.ru>
050 >>> RCPT To:<reciver@example.com>
050 >>> DATA
050 250 2.0.0 I'll make sure <reciver@example.com> gets this
050 354 2.0.0 Go ahead. End your data with <CR><LF>.<CR><LF>
050 >>> .
050 250 2.6.0 OK: queued as D7EOO3VPNLYX.1GNHZHF3NRIRT@ingress2-sas
050 <reciver@example.com>... Sent (OK: queued as D7EOO3VPNLYX.1GNHZHF3NRIRT@ingress2-sas)
250 2.0.0 50TG4seh004179 Message accepted for delivery
reciver@example.com... Sent (50TG4seh004179 Message accepted for delivery)
Closing connection to [127.0.0.1]
>>> QUIT
221 2.0.0 nikolaymatrosov.ru closing connection
Если в логе вы видите что-то такое:
050 >>> MAIL From:<yc-user@demo.ru-central1a.internal> SIZE=476 AUTH=<>
050 550 5.4.1 identity not found RequestID: 66aa681c-5d82-4cbd-a09f-8ed67351b662
Это значит, что вы не настроили маскарадинг и сервер Postbox не может идентифицировать ваш домен.
Установка Postfix
Если вы используете Postfix, то вам нужно выполнить следующие шаги:
sudo apt install postfix mailutils
Выберите Internet Site
и укажите домен вашего сервера.
Откройте файл конфигурации Postfix:
sudo vim /etc/postfix/main.cf
И добавьте следующие строки:
relayhost = postbox.cloud.yandex.net:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = static:API_KEY:AQVN***
smtp_sasl_security_options = noanonymous
smtp_tls_security_level = encrypt
smtp_generic_maps = hash:/etc/postfix/generic
AQVN***
замените на ваш API-ключ.
Создайте файл /etc/postfix/generic
:
sudo sh -c 'echo "@`hostname` postfix@nikolaymatrosov.ru" > /etc/postfix/generic'
И выполните:
sudo postmap -v /etc/postfix/generic
sudo systemctl restart postfix.service
Теперь можно отправить письмо на адрес receiver@example.com
:
echo "Test message" | mail -s "Test subject" receiver@example.com