Журнал LinuxFormat - перейти на главную

LXF135:Procmail

Материал из Linuxformat
Версия от 19:36, 9 октября 2011; Crazy Rebel (обсуждение | вклад)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск
Hardcore Linux Проверьте себя на крутом проекте для продвинутых пользователей

Содержание

Procmail: Поч­те в по­мощь

Ша­шанк Шар­ма cнова рез­вит­ся в сияю­щем раю ко­ман­дной стро­ки и на­хо­дит Procmail иде­аль­ным ре­ше­ни­ем для фильт­ра­ции поч­ты.

Необ­хо­ди­мость от­дель­но­го ре­шения для фильт­ра­ции поч­ты пря­мо про­пор­цио­наль­на ко­ли­че­ству пи­сем в ва­шем ящи­ке. Procmail – мощ­ная ути­ли­та об­ра­бот­ки со­об­щений, спо­соб­ная про­из­во­дить сор­ти­ров­ку поч­ты на осно­ве лю­бо­го ко­ли­че­ства пра­вил. Вхо­дя­щие со­об­щения мож­но рас­пре­де­лить по пап­кам на осно­ве за­ранее за­дан­но­го кри­те­рия, та­ко­го как те­ма со­об­щения, от­пра­ви­тель и т. д. При­менение в пра­ви­лах ре­гу­ляр­ных вы­ра­жений и воз­мож­ность ис­поль­зо­вания мно­же­ства пра­вил для сор­ти­ров­ки пи­сем пре­вра­ща­ют Procmail в весь­ма точ­ный поч­то­вый фильтр. Кро­ме то­го, он лег­ко от­сеи­ва­ет спам и со­об­щения с ис­пол­няе­мы­ми фай­ла­ми во вло­жении, а так­же вы­сту­па­ет в ро­ли иде­аль­но­го ав­то­от­вет­чи­ка.

Так как ак­тив­ная раз­ра­бот­ка Procmail пре­кра­ще­на, он по­став­ля­ет­ся по умол­чанию лишь в немно­гих ди­ст­ри­бу­ти­вах. Но пусть это вас не бес­по­ко­ит: он весь­ма ста­би­лен и по­пу­ля­рен, и его лег­ко до­быть в ре­по­зи­то­ри­ях.

На ти­пич­ном поч­то­вом сер­ве­ре од­но­вре­мен­но ра­бо­та­ют мно­же­ство раз­лич­ных ути­лит и тех­но­ло­гий. Они вклю­ча­ют аген­та достав­ки поч­ты (MDA), аген­та по­лу­чения поч­ты (MRA) и поль­зо­ва­тель­ско­го поч­то­во­го аген­та (MUA). По­следние – это поч­то­вые кли­ен­ты, ти­па Mutt или Thunderbird. Аген­ты по­лу­чения поч­ты – про­грам­мы вро­де Fetchmail или Getmail; они по­лу­ча­ют со­об­щения с уда­лен­ной учет­ной запи­си. Procmail – агент достав­ки поч­ты, от­ве­чаю­щий за сор­ти­ров­ку со­об­щений и пе­ре­да­чу их в поч­то­вый ящик в за­ви­си­мо­сти от на­стро­ек.

За дей­ствия Procmail по фильт­ра­ции поч­ты от­ве­ча­ет файл .procmailrc в ва­шем до­машнем ка­та­ло­ге. Пра­ви­ла в этом фай­ле на­зы­ва­ют­ся ре­цеп­та­ми. За­дол­го до то­го, как лю­ди на­ча­ли об­менивать­ся филь­ма­ми и му­зы­кой, они об­менива­лись друг с дру­гом ре­цеп­та­ми Procmail, ко­то­рые все еще мож­но най­ти с по­мо­щью обыч­но­го по­иско­ви­ка. Со вре­менем ва­ши ре­цеп­ты вы­растут и из­ме­нят­ся, но, взгля­нув на то, как дру­гие поль­зу­ют­ся Procmail, вы смо­же­те луч­ше об­ра­бо­тать свои пись­ма.

В за­ви­си­мо­сти от на­стро­ек ди­ст­ри­бу­ти­ва, мо­жет по­тре­бо­вать­ся соз­дать и файл .forward – так вы га­ран­ти­руе­те, что Procmail при­мет­ся за об­ра­бот­ку ва­ших пи­сем до их по­па­дания в ваш поч­то­вый ящик. На­бе­ри­те

