OpenSMTPD
Содержание
Введение
Эта статья описывает некоторые типовые варианты настройки почтового сервера OpenSMTPD на дистрибутивах ROSA Fresh/Chrome 12 и новее.
OpenSMTPD отличается сочетанием простоты настройки и функционала.
Установка и запуск
Выполните:
sudo dnf install opensmtpd
Ознакомьтесь со списком файлов в пакете (в т.ч. со списков мануалов):
rpm -ql opensmtpd
Запустите службу:
sudo systemctl start opensmtpd
Проверьте, что служба запустилась:
sudo systemctl status opensmtpd
Лог работы можно получить так:
sudo journalctl -u opensmtpd
Проверьте, какие интерфейсы и порты прослушиваются:
sudo ss -ntulp | grep smtpd
По умолчанию opensmtpd слушает порт 25 на локальном сетевом интерфейсе (127.0.0.1).
Если запуск произошел успешно, добавьте службу в автозапуск:
sudo systemctl enable opensmtpd
Настройка
Настройка имени хоста (домена) сервера
Настройте имя хоста у почтового сервера, например:
sudo hostnamectl set-hostname mail.rosa.loc
В этом примере имя хоста mail.rosa.loc
является доменом третьего уровня, а почтовый сервер настраивается для обслуживания почты в домене второго уровня rosa.loc
, т.е. для почтовых адресов вида xxx@rosa.loc
.
Настройка OpenSMTPD
Настройки задаются в файле /etc/opensmtpd/smtpd.conf
:
sudo nano /etc/opensmtpd/smtpd.conf
Какой интерфейс слушать
По умолчанию в конфиге написано:
listen on localhost
Это означает, что почтовый сервер слушает порт 25 только на локальной петле, то есть к нему можно подключиться только с того же компьютера (или виртуальной машины), на котором он запущен.
Если требуется доступность почтового сервера из вне, то есть по сети с других компьютеров, то следует заменить эту строку на:
listen on 0.0.0.0
Указание домена
Над строкой "match for local action "local"" добавьте строку:
match from any for domain "rosa.loc" action "local"
Замените "rosa.loc" на свой домен в соответствии с ранее заданным именем хоста.
Перезапуск после правки настроек
Перезапустите сервис после правки конфигурационного файла:
sudo systemctl restart opensmtpd
Удостоверьтесь, что он запустился корректно:
sudo systemctl status opensmtpd
Проверка работы
На конфиге по умолчанию выполняется доставка писем в формате Maildir (отдельный файл на каждое сообщение) в каталог ~/Maildir внутри домашнего каталога пользователя-получателя. Каталог ~/Maildir должен быть создан заранее.
И так, вы выполнили описанные выше шаги: установили opensmtpd, исправили "listen" и "match" в конфиге и перезапустили службу после правки конфига.
Создаем пользователя:
sudo useradd ivanov
Создаем каталог для почты:
sudo -u ivanov mkdir -p /home/ivanov/Maildir
Смотрим IP-адрес машины (или контейнера) с почтовым сервером:
ip a
Будем считать, что IP-адрес 192.168.122.12.
Подключаемся к нему с другой машины:
telnet 192.168.122.12 25
Ждем пару секунд появления текста:
220 mail.rosa.loc ESMTP OpenSMTPD
Отправляем сообщение-приветствие:
helo dom.loc
В ответ получаем:
250 mail.rosa.loc Hello dom.loc [192.168.122.1], pleased to meet yo
Указываем отправителя письма (обратите внимание на необходимость строгого соблюдения RFC 2822 и указания адреса в < >):
mail from:<vasya@domain.loc>
В ответ получаем:
250 2.0.0 Ok
Указываем получателя письма:
rcpt to:<ivanov@rosa.loc>
В ответ получаем:
250 2.1.5 Destination address valid: Recipient ok
Вводим:
data
В ответ получаем приглашение начать ввода письма. Вставляем текст:
Message-ID: <x01@dom.loc> Subject: Test Privet .
В ответ получаем:
250 2.0.0 df9164e0 Message accepted for delivery
Смотрим лог opensmtpd:
sudo journalctl -u opensmtpd
Видим там доставку нашего сообщения.
Оно сохранилось в домашнем каталоге пользователя-получателя:
$ sudo cat /home/ivanov/Maildir/new/1670703224.ded2147b.mail.rosa.loc Return-Path: <vasya@domain.loc> Delivered-To: ivanov@rosa.loc Received: from dom.loc (hp-xfce [192.168.122.1]) by mail.rosa.loc (OpenSMTPD) with SMTP id df9164e0 for <ivanov@rosa.loc>; Sat, 10 Dec 2022 20:13:31 +0000 (UTC) Message-ID: <x01@dom.loc> Subject: Test Privet
Домашний каталог пользователя ivanov был получен через PAM, конфигурационный файл находится по адресу /etc/pam.d/opensmtpd
. Благодаря PAM, пользователь мог бы быть не только локальным, но и доменным (LDAP).
OpenSMTPD + Dovecot
Чтобы по IMAP полученные через SMTP, установите пакет dovecot:
sudo dnf install dovecot
Отредактируйте конфиг:
sudo nano /etc/dovecot/conf.d/10-mail.conf
В нем замените
#mail_location =
на:
mail_location = maildir:~/Maildir
Запустите службу:
sudo systemctl enable --now dovecot.socket
Теперь можно подключаться по IMAP и SMTP, например, через Thunderbird.
OpenSMTPD получает письмо по протоколу SMTP, кладет его в ~/Maildir, а Dovecot отдает его по IMAP.
По умолчанию и opensmtpd, и dovecot настроены использовать системных пользователей Linux и их пароли.
OpenSMTPD как релей
Что такое релей
OpenSMTPD может быть релеем, то есть подключаться по SMTP к другому почтовому серверу и передавать ему письма. Пример, когда такое нужно:
- веб-приложение на PHP посылает письма через встроенную в PHP функцию отправки писем mail();
- PHP вызывает программу sendmail;
- программа sendmail предоставляется opensmtpd (становится доступа после установки пакета opensmtpd);
- opensmtpd доставляет письмо через SMTP-сервер.
Пример настройки релеем
Пример конфигурационного файла /etc/opensmtpd/smtpd.conf
:
table aliases file:/etc/opensmtpd/aliases table secrets file:/etc/opensmtpd/secrets listen on localhost action "local" maildir alias <aliases> action "relay" relay host smtp+tls://username@mail.rosa.ru:587 auth <secrets> match for local action "local" match from local for any action "relay"
Пароль для авторизации на SMTP-сервере хранится в файле /etc/opensmtpd/secrets
. По умолчанию этого файла нет. Создайте его:
sudo nano /etc/opensmtpd/secrets
И вставьте следующее содержимое:
username username@rosa.ru:пароль
Замените "username" и "пароль" на свои имя пользователя и пароль.
Сделайте так, чтобы файл с паролем не был доступен для чтения посторонним:
sudo chown root:smtpd /etc/opensmtpd/secrets sudo chmod 640 /etc/opensmtpd/secrets
Обратите внимание, что в этом примере идет отправка писем с ящика username@rosa.ru
, а в качестве адреса почтового сервера указывается не часть домена поле собаки (rosa.ru
), а именно адрес почтового сервера — mail.rosa.ru
.
Проверка работы релея
Проверить отправку писем через PHP можно следующим образом. Установите пакет php-cli:
sudo dnf install php-cli
Создайте файл-скрипт на php (например, по адресу /tmp/mail.php
) со следующим содержимым, заменив адреса на свои:
<?php // получатель письма $to = 'ivan@rosa.ru'; $subject = 'Тестовое письмо'; $message = 'hello'; // отправитель письма, обычно совпадает с логином к SMTP-серверу $headers = 'From: username@rosa.ru'; $rc = mail($to, $subject, $message, $headers); if ($rc == true) echo "Письмо отправлено\n"; ?>
И запустите его:
php /tmp/mail.php
Если будет выведен текст: "Письмо отправлено", — то значит функция mail() в PHP успешно вызвала sendmail. Посмотрите лог opensmtpd:
sudo systemctl status opensmtpd
В нем будут записи про отправку письма. Можно посмотреть очередь писем:
sudo smtpctl show queue
Если письмо было сразу успешно отправлено, то очередь будет пустой.