7.12. Чтение почты на локальной машине

Описание:  Кандидат должен знать, что различные системные сообщения высылаются по почте пользователю root, а многие сторонние почтовые клиенты (MUA) не всегда могут быть установлены. Кандидат должен уметь как читать, так и посылать почту при помощи встроенной почтовой программы mail(1). Кандидат должен знать где расположены почтовые ящики пользователей.

Практика: mail(1), /var/mail/$USER.

Комментарий

Spool с пользовательской почтой находится в файле /var/mail/$USER. Существует множество способов читать почту и множество способов её посылать. Начиная с непосредственного чтения указанного файла программой less(1) или vi(1) и пересылки через sendmail(8) командой типа

$ cat letter | sendmail somebody@example.org
  

На всех системах BSD в стандартный комплект поставки входит программа mail(1) — пользовательский почтовый агент, предназначенный для чтения почтового ящика и отправки писем. Основная ценность этой программы в том, что она есть везде. Стандарт POSIX требует наличия в системе программы mailx(1). Легко убедиться, что mail(1) и mailx(1) в BSD это дна и та же программа, с идентичным интерфейсом.

[Замечание]Замечание
mail(1) гарантированно присутствует в любой UNIX-системе, даже если там нет ни одного установленного порта и им вполне можно читать служебную почту root'а.

7.12.1. Работа с mail(1) в интерактивном режиме

Интерфейс программы mail(1) трудно назвать дружественным и, быть может, следовало бы рекомендовать пользователю что-то более совершенное, например mutt(1), однако администратор должен знать mail(1) подобно тому, как он должен знать sh(1), хотя пользоваться bash(1)'ем как интерактивным shell'ом может быть более разумно.

Будучи запущена без аргументов, программа mail(1) открывает пользовательский ящик и выводит знак & в качестве приглашения командной строки. Если надо открыть не /var/mail/$USER, а какой-то другой файл, его следует указать в аргументе -f.

$ mail
Mail version 8.1 6/6/93. Type ? for help.
"/var/mail/emin": 1039 messages
> 1 **********@yahoo.com Mon Oct 11 23:18 59/2153 "Re: home address"
 2 *****@xxx.ru   Tue Oct 12 10:42 56/2048 "Re: home address"
 3 *****@xxx.ru   Wed Oct 13 17:10 109/4842 "Demons and signals"
 4 ****@xxxxx.ru   Wed Oct 13 17:10 156/4509 "(fwd) Re: subversion"
 5 ***@xxx.ru   Wed Oct 13 21:17 217/10906 "=?koi8-r?B?9MXL09Qgz9"
 6 *****@xxx.ru   Thu Oct 14 10:09 101/3849 "Re[2]: Demons and sig"
 7 ****@xxxxxx.ru  Thu Oct 14 10:09 10221/783178 "=?koi8-r?B?5s/Uy8k"
 8 *****@xxxxx.ru  Thu Oct 14 15:15 81/2613 "Re: some questions"
 9 ****@xxxxx.ru   Fri Oct 15 10:35 46/1780 "Re: Phone+Cd"
 10 ****@xxxxx.ru   Fri Oct 15 14:23 68/2888 "Re: Phone+Cd"
 11 *****@xxxxx.ru  Fri Oct 15 18:10 61/2350 "Re: StarOfficce"
 12 ****@xxxxxx.ru  Mon Oct 18 00:48 7554/578402 "=?koi8-r?B?UmVbMl06"
 13 ******@xxxxxxxxxxxx. Mon Oct 18 16:35 113/5041 "Re: Jornal"
 14 ****@xxxxx.ru   Wed Oct 20 19:54 56/2220 "Re: uzkaya koleya"
 15 ****@xxxxxx.ru  Wed Oct 20 23:46 48/1911 "=?koi8-r?B?UmVbNF06IO"
 16 ******@xxxxx.net  Fri Oct 22 00:07 45/1790 "Re: (fwd) Re: uzkaya "
 17 *****@xxxxx.ru  Fri Oct 22 09:22 70/2740 "Re: some questions"
 18 ****@xxxxx.ru   Fri Oct 22 14:19 52/2098 "fish"
 19 ****@xxxxx.ru   Fri Oct 22 14:39 63/2271 "Re: Spisok"
 20 ****@xxxxx.ru   Fri Oct 22 14:39 58/2092 "Re: Spisok"
&
  

В командной строке, начинающейся со знака &, можно набирать следующие команды:

Таблица 7.12. Команды программы mail(1)

КомандаОписание
краткаяполная
?helpСправка
hheaders Показать список писем (в окресностях активного письма). Список писем виден, например, на скриншоте перед таблицей. Чтобы посмотреть следующие 20 писем, надо «прыгнуть» писем через 20 (например командой «n+20») и снова ввести команду h.
pprint вывести на экран (через more(1)) текущее письмо
+ или nnext вывести на экран (через more(1)) следующее письмо
-  вывести на экран (через more(1)) предыдущее письмо
x или exexit Выйти из mail(1) без сохранения
qquit Выйти из mail(1) с сохранением
ddelete Удалить сообщение, принимает в качестве необязательного аргумента список сообщений. Изменения записываются при выходе из программы.
dp или dt  Удалить текущее сообщение и напечатать следующее.
rreplyОтветить всем адресатам письма
RReplyОтветить одному адресату письма
ssaveСохранить письмо, дописав к указанному файлу.
Существует ещё большое количество команд предназначенных скорее для тех, кто собирается всерьёз использовать данную программу в качестве повседневного почтового клиента.

7.12.2. Использование mail(1) с командной строки

Часто команду mail(1) используют просто для того, чтобы автоматизировать посылку писем с командной строки. Мы рассмотрим её здесь в этом качестве. Следует отметить, что несмотря на то, что некоторые другие команды (тот же mutt(1) тоже умеют посылать письма с командной строки, mail(1) имеет то преимущество, что он принят в стандарте POSIX. (Точнее, принят mailx(1), см. выше.) С другой стороны, программа mail(1) не дожидается окончания работы sendmail(8) и потому из её кода возврата невозможно понять действительно ли письмо ушло. Тот же mutt(1) лишён этого недостатка. Поэтому может было бы неглупой идеей в скриптах не пользоваться mail(1)'ом вообще, а использовать непосредственно sendmail(8).

Для отправки письма, достаточно подать его на вход команде mail(1), а в качестве аргументов перечислить почтовые адреса. Дополнительно в опциях -s, -c, -b можно описать поля Subject, Cc и Bcc. Ещё следует упомянуть аргумент -E, который не посылает письмо, в случае если оно пустое, что может быть полезно для того, чтобы высылать STDERR из задания в cron.

$ cat letter | mail -s Hello somebody@example.org
  

Строка для crontab(1) могла бы выглядеть так:

* * * * * mytask.sh 2>&1 >/dev/null | mail -E -s "Errors in mytask" debug@somebody.org
  

Странная, на первый взгляд, строка 2>&1 >/dev/null перенапрвляет STDOUT в /dev/null, а STDERR туда, где раньше был STDOUT, таким образом, мы направляем на конвейер именно STDERR, а от ненужного нам STDOUT'а избавляемся.


Обновлено: 12.03.2015