|/usr/bin/procmail

в тек­сто­вом ре­дак­то­ре и со­храните файл под именем .forward в сво­ем до­машнем ка­та­ло­ге. Все вхо­дя­щие со­об­щения бу­дут пе­ре­на­прав­ле­ны в Procmail.


За кон­фи­гу­ра­цию боль­шин­ства ути­лит команд­ной стро­ки от­ве­ча­ют фай­лы на­строй­ки, ко­то­рые хра­нят­ся в ка­та­ло­ге /etc/. Од­на­ко у обыч­ных поль­зо­ва­те­лей нет прав досту­па или при­ви­ле­гий для ре­дак­ти­ро­вания фай­лов, при­над­ле­жа­щих root. По­это­му ути­ли­ты вро­де Procmail и Fetchmail по­зво­ля­ют поль­зо­ва­те­лям соз­да­вать соб­ствен­ные фай­лы на­строй­ки в их до­машних ка­та­ло­гах.

На на­шем уро­ке мы восполь­зу­ем­ся Procmail для фильт­ра­ции пи­сем, по­лу­чен­ных из поч­то­во­го ящи­ка Gmail. И Fetchmail, и Gmail под­дер­жи­ва­ют IMAP, но при за­груз­ке со­об­щений из поч­то­во­го ящи­ка Gmail мы бу­дем ис­поль­зо­вать про­то­кол POP, и Procmail смо­жет от­фильт­ро­вать со­об­щения.

По­лу­чение поч­ты

Пер­вый шаг в на­строй­ке Fetchmail для взаи­мо­дей­ствия с уда­лен­ной поч­то­вой учет­ной запи­сью – соз­дание фай­ла .fetcmailrc в ва­шем до­машнем ка­та­ло­ге. От­крой­те тек­сто­вый ре­дак­тор и вве­ди­те сле­дую­щий текст:

poll pop.gmail.com with proto POP3 and options no dns
user ‘usernamea@gmail.com’ with password ‘ваш_па­роль’
is ‘user’ here
options keep ssl sslcertck sslcertpath ‘/etc/ssl/certs’
mda ‘/usr/bin/procmail -d %T’

Это все, что нуж­но от вас Fetchmail. Мо­жет так­же по­тре­бо­вать­ся еще вклю­чить пе­ре­на­прав­ление POP в на­строй­ках уда­лен­ной учет­ной запи­си (для Gmail и по­доб­ных сер­ви­сов). Пер­вые две стро­ки – на са­мом де­ле од­на; мы раз­би­ли ее для удоб­ства. Она ве­лит Fetchmail свя­зать­ся с учет­ны­ми запи­ся­ми username@gmail.com или username@yourisp.com и сбро­сить поч­ту локаль­но­му поль­зо­ва­те­лю. В треть­ей стро­ке есть несколь­ко оп­ций. Пер­вая, keep, не ве­лит Fetchmail уда­лять со­об­щения с уда­лен­ной учет­ной запи­си. Без этой оп­ции Fetchmail уда­лит с учет­ной запи­си все со­об­щения, ко­то­рые за­гру­зит. Осталь­ные оп­ции от­но­сят­ся к шиф­ро­ванию SSL. По­след­няя стро­ка фраг­мен­та ко­да ве­лит Fetchmail пе­ре­на­пра­вить все вхо­дя­щие со­об­щения Procmail.

Су­ще­ству­ет два спо­со­ба на­строй­ки ав­то­ма­ти­че­ско­го по­лу­чения но­вых со­об­щений ва­шей учет­ной запи­си Fetchmail. Пер­вый – до­ба­вить стро­ку

set daemon 300

в файл ~/.fetchmailrc. Это за­ста­вит Fetchmail про­ве­рять на­ли­чие но­вых пи­сем ка­ж­дые пять ми­нут (300 се­кунд). Ус­та­но­ви­те под­хо­дя­щий ин­тер­вал на свое ус­мот­ре­ние. Вто­рой спо­соб – соз­дать за­да­ние Cron для за­пус­ка Fetchmail.

За­пус­ти­те crontab -e из тер­ми­на­ла и вве­ди­те

