LINUX.ORG.RU
ФорумAdmin

Сам базовый принцип отправки почты в Linux

 


1

1

Всем привет. Начал настраивать exim-ы smarthost-ы, и понял, что не понимаю сам низкоуровневый принцип, базу: как система отправляет почту? Ещё и эти команды mail/mailx.

Вот надо какой-то программе отправить письмо в вакууме... Она делает библиотечный вызов «mail()» или дёргает системную программу /usr/bin/mail? Или, может быть, первое вызывает второе?

Как команда mail определяет, через какой сервер слать почту? Ведь системная команда «mail» это «виртуальная команда»: что exim4, что pistfix усианавливают в систему свою версию команды «mail». Значит, эта команда для отправки использует настройки того пакета, который её установил; Exim и Postfix - это оба MTA. Логично...

Если мне нужно просто отсылать письма, зачем держать в системе эти жирные сложные программы? Можно ли команде mail прописать где-то в конфигурационном файле «отдавай письма на этот хост-почтовый сервер, пусть он шлёт»? Ах да, ведь нет отдельной команды mail, это всегда часть пакета-MTA... Получается, для задачи «просто отдать письмо на отправку» нужно держать на локалхосте целый MTA? Как-то странно всё это.

Везде речь идёт о работе с почтой в консоли.
Можно ли не держать в системе МТА и отправлять почту?




Перемещено Dimez из talks


Библиотечного вызова mail() не существует. Чтобы отправить почту, надо подключиться к SMTP-серверу (либо серверу того ящика, на который ты шлёшь - напрямую, либо серверу твоего ящика, чтобы тот уже передал дальше - это часто удобнее и надёжнее), отослать ему несколько команд (приветствие, адрес отправителя, адрес получателя) и тело письма, посмотреть ответ (либо письмо принято в работу, либо отказ с коротким текстом причины).

Всё это делает программа отправки почты (правда там где я видел она обычно называлась не mail а sendmail но не суть), действительно можно вызвать её и передать ей всё что нужно, но можно и самостоятельно открыть подключение к серверу и всё ему отправить.

Если пользуешься командой - у этой команды будут свой конфиг, который можно прописывать независимо от конфига той проги, которая захотела отправить письмо - тот самый unix-way, разделение ответственности. Если же твоя прога сама подключается к серверу, все настройки отправки писем (включая всякую нужную муть вроде dkim) надо будет включать в её собственный конфиг.

отдавай письма на этот хост-почтовый сервер, пусть он шлёт»?

В freebsd 14 из этих соображений заменили sendmail, полноценный MTA, на легковесный DMA (man dma). Можешь тоже его себе установить.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)

Можно ли не держать в системе МТА и отправлять почту?

Почтовый протокол довольно простой, раньше вообще можно было отправить почту через telnet. Можно написать свою программку на том же перле или любом другой скриптовом языке и пользовать её для рассылок. Тем более если сервер твой и локальный.

vitus@vitus-home:/tmp$ cat test.pl 
#!/usr/bin/perl -w
#
use strict;
use Net::SMTP;

{
  my $sender = 0;
  my $server = 'mail.example.org';
  my $from = 'test@example.org';
  my $to = 'test@example.org';
  my $subj = "Test mail";
  my $body = "I need a help";

  $sender = Net::SMTP->new ($server)
	  or die("$server not connected");
  $sender->mail ($from);
  $sender->to ($to);
  $sender->data ();
  $sender->datasend ("From: $from\n");
  $sender->datasend ("To:   $to\n");
  $sender->datasend ("Subject: $subj\n");
  $sender->datasend ("\n");
  $sender->datasend ("$body\n\n");
  $sender->dataend;
  $sender->quit;
}
vtVitus ★★★★★
()

Ах да, ведь нет отдельной команды mail, это всегда часть пакета-MTA…

Ты сам себе врёшь

$ apt-cache search -n mailx

bsd-mailx - simple mail user agent
mailutils - GNU mailutils utilities for handling mail

Получается, для задачи «просто отдать письмо на отправку» нужно держать на локалхосте целый MTA?

Не обязательно. Есть упрощенные «МТА». Но! тот же postfix/exim довольно небольшие программы и менять их на недоМТА бессмысленно.

Установка postfix/exim – 4-5MB

futurama ★★★★★
()
Последнее исправление: futurama (всего исправлений: 2)

Как команда mail определяет, через какой сервер слать почту?

Никак. Она вызывает команду sendmail.

что exim4, что pistfix усианавливают в систему свою версию команды «mail»

Нет. Они устанавливают sendmail (название в память о настоящем Sendmail; впрочем, настоящий Sendmail всё ещё существует):

$ rpm -qf /usr/sbin/sendmail
postfix-3.6.2-alt1.x86_64

А команда mail берётся из пакета mailx, либо mailutils. Может ещё откуда.

Можно ли не держать в системе МТА и отправлять почту?

Можно. Нужна та штука, что умеет отправлять и имеет в составе нечто, названное sendmail. Но проще Postfix поставить вероятно, обычно он уже есть. Хотя я часто и настоящий Sendmail использую по старой памяти.

