Перейти к основному содержимому

Как настроить Sendmail или Postfix для работы с Postbox

· 5 мин. чтения

Чтобы отправлять почту через Postbox, нужно настроить почтовый сервер. В этой статье я расскажу как настроить Sendmail или Postfix на Ubuntu 24.04 для отправки почты через Postbox по 587 порту.

Начнем с создания виртуальной машины на Ubuntu 24.04. Имя укажем demo, а имя пользователя yc-user. Они не обязательно должны именно такими, но так проще будет ориентироваться в статье, понимая откуда взялись эти значения.

Подготовка

Еще нам потребуется настроенный адрес в Postbox и API-ключ для отправки почты.

Создадим API-ключ

  1. Создайте сервисный аккаунт. Он обязательно должен быть в том же каталоге, что и адрес в Postbox.
  2. Добавьте ему роль postbox.sender.
  3. Создайте 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