*/5 * * * * /usr/bin/fetchmail -s

в файл crontab. Fetchmail бу­дет за­пус­кать­ся раз в пять ми­нут в «ти­хом» ре­жи­ме – то есть все со­об­ще­ния о хо­де это­го про­цес­са и ре­зуль­та­те бу­дут скры­ты и не по­па­дут в стан­дарт­ный вы­вод.

Fetchmail очень строг к пра­вам дос­ту­па к фай­лу ~/.fetchmailrc и тре­бу­ет, что­бы они бы­ли не вы­ше 710. По­это­му из­ме­ни­те пра­ва на 710 или мень­шие ко­ман­дой chmod та­ким об­ра­зом:


chmod 710 ~/.fetchmailrc

Файл на­строй­ки ~/.fetchmailrc мож­но про­ве­рить ко­ман­дой

fetchmail -vk

с тер­ми­на­ла. Fetchmail за­пус­тит­ся в под­роб­ном ре­жи­ме (оп­ция -v), а пись­ма не бу­дут уда­ле­ны с уда­лен­ной учет­ной за­пи­си. Оп­цию -k (keep) мож­но не ука­зы­вать, ес­ли она уже есть в фай­ле ~/.fetchmailrc.

Сле­дую­щий шаг – со­об­щить Procmail о раз­лич­ных ре­цеп­тах фильт­ра­ции. Но пре­ж­де чем соз­да­вать пра­ви­ла для сор­ти­ров­ки пи­сем от дру­зей, се­мьи и из спи­сков рас­сыл­ки, нуж­но соз­дать уни­каль­ные ка­та­ло­ги для ка­ж­дой из этих ка­те­го­рий. Мы хо­тим, что­бы Procmail дос­тав­лял все со­об­ще­ния в ка­та­лог ~/Mail, по­это­му соз­да­дим внут­ри не­го до­пол­ни­тель­ные ди­рек­то­рии.


mkdir ~/Mail
mkdir ~/Mail/new
mkdir ~/Mail/family
mkdir ~/Mail/lists
mkdir ~/Mail/lists/fedora-devel
mkdir ~/Mail/lists/debian-legal
mkdir ~/Mail/lists/gnome

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

SHELL=/bin/bash
PATH=/usr/sbin:/usr/bin
MAILDIR=$HOME/Mail
DEFAULT=$MAILDIR/new
LOGFILE=$HOME/procmail.log
LOG=””
VERBOSE=yes

Вы­ше при­ве­де­ны толь­ко пе­ре­мен­ные, со­дер­жа­щие дан­ные для ра­бо­ты Procmail. MAILDIR — ра­бо­чий ка­та­лог для Procmail; внут­ри него бу­дет хранить­ся вся поч­та. Пись­ма, не от­но­ся­щие­ся ни к од­но­му из че­ты­рех ре­цеп­тов, по­па­да­ют в DEFAULT. За­тем мы при­сваи­ва­ем имя фай­ла жур­на­ла, в ко­то­рый Procmail бу­дет запи­сы­вать от­ла­доч­ную ин­фор­ма­цию, пе­ре­мен­ной LOGFILE. Уста­нов­ка VERBOSE в yes га­ран­ти­ру­ет, что Procmail со­хранит под­роб­ную запись сво­их дей­ствий – это по­мо­га­ет в от­лад­ке сво­их ре­цеп­тов. Пе­ре­мен­ная PATH за­да­ет пап­ку, где Procmail ищет все про­грам­мы, нуж­ные ему как часть ре­цеп­та. На­при­мер, вам по­тре­бу­ет­ся про­иг­ры­ва­тель, что­бы воспро­из­ве­сти бравур­ный марш при по­лу­чении то­го дол­го­ждан­но­го пред­ло­жения о ра­бо­те.

Ка­ж­дый из ре­цеп­тов мо­жет со­дер­жать про­из­воль­ное ко­ли­че­ство пра­вил для вы­бо­ра со­об­щений. Они вклю­ча­ют от­пра­ви­те­ля или по­лу­ча­те­ля, те­му со­об­щения или да­же его со­дер­жи­мое. Как толь­ко со­об­щение ото­бра­но на осно­ве оп­ре­де­лен­ных ва­ми пра­вил, мож­но за­ста­вить Procmail вы­полнить над ним оп­ре­де­лен­ные дей­ствия: на­при­мер, пе­ре­местить в за­дан­ную пап­ку, от­ве­тить от­пра­ви­те­лю, пе­ре­на­пра­вить со­об­щение на дру­гой ад­рес и т. д.

