Fetchmail- утилита для unix-подобных систем, созданная для сбора почты с удаленных POP3, IMAP, ETRN и ODMR почтовых серверов и доставки локальным пользователям. Другими словами- консольный почтовый клиент.

Установка

Пакет fetchmail находится в репозиториях Ubuntu, поэтому установка производится одной командой

sudo apt-get install fetchmail

Настройка

Для работы пакета fetchmail необходимо предварительно его настроить, для этого в домашнем каталоге необходимо создать файл со следующим содержимым:

gedit ~/.fetchmailrc
skip pop.mail.ru proto POP3
user '<user_name>@mail.ru', with password '********'
skip imap.yandex.ru proto IMAP port 995
user '<user_name>@gmail.com', with password '*******'

Присваиваем права на исполнение

chmod 700 ~/.fetchmailrc

В данном примере приведены настройки для работы с серверами по протоколам POP3 и IMAP, если у вас одна учетная запись почты, то выберете свой вариант, вместо <user_name> введите имя контакта, а вместо звездочек - свой пароль. Параметр skip перед именем сервера указывает, что почту нужно проверять только по принудительному запросу. При таком конфигурационном файле обращение к почтовому серверу происходит с явным указанием:

fetchmail [параметры] pop.mail.ru

Использование

Fetchmail представляет собой полноценный консольный почтовый клиент, при помощи которого можно принимать и пересылать почту, и основное её применение, конечно же, различного рода серверы.

Проверка и отображение новых писем с помощью notify-osd

В приведенном ниже описании рассматривается применение пакета fetchmail на обычных рабочих компьютерах с целью оповещения о наличии новых писем в вашем почтовом ящике. Данный способ основан на применении одного простого скрипта и стандартного пакета cron для того, что бы отказаться от запущенного в фоне тяжелого почтового клиента (Thunderbird, Evolution и т.д.).

Скрипт проверки писем

Создайте новый файл в удобной для Вас папке (рекомендуется использовать ~/bin, которая не будет удаляться при переустановке системы):

mkdir ~/bin
gedit ~/bin/chck-mail.sh

И скопируйте в него следующее содержимое

#!/bin/bash
#--------------Проверка почтового ящика на сервере yandex.ru--------------------
checkmail=`fetchmail -c imap.yandex.ru`
all=`echo $checkmail | cut -d " " -f 1`
readed=`echo $checkmail | cut -d ' ' -f 3 | sed s/\(//g`
acc1=`echo $checkmail | cut -d ' ' -f 6`
let "div = $all - $readed"
if [ $div != 0 ] 2>/dev/null; then
	if [ $div -eq 1 ]; then
		notify-send "Электропочта" "Для $acc1 одно новое письмо" -i mail-notification.png -t 20000
	elif [ $div -eq 2 -o $div -eq 3 -o $div -eq 4 ]; then
		notify-send "Электропочта" "Для $acc1 $div новых письма" -i mail-notification.png -t 20000
	else
		notify-send "Электропочта" "Для $acc1 $div новых писем" -i mail-notification.png -t 20000
	fi
 
fi
#------------------------Проверка почтового ящика на сервере mail.ru---------------------
checkmail=`fetchmail -c pop.mail.ru 2>/dev/null`
mail2=`echo $checkmail | cut -d " " -f 1`
acc2=`echo $checkmail | cut -d ' ' -f 4`
if [ $acc2 = <user_name>@mail.ru ] 2>/dev/null; then
	if [ $mail2 -eq 1 ]; then
		notify-send "Электропочта" "Для $acc2 одно новое письмо" -i mail-notification.png -t 20000
	elif [ $mail2 -eq 2 -o $mail2 -eq 3 -o $mail2 -eq 4 ] ; then
		notify-send "Электропочта" "Для $acc2 $mail2 новых письма" -i mail-notification.png -t 20000
		else
		notify-send "Электропочта" "Для $acc2 $mail2 новых писем" -i mail-notification.png -t 20000
	fi
fi

В тексте необходимо заменить <user_name> на свое имя пользователя почтового сервера.