AS ★★★★★
()

mail подключается к локалхосту по SMTP протоколу и отправляет письмо указанному пользователю. Т.е. на локалхосте должен быть запущен SMTP сервер и настроен нужным образом, чтобы полученное письмо ушло адресату.

Нет никаких библиотечных вызовов mail, нет никаких системных программ, это просто обычная программа с условно стандартизированным интерфейсом от sendmail или её клон от другого почтового пакета.

Есть альтернативные реализации, которые будут слать письмо через твой gmail аккаунт или как-нибудь ещё. Но тут есть большой минус: если сейчас интернет не работает или другие проблемы, то письмо потеряется. Локальный SMTP сервер сохранит полученное письмо и будет пытаться его отправить, т.е. шансы потерять письмо меньше.

Ничего страшного в том, чтобы держать «целый MTA» на хосте нет, это обычная программа, весьма легковесная. Ну можешь не держать, вариантов отправки почты много. 99% серверов из моего опыта вообще никакую почту никуда не отправляют, и так можно.

vbr ★★★★★
()
Последнее исправление: vbr (всего исправлений: 2)
Ответ на: комментарий от vtVitus

Почтовый протокол довольно простой, раньше вообще можно было отправить почту через telnet.

Почему раньше? Сейчас тоже можно. Год назад где-то отправил успешно. Правда не помню куда и зачем. Но помню что у меня были опасения, что динамический айпи-адрес, выданный мне домашним провом, тому почтовику не понравится. Но обошлось.

firkax ★★★★★
()
Ответ на: комментарий от vbr

нет никаких системных программ, это просто обычная программа с условно стандартизированным интерфейсом от sendmail или её клон от другого почтового пакета

Так то в линуксах обычно вообще нет системных программ, ведь каждая программа - просто программа из какого-то пакета, даже /bin/sh. Впрочем, вроде есть дистры где базовая система всё-таки есть. Но можно не мучиться с линуксами а просто поставить фрибсд. Там почта - точно системная штука.

firkax ★★★★★
()
Ответ на: комментарий от vbr

Есть альтернативные реализации, которые будут слать письмо через твой gmail аккаунт или как-нибудь ещё. Но тут есть большой минус: если сейчас интернет не работает или другие проблемы, то письмо потеряется.

В nullmailer есть своя очередь сообщений, после восстановления связи письма будут повторно отправлены.

No ★★★
()
Ответ на: комментарий от firkax

криптография же, а в нулевых я через telnet в ms hotmail отправлял, а так же проводил нагрузочное тестирование через perl, без использования каких-либо библиотек, чисто писаниной в порт - и да hotmail не забанил за одинаковых 20000 почтовых сообщений, которые я потом забирал и парсил опять же perl-ом и опять же без использования каких-либо библиотек. А сейчас банят за пару «подозрительных» писем.

vtVitus ★★★★★
()
Ответ на: комментарий от vtVitus

Криптография до сих пор не обязательна, за исключением может быть очень редких случаев где админы какого-нить частного почтовика инициативно запретили нешифрованный транспорт. И даже если она используется - цепочку доверия сертификатов обычно никто не проверяет.

firkax ★★★★★
()
Ответ на: комментарий от hobbit

Что подробнее то? В фрибсд есть базовая система, и всё что в неё включено, можно назвать системным (а какой ещё критерий то?). Почтовик туда включён, до 13 - sendmail, с 14 - dma.

firkax ★★★★★
()
Ответ на: комментарий от firkax

и всё что в неё включено, можно назвать системным (а какой ещё критерий то?)

Это ЛОР, тут чего только не выдумывают порой. Мне тут как-то доказывали, что в арче из коробки pipewire идёт и DE впридачу. Как так? А вот так — «из коробки» это не то, что по умолчанию ставится, а то что большинство юзеров себе поставит. Так-то! Бред и звучит как шутка? Ну да, но говорят же такое, а потом на серьёзных щах доказывают, что так и надо. Арч, блютус и громкость (комментарий)

CrX ★★★★★
()

Можно ли команде mail прописать где-то в конфигурационном файле «отдавай письма на этот хост-почтовый сервер, пусть он шлёт»?

Есть пакет ssmtp, который реализует версию утилиты mail, которая по конфигу определяет какому SMTP-серверу, логину и паролю соответствует тот или иной юниксовый пользователь. Я себе на питоне набросал подобную штуку с более удобным (мне) конфигом https://git.disroot.org/MrClon/smtpmail

MrClon ★★★★★
()

я хз чего тут тебе понаписали, но в самом простом случае почта в linux (и раньше во freebsd, хз как щаз) будет доставляться даже без всякого интернета, не то что SMTP. ибо её в юниксах придумали ещё до того как интернет появился.

а доставляться она будет местным пользователям (local users) в их почтовые ящики, например, /var/mail/USER. и посмотреть её можно программой mail. вот пример (я реально его сейчас сделал):

mail -stest USER
Cc:
TEST
.
ctrl+d