Ана­то­мия ре­цеп­та

Ка­ж­дый ре­цепт Procmail со­сто­ит из трех частей. Все ре­цеп­ты долж­ны на­чи­нать­ся с сим­во­ла двое­то­чия (:). Сле­дую­щая за этой стро­ка со­дер­жит усло­вия или пра­ви­ла от­бо­ра со­об­щений, и, на­конец, тре­тья стро­ка го­во­рит Procmail, ка­кое дей­ствие пред­при­нять, ес­ли най­де­но со­об­щение, со­от­вет­ствую­щее пра­ви­лам в ре­цеп­те.

:0:
* ^From:.*(linuxlala\@yahoo\.co\.in|geekybodhi@gmail\.com)
$MAILDIR/family

Этот ре­цепт ве­лит Procmail про­ве­рить все вхо­дя­щие пись­ма на со­от­вет­ствие усло­вию (вто­рая стро­ка) и пе­ре­местить все пись­ма, удов­ле­тво­ряю­щие усло­вию, в ка­та­лог family. Пра­ви­ла на­чи­на­ют­ся с сим­во­ла *. ^From — встро­ен­ный мак­рос Procmail. ^To_ и ^Subject – по­хо­жие встро­ен­ные мак­ро­сы, ко­то­рые об­лег­ча­ют по­иск со­от­вет­ствую­щих со­об­щений. Стро­ка, сле­дую­щая за стро­кой усло­вия – стро­ка дей­ствия. В боль­шин­стве слу­ча­ев стро­ки дей­ствия про­сто го­во­рят Procmail, в ка­кую пап­ку по­местить со­об­щения.

За­ме­ти­ли сим­вол | в стро­ке усло­вия? Он необ­хо­дим в тех слу­ча­ях, когда в усло­вие нуж­но до­ба­вить несколь­ко про­ве­рок. Здесь мы хо­тим про­ве­рить на со­от­вет­ствие усло­вию ^From мно­же­ство ад­ре­сов. По­это­му все со­об­щения с ад­ре­сов linuxlala@yahoo.co.in и geekybodhi@gmail.com бу­дут достав­ле­ны в пап­ку family.

По­ря­док ре­цеп­тов в фай­ле ~/.procmailrc очень ва­жен. Все вхо­дя­щие со­об­щения про­ве­ря­ют­ся на со­от­вет­ствие при­ве­ден­ным ре­цеп­там, по­ка не об­на­ру­жит­ся сов­па­дение. И как толь­ко со­общение удов­ле­тво­рит усло­вию ре­цеп­та, над ним немед­лен­но вы­пол­ня­ют­ся дей­ствия. По­это­му ре­цепт по умол­чанию идет по­следним в спи­ске. Так, ес­ли ка­кое-то со­об­щение со­от­вет­ству­ет бо­лее чем од­но­му ре­цеп­ту, бу­дут вы­полнены дей­ствия пер­во­го ре­цеп­та из фай­ла ~/.procmailrc, а до дру­гих ре­цеп­тов де­ло никогда не дой­дет.

В стро­ке дей­ствия не нуж­но ука­зы­вать пол­ный путь до ка­та­ло­га, как это сде­ла­ли мы. Ес­ли вы уже оп­ре­де­ли­ли пе­ре­мен­ную $MAILDIR, доста­точ­но ис­поль­зо­вать family вме­сто $MAILDIR/family. Со­от­вет­ствую­щие со­об­щения все рав­но по­па­дут в долж­ную пап­ку, неза­ви­си­мо от то­го, ука­зан ли пол­ный путь или толь­ко имя ка­та­ло­га.

Так­же об­ра­ти­те внимание на сим­вол \ пе­ред @ и . в ад­ре­се элек­трон­ной поч­ты, так как два этих сим­во­ла – рег­ла­мен­ти­ро­ван­ные клю­че­вые сло­ва.

