OpenSMTPD — различия между версиями
(не показана одна промежуточная версия этого же участника) | |||
Строка 121: | Строка 121: | ||
= OpenSMTPD + Dovecot = | = OpenSMTPD + Dovecot = | ||
− | Чтобы | + | Чтобы по IMAP полученные через SMTP, установите пакет dovecot: |
sudo dnf install dovecot | sudo dnf install dovecot | ||
Строка 135: | Строка 135: | ||
sudo systemctl enable --now dovecot.socket | sudo systemctl enable --now dovecot.socket | ||
− | Теперь можно подключаться по IMAP и SMTP, например, через Thunderbird. По умолчанию и opensmtpd, и dovecot настроены использовать системных пользователей Linux и их пароли. | + | Теперь можно подключаться по IMAP и SMTP, например, через Thunderbird. |
+ | |||
+ | OpenSMTPD получает письмо по протоколу SMTP, кладет его в ~/Maildir, а Dovecot отдает его по IMAP. | ||
+ | |||
+ | По умолчанию и opensmtpd, и dovecot настроены использовать системных пользователей Linux и их пароли. | ||
+ | |||
+ | = OpenSMTPD как релей = | ||
+ | |||
+ | == Что такое релей == | ||
+ | |||
+ | OpenSMTPD может быть релеем, то есть подключаться по SMTP к другому почтовому серверу и передавать ему письма. Пример, когда такое нужно: | ||
+ | |||
+ | * веб-приложение на PHP посылает письма через встроенную в PHP функцию отправки писем mail(); | ||
+ | * PHP вызывает программу sendmail; | ||
+ | * программа sendmail предоставляется opensmtpd (становится доступа после установки пакета opensmtpd); | ||
+ | * opensmtpd доставляет письмо через SMTP-сервер. | ||
+ | |||
+ | == Пример настройки релеем == | ||
+ | Пример конфигурационного файла <code>/etc/opensmtpd/smtpd.conf</code>: | ||
+ | |||
+ | <pre> | ||
+ | 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" | ||
+ | </pre> | ||
+ | |||
+ | Пароль для авторизации на SMTP-сервере хранится в файле <code>/etc/opensmtpd/secrets</code>. По умолчанию этого файла нет. Создайте его: | ||
+ | sudo nano /etc/opensmtpd/secrets | ||
+ | И вставьте следующее содержимое: | ||
+ | username username@rosa.ru:пароль | ||
+ | Замените "username" и "пароль" на свои имя пользователя и пароль. | ||
+ | |||
+ | Сделайте так, чтобы файл с паролем не был доступен для чтения посторонним: | ||
+ | sudo chown root:smtpd /etc/opensmtpd/secrets | ||
+ | sudo chmod 640 /etc/opensmtpd/secrets | ||
+ | |||
+ | Обратите внимание, что в этом примере идет отправка писем с ящика <code>username@rosa.ru</code>, а в качестве адреса почтового сервера указывается не часть домена поле собаки (<code>rosa.ru</code>), а именно адрес почтового сервера — <code>mail.rosa.ru</code>. | ||
+ | |||
+ | == Проверка работы релея == | ||
+ | |||
+ | Проверить отправку писем через PHP можно следующим образом. Установите пакет php-cli: | ||
+ | sudo dnf install php-cli | ||
+ | |||
+ | Создайте файл-скрипт на php (например, по адресу <code>/tmp/mail.php</code>) со следующим содержимым, заменив адреса на свои: | ||
+ | |||
+ | <pre> | ||
+ | <?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"; | ||
+ | ?> | ||
+ | </pre> | ||
+ | |||
+ | И запустите его: | ||
+ | php /tmp/mail.php | ||
+ | Если будет выведен текст: "Письмо отправлено", — то значит функция mail() в PHP успешно вызвала sendmail. Посмотрите лог opensmtpd: | ||
+ | sudo systemctl status opensmtpd | ||
+ | В нем будут записи про отправку письма. Можно посмотреть очередь писем: | ||
+ | sudo smtpctl show queue | ||
+ | Если письмо было сразу успешно отправлено, то очередь будет пустой. | ||
[[Категория:ROSA Server]] | [[Категория:ROSA Server]] |
Текущая версия на 16:34, 21 августа 2024
Содержание
Введение
Эта статья описывает некоторые типовые варианты настройки почтового сервера 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
Если требуется доступность почтового сервера из вне, то следует заменить эту строку на:
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
Если письмо было сразу успешно отправлено, то очередь будет пустой.