Как можно заметить файл описывает два метода проверки почты по различным протоколам IMAP и POP3, настоятельно рекомендуется использовать IMAP, если нужно сохранять письма на сервере (для этого в настройках почтового сервера нужно указать протокол, по которому будут отдаваться письма почтовым клиентам (mail.ru не поддерживает IMAP). При использовании протокола POP3 в настройках почтового клиента, который будет использоваться для просмотра писем необходимо указать «Удалять письма с сервера», в противном случае скрипт будет постоянно оповещать о наличии новых писем.

В строках типа

notify-send "Электропочта" "Для $acc1 одно новое письмо" -i mail-notification.png -t 20000

последняя цифра означает время отображения всплывающего уведомления в миллисекундах.

Необходимо сделать данный файл исполняемым

chmod +x bin/chck-mail.sh

Отправьте себе тестовое письмо и в терминале запустите скрипт на исполнение

 ~/bin/chck-mail.sh

должно появиться подобное уведомление: В случае возникновения ошибок, напишите нам об этом на форуме, приведя текст ошибки.

Задание cron

Для автоматической проверки почтового ящика необходимо добавить задание cron для созданного ранее скрипта, для этого в терминале введите команду

crontab -e

, если вы ни разу этого не делали, то появится диалог выбора предпочитаемого редактора, укажите nano (выбор 2 по умолчанию). В появившемся окне редактора допишите в конец файла:

DISPLAY=:0
*/10 * * * * /home/<user_name>/bin/chck-mail.sh

Первая строка говорит консольному cron какой дисплей использовать для вывода графики. Во второй устанавливается выполнение скрипта chck-mail.sh (измените <user_name> на свое имя пользователя в системе) каждые 10 минут. Сохраняем и закрываем редактор, и если все правильно, то в терминале появится строка

crontab: installing new crontab

Безопасность

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

Использование fetchmail для получения почтовых вложений

Внимание: вместо параметров user, username, password и т.д. вы должны подставить свои значения

Данный раздел описывает следующий сценарий работы: у вас есть сервер, принимающий почту, в письмах встречаются вложения, которые нужно сохранять отдельно (к примеру, вложенные в письма торрент-файлы, которые сразу ставятся на закачку при сохранении их в определенный каталог).

Функционала «голого» fetchmail здесь не хватит, дополнительно установим криптографический пакет openssl, почтовый фильтр procmail и утилиту для сохранения вложений uudeview:

sudo apt install openssl procmail uudeview

Настройка описывается на примере gmail (сразу рекомендую в дебрях Гугла разрешить непроверенным приложениям получать доступ к вашему почтовому ящику, иначе не оберетесь проблем). Почтовый ящик я для указанной выше цели использую отдельный, все подряд на него не сыплется, поэтому фильтрацию вложений в этом гайде я не описываю.

Приводим конфигурационный файл ~/.fetchmailrc к следующему виду:

set daemon 60 #интервал в секундах проверки почты демоном
 
poll imap.gmail.com
with nodns,
with protocol IMAP
user "user@gmail.com" there is "user" here,#строка "there is "user" here" позволяет соотнести логин почты с вашим пользователем Ubuntu по имени user; эта строка необязательна
  with password PaSSWorD,
  keep,#письма остаются на сервере после прочтения
  with ssl, sslcertck;#при таких настройках сертификат не нужно перекачивать и хешировать вручную
mda 'procmail -d %T'
set syslog set logfile fetchmail/logs/fetchmail.log

Не забываем про права 600 (без них fetchmail не будет работать с конфигом - небезопасно же, пароль открыт всем - и выругается):

chmod 600 ~/.fetchmailrc

Создаем нужные нам каталоги для работы fetchmail:

mkdir -p ~/fetchmail/logs/ ~/fetchmail/backup/ ~/fetchmail/attachments/

По пути ~/fetchmail/logs/fetchmail.log нам будет доступен лог работы fetchmail, что мне, к примеру, упростило поиск ошибок в настройках (гайды из интернета как всегда не работают, возможно, у вас не заработает именно этот гайд8-)). Лог нужно создать вручную:

> ~/fetchmail/logs/fetchmail.log

Создаем конфигурационный файл ~/.procmailrc со следующим содержимым (учтите, что права на вашу директорию $HOME для работы procmail должны быть не более, чем 744, как и права на сам .procmailrc - без этого procmail будет заявлять, что конфиг подозрителен):

:0
*^content-Type:
{
# сделаем копию принятого письма
:0c:
$HOME/fetchmail/backup
 
#здесь будут распакованы все файлы из письма и сложены в нужный нам каталог
#для этого сделаем форвард в uudeview, который распакует вложения в $HOME/fetchmail/attachments
#опция -a создает нумерованные копии файлов, если файлы с таким именем уже обнаружены
:0f
| uudeview -i +a +o -p $HOME/fetchmail/attachments -
}

Теперь остается добавить fetchmail в cron для автозагрузки. В файле ~/fetchmail/fetchmail.cron сохраняем следующее содержимое:

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
@reboot fetchmail

Добавляем информацию в планировщик:

crontab ~/fetchmail/fetchmail.cron

И запускаем клиент:

fetchmail

Если что-то не сработает - в первую очередь смотрите лог fetchmail, затем гуглите.

Ссылки