Над пись­мом мож­но вы­полнить несколь­ко про­ве­рок, что­бы га­ран­ти­ро­вать от­сут­ствие лож­ных сра­ба­ты­ваний. Сле­дую­щий ре­цепт про­ве­рит по­ля From и Subject пе­ред вы­полнением дей­ствий над со­от­вет­ствую­щи­ми со­об­щения­ми.

:0:
* ^Subject:.*techrepublic
^From:techrepublic@direct.cnet.com
$MAILDIR/lists/techrepublic

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

# forward French lessons to a friend
#and also keep a copy
:0
* ^Subject:.*(French)
{
:0 c
! myfriend@buddy.com
:0
learning
}


Здесь вме­сто стро­ки дей­ствия ис­поль­зу­ет­ся вло­жен­ный блок (за­клю­чен в фи­гур­ные скоб­ки). В него мож­но по­местить несколь­ко ре­цеп­тов, ко­то­рые бу­дут при­ме­нять­ся толь­ко в том слу­чае, ес­ли со­об­щение со­от­вет­ству­ет ро­ди­тель­ско­му ре­цеп­ту. Ро­ди­тель­ский ре­цепт в дан­ном слу­чае – про­вер­ка на­ли­чия сло­ва ‘French’ в лю­бом месте стро­ки те­мы.

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

Об­ра­бот­ка спа­ма

По­ня­тие спа­ма или неже­ла­тель­ных со­об­щений мо­жет от­ли­чать­ся у раз­ных лю­дей. Мне не нра­вят­ся вло­жения PPT, по­это­му та­кие пись­ма все­гда от­бра­сы­ва­ют­ся. Так­же иг­но­ри­ру­ют­ся пись­ма, те­ма ко­то­рых напи­са­на за­глав­ны­ми бу­к­ва­ми, согласно ре­цеп­ту, приведенному ниже:

:0
* ^Subject: [A-Z]
/dev/null

Вто­рой спо­соб – соз­дать «бе­лый спи­сок» из­вест­ных и до­ве­рен­ных ад­ре­са­тов и со­хра­нять в сво­ем ящи­ке со­об­ще­ния толь­ко от них:


# Check my whitelist
:0:
* ? formail -x”From” -x”From:” -x”Sender:” -x”X-Sender:”
-x”Reply-To:” -x”Return-Path” -x”To:” | egrep -i -f $HOME/.trusted
$MAILDIR/trusted

В этом ре­цеп­те мы вы­де­ля­ем толь­ко ука­зан­ные за­го­лов­ки с по­мо­щью Formail и пе­ре­да­ем их ути­ли­те egrep, ко­то­рая за­тем сравнива­ет их с ад­ре­са­ми, пе­ре­чис­лен­ны­ми в фай­ле .trusted. Formail – внеш­няя ути­ли­та, ис­поль­зуе­мая для об­ра­бот­ки со­об­щений и вы­де­ления ин­фор­ма­ции из их за­го­лов­ков; в на­шем ре­цеп­те ее вы­вод пе­ре­да­ет­ся egrep. Файл ~/.trusted со­дер­жит спи­сок всех до­ве­рен­ных ад­ре­сов, а ключ -i в вы­зо­ве egrep де­ла­ет сравнение нечув­стви­тель­ным к ре­ги­ст­ру.

В по­ряд­ке аль­тер­на­ти­вы мож­но под­дер­жи­вать спи­сок из­вест­ных на­ру­ши­те­лей и соз­дать ре­цепт, уда­ляю­щий все со­об­щения от них: про­сто за­мените файл .trusted на .spammers и от­правь­те со­об­щения в /dev/null вме­сто $MAILDIR/trusted. Но помните, что эти со­об­щения нель­зя бу­дет восста­но­вить или про­смот­реть поз­же – они ут­ра­тят­ся на­все­гда. Так­же, по­сколь­ку эти со­об­щения не пи­шут­ся в файл, бло­ки­ров­ки не тре­бу­ет­ся, по­это­му начните ре­цепт с :0 вме­сто :0:.

Ес­ли вы хо­ти­те еще тща­тельнее об­ра­ба­ты­вать спам, на­строй­те Procmail для со­вме­ст­ной ра­бо­ты со SpamAssassin; тогда пе­ред на­строй­кой Procmail нуж­но уста­но­вить SpamAssassin. По­сле его уста­нов­ки соз­дай­те файл /etc/procmailrc, что­бы пе­ре­на­пра­вить все вхо­дя­щие со­об­щения в SpamAssassin:

