OpenSMTPD — различия между версиями

Материал из Rosalab Wiki
Перейти к: навигация, поиск
(fix typo)
 
(не показано 15 промежуточных версий этого же участника)
Строка 13: Строка 13:
 
  rpm -ql opensmtpd
 
  rpm -ql opensmtpd
  
При необходимости поправьте конфиг <code>/etc/opensmtpd/smtpd.conf</code> и запустите службу:
+
Запустите службу:
 
  sudo systemctl start opensmtpd
 
  sudo systemctl start opensmtpd
 +
 +
Проверьте, что служба запустилась:
 +
sudo systemctl status opensmtpd
  
 
Лог работы можно получить так:
 
Лог работы можно получить так:
sudo systemctl status opensmtpd
 
 
  sudo journalctl -u opensmtpd
 
  sudo journalctl -u opensmtpd
  
 
Проверьте, какие интерфейсы и порты прослушиваются:
 
Проверьте, какие интерфейсы и порты прослушиваются:
 
  sudo ss -ntulp | grep smtpd
 
  sudo ss -ntulp | grep smtpd
 +
По умолчанию opensmtpd слушает порт 25 на локальном сетевом интерфейсе (127.0.0.1).
  
Если запуск произошел успешно, то добавьте службу в автозапуск:
+
Если запуск произошел успешно, добавьте службу в автозапуск:
 
  sudo systemctl enable opensmtpd
 
  sudo systemctl enable opensmtpd
 
После правки конфига необходимо перезапустить opensmtpd:
 
sudo systemctl restart opensmtpd
 
  
 
= Настройка =
 
= Настройка =
== Какой интерфейс слушать ==
+
== Настройка имени хоста (домена) сервера ==
 +
Настройте имя хоста у почтового сервера, например:
 +
sudo hostnamectl set-hostname mail.rosa.loc
 +
В этом примере имя хоста <code>mail.rosa.loc</code> является доменом третьего уровня, а почтовый сервер настраивается для обслуживания почты в домене второго уровня <code>rosa.loc</code>, т.е. для почтовых адресов вида <code>xxx@rosa.loc</code>.
 +
 
 +
== Настройка OpenSMTPD ==
 +
Настройки задаются в файле <code>/etc/opensmtpd/smtpd.conf</code>:
 +
sudo nano /etc/opensmtpd/smtpd.conf
 +
=== Какой интерфейс слушать ===
 
По умолчанию в конфиге написано:
 
По умолчанию в конфиге написано:
 
  listen on localhost
 
  listen on localhost
 +
 
Если требуется доступность почтового сервера из вне, то следует заменить эту строку на:
 
Если требуется доступность почтового сервера из вне, то следует заменить эту строку на:
 
  listen on 0.0.0.0
 
  listen on 0.0.0.0
== Указание домена ==
+
=== Указание домена ===
Настройте имя хоста у почтового сервера, например:
+
sudo hostnamectl set-hostname mail.rosa.loc
+
 
Над строкой "match for local action "local"" добавьте строку:
 
Над строкой "match for local action "local"" добавьте строку:
 
  match from any for domain "rosa.loc" action "local"
 
  match from any for domain "rosa.loc" action "local"
 +
Замените "rosa.loc" на свой домен в соответствии с ранее заданным именем хоста.
 +
 +
=== Перезапуск после правки настроек ===
 +
Перезапустите сервис после правки конфигурационного файла:
 +
sudo systemctl restart opensmtpd
 +
Удостоверьтесь, что он запустился корректно:
 +
sudo systemctl status opensmtpd
  
 
= Проверка работы =
 
= Проверка работы =
Строка 104: Строка 118:
  
 
Домашний каталог пользователя ivanov был получен через PAM, конфигурационный файл находится по адресу <code>/etc/pam.d/opensmtpd</code>. Благодаря PAM, пользователь мог бы быть не только локальным, но и доменным (LDAP).
 
Домашний каталог пользователя ivanov был получен через PAM, конфигурационный файл находится по адресу <code>/etc/pam.d/opensmtpd</code>. Благодаря 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-сервер.
 +
 +
== Пример настройки релеем ==
 +
Пример конфигурационного файла <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

Если письмо было сразу успешно отправлено, то очередь будет пустой.