смотрим в /var/mail:
ls -l /var/mail/USER
итого 4
-rw-rw—- 1 USER mail 548 янв 25 00:12 USER

можно посмотреть командой cat , а лучше mail без параметров

при входе система также будет писать что у USER есть новая почта

если же у вас инет и есть SMTP и прописано в /etc/aliases что почту для USER надо доставить user@mail.ru, то утилита mail попробует не положить его здесь же в /var/mail, а доставить по SMTP, определит кто получатель почты для mail.ru и попробует открыть туда соединение на 25 или подобный порт.

до интернета и SMTP почта на другие сервера ходила по другим протоколам, например, UUCP. это для расширения кругозора, вряд ли живьём это уже увидите.

из всех советов самый дельный был про nullmailer, тоже советую, он как раз позволят не держать полноценный MTA, но почту с машинки получать. он позволит решить все ваши задачи.
на самом деле есть ещё какие-то альтернативы, просто этой я пользуюсь много лет, года с 2006. вынужденно. был slave DNS на минимальном железе с ограниченной памятью, пришлось урезать бюджет на ОЗУ, на MTA места не было. минимальный по ОЗУ nullmailer выручил и с задачей справился.
только доку на него почитайте!
а знать кто у вас на самом деле вместо mail (sendmail, qmail, courier, postix, exim, и т.д.) - на данном шаге знакомства с линуксом - не обязательно, можно потом разобраться.

если используется Debian то для smarthost нужно в /etc/exim4/update-exim4.conf.conf вот это:
dc_eximconfig_configtype=‘smarthost’

у меня там ещё вот это стоит:
dc_smarthost=‘server.domain.TLD::587’

ещё категорически советую режим dc_localdelivery=‘maildir_home’ !

при нём почта по умолчанию хранится в хомяке, в подпапке Maildir и подпапках cur new tmp. плюс IMAPd там свои создаёт.

mumpster ★★★★★
()
Ответ на: комментарий от vtVitus

раньше вообще можно было отправить почту через telnet

И сейчас это никто не отменял.

> telnet mail.example.com 25
EHLO localhost
MAIL FROM: <john.doe@example.com>
RCPT TO: <jane.doe@example.com>
DATA
From: <john.doe@example.com>
To: <jane.doe@example.com>
Subj: Hi
Dear Jane…
.
BYE
beastie ★★★★★
()
Ответ на: комментарий от mumpster

Я очень сомневаюсь, что автор интересовался почтой локальных юзеров. Я даже сомневаюсь что он вообще знал о её существовании. Соответственно и отвечал про то, что он спрашивал.

dma можно не только в фрибсд поставить и, более того, его не в фрибсд сделали, там его просто взяли в использование. Хотя DragonflyBSD это форк FreeBSD но весьма давнишний.

https://packages.debian.org/bullseye/dma вот например его можно в дебиан установить

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)

msmtp решает задачу, уже советовали? Это небольшая приложуха, которая прикидывается sendmail и просто использует внешний SMTP-сервер.

Нужны пакеты msmtp и msmtp-mta.

paddlewan
()

консольная mail это часть системного mta (postfix, exim, sendmail,nullmailer, …) она отправляет почту mta и дальше он сам разбирается что с этим делать. она для отправки почты в консоли.

как консольная утилита свзяpывается с mta зависит от mta, на локал хосте какой-то IPC механизм скажем unix-socets, но mta еще и слушает порт smtp 25 и можно с ним связаться по smtp.

из своей программы используют smtp, но можно и вызвать внешнюю прогу mail с параметрами.

Можно ли не держать в системе МТА и отправлять почту?

консольной mail нет smtp клиентом да можно

cylon17
()

всё почтовые сервера, включая nullmailer, ставят команду sendmail, можно использовать её напрямую, можно через команду mail например из пакета s-nail

из программ почта обычно отправляется или по smtp протоколу или в пайп sendmail

sergej ★★★★★
()

Можно ли не держать в системе МТА и отправлять почту?

смотря в какой системе

где-то держать MTA всё равно придётся или использовать чужой

sergej ★★★★★
()

Если мне нужно просто отсылать письма, зачем держать в системе эти жирные сложные программы? Можно ли команде mail прописать где-то в конфигурационном файле «отдавай письма на этот хост-почтовый сервер, пусть он шлёт»? Ах да, ведь нет отдельной команды mail, это всегда часть пакета-MTA… Получается, для задачи «просто отдать письмо на отправку» нужно держать на локалхосте целый MTA?

Нет же. Если правильно понимаю ваш сценарий использования (просто «из командной строки» отправить письмо, используя внешний понятный smtp-сервер), то вам отлично подойдет msmtp. Есть в любом приличном дистрибутиве.

Вам нужно два пакета msmtp, msmtp-mta.

Вот тут (например) можно почитать про настройку. https://wiki.archlinux.org/title/Msmtp

А то вам сейчас начнут рассказывать, как полный почтовик поднимать (что делать нужно, конечно же, только в крайнем случае и с полным пониманием «зачем»).

P.S. Сорри, повторяюсь, чтобы короткий комментарий выше не затерялся.

paddlewan
()