#Send message to SpamAssassin
:0 fw
* < 256000
| /usr/bin/spamc

Па­ра­метр fw в стро­ке с двое­то­чи­ем оз­на­ча­ет для Procmail, что этот ре­цепт яв­ля­ет­ся фильт­ром и мо­жет из­менить ис­ход­ное со­об­щение. В стро­ке усло­вия мы ищем со­об­щения, мень­шие 256 КБ по раз­ме­ру, так как спам-со­об­щения обыч­но неве­ли­ки. Это по­мо­жет нам из­бе­жать про­вер­ки всех со­об­щений, сэ­ко­но­мив немно­го ре­сур­сов. В треть­ей стро­ке мы пе­ре­да­ем со­об­щение SpamAssassin.

Когда SpamAssassin иден­ти­фи­ци­ру­ет со­об­щение как спам, он впи­сы­ва­ет в по­ле с его те­мой спе­ци­аль­ный тэг. Итак, те­перь вы мо­же­те до­ба­вить сле­дую­щий ре­цепт в фай­ле ~/.procmailrc:

:0H:
* ^X-Spam-Status:.*Yes
spam

Мож­но бы­ло бы точ­но так же на­пра­вить со­об­щение в /dev/null, но луч­ше со­хранить его в локаль­ном ка­та­ло­ге: так вы смо­же­те про­смот­реть его со­дер­жи­мое, что­бы убе­дить­ся, что ни од­но со­об­щение не бы­ло оши­боч­но по­ме­че­но как спам.

На­строй­ка ав­то­от­вет­чи­ка

В Procmail очень часто ис­поль­зу­ет­ся функ­ция ав­то­от­вет­чи­ка, из­вест­но­го так­же как от­вет на вре­мя от­пуска или auto-reply. В его осно­ве – ути­ли­та vacation, и ес­ли она еще не уста­нов­ле­на в ва­шей систе­ме, по­ра это сде­лать. За­тем соз­дай­те в сво­ем до­машнем ка­та­ло­ге файл .vacation и вве­ди­те ту­да со­об­щение – про­сто «Я в от­пуске. Про­чту ва­ше со­об­щение, когда вер­нусь. Уда­чи!» ли­бо нечто бо­лее ви­тие­ва­тое. Со­храните файл .vacation; те­перь соз­дай­те ре­цепт для ав­то­от­вет­чи­ка:

:0 Whc: vacation.lock
* .*for <linuxlala@gmail.com>
* !^FROM_DAEMON
* !^X-Loop: linuxlala@gmail.com
# Store sender’s address in vacation.cache
| formail -rD 8192 vacation.cache
# If sender’s address not in cache, send
# mail containing vacation message.
:0 ehc
| (formail -rA”Precedence: junk” \
-A”X-Loop: linuxlala@gmail.com” ; \
cat ~/.vacation \
) | /usr/lib/sendmail -oi -t


Воз­мож­но, ре­цепт не со­всем по­ня­тен, но ес­ли раз­бить его на две части, все бу­дет оче­вид­но. Рас­смот­рим пер­вый ре­цепт. В нем па­ра­метр Whc обес­пе­чи­ва­ет три ве­щи. W ожи­да­ет воз­вра­щения из Formail, h обо­зна­ча­ет по­иск в за­го­лов­ках, а c ве­лит Procmail со­хранить ко­пию со­об­щения.

Да­лее идут три стро­ки усло­вия. Пер­вая га­ран­ти­ру­ет, что в от­вет на пись­ма, при­слан­ные вам, бу­дет вы­сы­лать­ся от­вет­ное пись­мо.

* .*for <linuxlala@gmail.com>

Вто­рая пре­дот­вра­ща­ет от­прав­ку от­ве­та в спи­ски рас­сыл­ки.

* !^FROM_DAEMON

Тре­тья пре­дот­вра­ща­ет от­прав­ку от­ве­та на пись­ма, от­прав­лен­ные са­мо­му се­бе.

* !^X-Loop: linuxlala@gmail.com

В сле­дую­щей стро­ке мы ве­лим Formail со­хра­нить ад­рес от­пра­ви­те­ля в фай­ле vacation.cache.

Сле­дую­щий ре­цепт на­чи­на­ет­ся с :0 ehc. e оз­на­ча­ет, что дан­ный ре­цепт вы­полнит­ся толь­ко в том слу­чае, ес­ли пер­вый ре­цепт ска­жет, что в фай­ле vacation.cache нет ад­ре­са от­пра­ви­те­ля. За­тем мы ве­лим Sendmail от­пра­вить со­об­щение .vacation от­пра­ви­те­лю.

Эти два ре­цеп­та га­ран­ти­ру­ют, что от­пра­ви­те­ли не бу­дут по­лу­чать ав­то­от­вет на ка­ж­дое от­прав­лен­ное нам пись­мо: раз их ад­ре­са по­па­ли в кэш, ав­то­от­ве­ты боль­ше не от­прав­ля­ют­ся. За­гляните в man procmailex и в man-страницу Procmail для бо­лее под­роб­ной ин­фор­ма­ции об ав­то­от­вет­чи­ках, за­тем от­кинь­тесь на спин­ку крес­ла и рас­слабь­тесь в жиз­ни, сво­бод­ной от спа­ма.

Ко­гда бло­ки­ро­вать фай­лы

Бло­ки­ров­ка фай­лов – функ­ция Procmail, по­зво­ляю­щая из­бе­жать пор­чи со­об­ще­ний во вре­мя дос­тав­ки. Пред­ставь­те, что Procmail од­но­вре­мен­но нуж­но за­пи­сать два со­об­ще­ния в файл. Ко­гда это про­ис­хо­дит, есть риск то­го, что два со­об­ще­ния соз­да­дут пу­та­ни­цу в фор­ма­те mailbox. Что­бы это­го из­бе­жать, на­чи­най­те ре­цепт с :0:. За­вер­шаю­щее двое­то­чие га­ран­ти­ру­ет, что толь­ко од­но со­об­ще­ние бу­дет за­пи­сы­вать­ся в файл в один мо­мент вре­ме­ни.

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

Ре­гексп на гар­нир

Ре­гу­ляр­ные вы­ра­же­ния [regex] – не­отъ­ем­ле­мая часть фай­ла ~/.procmailrc. Ес­ли ис­поль­зо­вать их со зна­ни­ем де­ла, они су­ще­ст­вен­но по­вы­ша­ют эф­фек­тив­ность ре­цеп­тов. Сле­дую­щий ре­цепт ищет в те­ле со­об­ще­ния фра­зу и пе­ре­ме­ща­ет его в за­дан­ную пап­ку.

:0B:
* [0-9]+ Wassup
$MAILDIR/silly

Най­дя сло­во ‘wassup’, пред­ва­рен­ное од­ной или бо­лее циф­ра­ми, в лю­бом мес­те те­ла со­об­ще­ния, Procmail пе­ре­мес­тит со­об­ще­ние в пап­ку silly.

Вы­бор поч­то­во­го ящи­ка

При вы­бо­ре фор­ма­та поч­то­во­го ящи­ка есть два ва­ри­ан­та: mbox и maildir. В при­ме­рах нашего уро­ка мы поль­зу­ем­ся ти­пом mbox, оп­ре­де­лен­ном в ~/.procmailrc как MAILDIR=$HOME/Mail и DEFAULT=$MAILDIR/new. Ес­ли бы мы до­ба­ви­ли за­мы­каю­щий слэш в ко­нец пу­ти, как в $HOME/Mail/ и $MAILDIR/new/, у нас по­лу­чил­ся бы тип maildir.

В поч­то­вом ящи­ке ти­па mbox все со­об­ще­ния хра­нят­ся в тек­сто­вом фор­ма­те в од­ном фай­ле; на­ча­ло со­об­ще­ния от­ме­ча­ет­ся стро­кой From, а ко­нец со­об­ще­ния – пус­той стро­кой.

Фор­мат maildir под­ра­зу­ме­ва­ет хра­не­ние со­об­ще­ний в от­дель­ных фай­лах в ка­та­ло­гах cur, new и tmp; при не­об­хо­ди­мо­сти они пе­ре­ме­ща­ют­ся из ка­та­ло­га в ка­та­лог.

Персональные инструменты
купить
подписаться
Яндекс.Метрика