PROCMAILEX(5)

الاسم
procmailex - أمثلة ملفات rc لـ procmail

موجز
$HOME/.procmailrc أمثلة

الوصف
لوصف تنسيق ملف rc، انظر procmailrc(5).

توصَف تقنية التسجيل الموزون بالتفصيل في صفحة دليل procmailsc(5).

تعرض صفحة الدليل هذه عدة وصفات أمثلة. لأمثلة على ملفات rc كاملة، يمكنك مراجعة قسم الملاحظات في procmail(1)، أو النظر إلى ملفات rc الأمثلة في /usr/share/doc/procmail/examples.

أمثلة
افرز كل البريد الوارد من القائمة البريدية scuba-dive إلى مجلد البريد scubafile (يستخدم ملف القفل المحلي scubafile.lock).

    :0: * ^TOscuba scubafile

أعد توجيه كل البريد من peter حول المترجمات إلى william (واحتفظ بنسخة منه هنا في petcompil).

    :0 * ^From.*peter * ^Subject:.*compilers {
       :0 c
       ! william@somewhere.edu

       :0
       petcompil }

حل مكافئ يحقق نفس الشيء:

    :0 c * ^From.*peter * ^Subject:.*compilers ! william@somewhere.edu

       :0 A
       petcompil

حل مكافئ، لكنه أبطأ قليلاً، يحقق نفس الشيء:

    :0 c * ^From.*peter * ^Subject:.*compilers ! william@somewhere.edu

    :0 * ^From.*peter * ^Subject:.*compilers petcompil

إذا كنت جديدًا نسبيًا على procmail وتخطط للتجربة قليلاً، فغالبًا ما يساعد وجود نوع من شبكة الأمان. إدراج الوصفتين التاليتين فوق جميع الوصفات الأخرى يضمن أنه من بين كل البريد الواصل، سيتم دائمًا الاحتفاظ بآخر 32 رسالة. لكي يعمل كما هو مقصود، يجب عليك إنشاء دليل باسم `backup' في $MAILDIR قبل إدراج هاتين الوصفتين.

    :0 c backup

    :0 ic | cd backup && rm -f dummy `ls -t msg.* | sed -e 1,32d`

إذا كان نظامك لا يُنشئ أو يُنشئ أسطر `From ' البادئة بشكل غير صحيح على كل بريد، يمكنك إصلاح ذلك باستدعاء procmail مع الخيار -f-. لإصلاح نفس المشكلة بوسائل مختلفة، كان بإمكانك إدراج الوصفتين التاليتين فوق جميع الوصفات الأخرى في ملف rc الخاص بك. سيقومان بتصفية رأس أي بريد عبر formail الذي سيزيل أي `From ' بادئة، ويعيد إنشائها آليًا لاحقًا.

    :0 fhw | formail -I "From " -a "From "

أضف رؤوس جميع الرسائل التي لم تأت من مدير البريد إلى مجموعتك الخاصة من الرؤوس (للإحصائيات أو تصحيح البريد)؛ واستخدم ملف القفل `headc.lock`. لضمان عدم إزالة ملف القفل حتى انتهاء الأنبوب، يجب تحديد الخيار `w`؛ وإلا فسيُزال ملف القفل بمجرد قبول الأنبوب للبريد.

    :0 hwc: * !^FROM_MAILER | uncompress headc.Z; cat >>headc; compress headc

أو، إذا كنت ستستخدم gzip الأكثر كفاءة بدلاً من compress:

    :0 hwc: * !^FROM_MAILER | gzip >>headc.gz

أعد توجيه جميع الرسائل الأقصر من 1000 بايت إلى عنوان منزلي (لا حاجة لملف قفل في هذه الوصفة).

    :0 * < 1000 ! myname@home

قسّم الملخصات الواردة من القائمة البريدية surfing إلى رسائلها الفردية، وخزّنها في surfing، باستخدام surfing.lock كملف قفل محلي.

    :0: * ^Subject:.*surfing.*Digest | formail +1 -ds >>surfing

خزّن كل ما يأتي من مدير البريد أو خادم البريد (مثل البريد المرتد) في الملف postm، باستخدام postm.lock كملف قفل محلي.

    :0: * ^FROM_MAILER postm

وصفة رد آلي بسيطة. تضمن هذه الوصفة عدم الرد آليًا على أي بريد من أي خادم (مثل البريد المرتد أو البريد من القوائم البريدية)، ولا على الردود الآلية القادمة منك. إذا لم تُتخذ هذه الاحتياطات، فقد يحدث كارثة (بريد `رنين`). لكي ترد هذه الوصفة آليًا على جميع البريد الوارد، يجب بالطبع إدراجها قبل جميع الوصفات الأخرى في ملف rcfile الخاص بك. ومع ذلك، يُنصح بوضعها بعد أي وصفات تعالج البريد من القوائم البريدية المشترك فيها؛ فليس من الجيد عمومًا إنشاء ردود آلية للقوائم البريدية (نعم، يجب أن يلتقط التعبير النمطي !^FROM_DAEMON تلك بالفعل، ولكن إذا لم تتبع القائمة البريدية الاصطلاحات المقبولة، فقد لا يكون هذا كافيًا).

    :0 h c * !^FROM_DAEMON * !^X-Loop: your@own.mail.address | (formail -r -I"Precedence: junk" \
        -A"X-Loop: your@own.mail.address" ; \
       echo "Mail received.") | $SENDMAIL -t

وصفة رد آلي أكثر تعقيدًا تطبق المكافئ الوظيفي لبرنامج vacation(1) المعروف. تستند هذه الوصفة إلى نفس مبادئ الوصفة السابقة (منع بريد `الرنين`). بالإضافة إلى ذلك، تحتفظ بقاعدة بيانات إجازة عن طريق استخراج اسم المرسل وإدراجه في ملف vacation.cache إذا كان الاسم جديدًا (يُحافظ على ملف vacation.cache بواسطة formail الذي يضمن احتوائه دائمًا على أحدث الأسماء، ويقتصر حجم الملف على حد أقصى يبلغ حوالي 8192 بايت). إذا كان الاسم جديدًا، فسيُرسل رد آلي.

كما ترى، تحتوي الوصفة التالية على تعليقات بين الشروط. هذا مسموح به. لكن لا تضع تعليقات على نفس سطر الشرط.

    SHELL=/bin/sh # للأصداف الأخرى، قد يحتاج هذا إلى تعديل

    :0 Whc: vacation.lock
     # Perform a quick check to see if the mail was addressed to us * $^To:.*\<$\LOGNAME\>
     # Don't reply to daemons and mailinglists * !^FROM_DAEMON
     # Mail loops are evil * !^X-Loop: your@own.mail.address | formail -rD 8192 vacation.cache

      :0 ehc # if the name was not in the cache
      | (formail -rI"Precedence: junk" \
           -A"X-Loop: your@own.mail.address" ; \
         echo "I received your mail,"; \
         echo "but I won't be back until Monday."; \
         echo "-- "; cat $HOME/.signature \
        ) | $SENDMAIL -oi -t

خزّن جميع الرسائل المتعلقة بـ TeX في أسماء ملفات فريدة منفصلة، في دليل باسم texmail (يجب أن يكون هذا الدليل موجودًا)؛ لا حاجة لاستخدام ملفات قفل في هذه الحالة، لذا لن نستخدمها.

    :0 * (^TO|^Subject:.*)TeX[^t] texmail

نفس ما سبق، باستثناء أننا الآن نخزن الرسائل في ملفات مرقمة (مجلد بريد MH).

    :0 * (^TO|^Subject:.*)TeX[^t] texmail/.

أو يمكنك حفظ البريد في عدة مجلدات دليل في نفس الوقت. ستقوم الوصفة التالية بتسليم البريد إلى مجلدين من نوع MH ومجلد دليل واحد. إنه في الواقع ملف واحد مع رابطين صلبين إضافيين.

    :0 * (^TO|^Subject:.*)TeX[^t] texmail/. wordprocessing dtp/.

خزّن جميع الرسائل حول الاجتماعات في مجلد موجود في دليل يتغير كل شهر. مثلاً، إذا كان يناير 1994، فسيكون اسم المجلد `94-01/meeting` وملف القفل المحلي `94-01/meeting.lock`.

    :0: * meeting `date +%y-%m`/meeting

نفس ما سبق، ولكن إذا لم يكن الدليل `94-01` موجوداً، فسيُنشأ آلياً:

    MONTHFOLDER=`date +%y-%m`

    :0 Wic * ? test ! -d $MONTHFOLDER | mkdir $MONTHFOLDER

    :0: * meeting ${MONTHFOLDER}/meeting

نفس ما سبق، ولكن الآن بوسائل مختلفة قليلاً:

    MONTHFOLDER=`date +%y-%m` DUMMY=`test -d $MONTHFOLDER || mkdir $MONTHFOLDER`

    :0: * meeting ${MONTHFOLDER}/meeting

إذا كنت مشتركاً في عدة قوائم بريدية ويقوم الأشخاص بنشر متقاطع لبعضها، فعادةً ما تتلقى عدة رسائل مكررة (واحدة من كل قائمة). الوصفة البسيطة التالية تلغي الرسائل المكررة. تخبر formail بالاحتفاظ بملف خبيئة بحجم 8 كيلوبايت يخزن فيه معرفات الرسائل لأحدث الرسائل التي تلقيتها. نظراً لأن معرفات الرسائل مضمونة لتكون فريدة لكل بريد جديد، فهي مناسبة تماماً لاستبعاد الرسائل المكررة. ببساطة ضع الوصفة التالية في أعلى ملف rcfile الخاص بك، ولن تمر أي رسالة مكررة من خلالها.

    :0 Wh: msgid.lock | formail -D 8192 msgid.cache

احذر إذا كانت لديك مشاكل في التسليم في وصفات أسفل هذه الوصفة وحاول procmail إعادة وضع البريد في الطابور، ففي تشغيل الطابور التالي، سيُعتبر هذا البريد مكرراً وسيُتخلص منه. لمن ليسوا واثقين تماماً من قدراتهم في كتابة النصوص البرمجية، يمكنك استخدام الوصفة التالية بدلاً من ذلك. تضع المكررات في مجلد منفصل بدلاً من التخلص منها. الأمر متروك لك لتفريغ المجلد دورياً بالطبع.

    :0 Whc: msgid.lock | formail -D 8192 msgid.cache

    :0 a: duplicates

يمكن لـ procmail التسليم إلى مجلدات MH مباشرة، لكنه لا يحدّث التسلسلات غير المرئية التي يديرها MH الحقيقي. إذا أردت أن يحدّث procmail تلك أيضًا، استخدم وصفة مثل التالية التي ستضع كل ما يحتوي على كلمة spam في جسم البريد في مجلد MH يُدعى spamfold. لاحظ ملف القفل المحلي، وهو ضروري لأن برامج MH لا تقفل ملف التسلسلات. قد تؤدي الاستدعاءات غير المتزامنة لبرامج MH التي تغير ملف التسلسلات إلى إفساده أو فقدان التغييرات بصمت. لسوء الحظ، لا يحل ملف القفل المشكلة تماماً حيث يمكن استدعاء rcvstore أثناء تشغيل `show` أو `mark` أو أي برنامج MH آخر. من المتوقع إصلاح هذه المشكلة في إصدار مستقبلي من MH، ولكن حتى ذلك الحين، سيتعين عليك الموازنة بين خطر فقدان أو إفساد التسلسلات مقابل فوائد التسلسل غير المرئي.

    :0 :spamfold/$LOCKEXT * B ?? spam | rcvstore +spamfold

عند التسليم إلى مجلدات emacs (أي مجلدات البريد التي يديرها أي حزمة بريد emacs، مثل RMAIL أو VM) مباشرة، يجب استخدام ملفات قفل متوافقة مع emacs. برامج البريد في emacs معطوبة قليلاً في هذا الصدد، فهي تنزعج جداً إذا قام شخص بالتسليم إلى مجلدات بريد موجودة بالفعل في مخازنها الداخلية. تفترض الوصفة التالية أن $HOME يساوي /home/john.

    MAILDIR=Mail

    :0:/usr/local/lib/emacs/lock/!home!john!Mail!mailbox * ^Subject:.*whatever mailbox

بدلاً من ذلك، يمكنك جعل procmail يُسلّم إلى مجموعته الخاصة من صناديق البريد، والتي تُفرغها دوريًا وتنسخها إلى ملفات emacs باستخدام movemail. يستخدم Movemail ملفات قفل محلية mailbox.lock لكل صندوق بريد. هذا هو في الواقع وضع التشغيل المفضل بالتزامن مع procmail.

لاستخراج رؤوس معينة من بريد ووضعها في متغيرات البيئة، يمكنك استخدام أي من التركيبات التالية:

    SUBJECT=`formail -xSubject:` # حقل عادي FROM=`formail -rt -xTo:` # حالة خاصة

    :0 h # طريقة بديلة KEYWORDS=| formail -xKeywords:

إذا كنت تستخدم ملفات مؤقتة في ملف procmailrc، وتريد التأكد من إزالتها قبل خروج procmail مباشرة، يمكنك استخدام شيء على غرار:

    TEMPORARY=$HOME/tmp/pmail.$$ TRAP="/bin/rm -f $TEMPORARY"

يمكن استخدام الكلمة المفتاحية TRAP أيضًا لتغيير رمز الخروج لـ procmail. أي إذا أردت أن يُرجع procmail رمز خروج `1' بدلاً من رموز الخروج العادية، يمكنك استخدام:

    EXITCODE="" TRAP="exit 1;" # The trailing semi-colon is important
                     # since exit is not a standalone program

أو، إذا كان رمز الخروج لا يحتاج إلى الاعتماد على البرامج التي تُشغّل من TRAP، يمكنك استخدام مجرد:

    EXITCODE=1

الوصفة التالية تطبع كل بريد وارد يبدو كملف postscript.

    :0 Bb * ^^%! | lpr

الوصفة التالية تفعل نفس الشيء، لكنها أكثر انتقائية. تطبع ملف postscript فقط إذا جاء من خادم الطباعة. الشرط الأول يُطابق فقط إذا وُجد في الرأس. الشرط الثاني يُطابق فقط في بداية الجسم.

    :0 b * ^From[ :].*print-server * B ?? ^^%! | lpr

نفس ما سبق، ولكن الآن بوسائل مختلفة قليلاً:

    :0 * ^From[ :].*print-server {
      :0 B b
      * ^^%!
      | lpr }

وبالمثل:

    :0 HB b * ^^(.+$)*From[ :].*print-server * ^^(.+$)*^%! | lpr

افترض أن لديك حسابين، تستخدم كلا الحسابين بانتظام، لكنهما في مكانين مختلفين جدًا (أي يمكنك فقط قراءة البريد الذي وصل إلى أي من الحسابين). تريد إعادة توجيه البريد الواصل إلى الحساب الأول إلى الحساب الثاني، والعكس صحيح. أول ما يتبادر إلى الذهن هو استخدام ملفات .forward في كلا الموقعين؛ هذا لن يعمل بالطبع، لأنك ستُحدث حلقة بريدية. يمكن تجنب حلقة البريد هذه بإدراج الوصفة التالية أمام جميع الوصفات الأخرى في ملفات $HOME/.procmailrc في كلا الموقعين. إذا تأكدت من إضافة نفس حقل X-Loop: في كلا الموقعين، يمكن الآن إعادة توجيه البريد بأمان إلى الحساب الآخر من أي منهما.

    :0 c * !^X-Loop: yourname@your.main.mail.address | formail -A "X-Loop: yourname@your.main.mail.address" | \
       $SENDMAIL -oi yourname@the.other.account

إذا أرسل لك شخص ما بريدًا يحتوي على كلمة `retrieve` في الموضوع، فسيقوم التالي آليًا بإعادة محتويات info_file إلى المرسل. كما هو الحال في جميع الوصفات التي نرسل فيها بريدًا، نراقب حلقات البريد.

    :0 * !^From +YOUR_USERNAME * !^Subject:.*Re: * !^FROM_DAEMON * ^Subject:.*retrieve | (formail -r ; cat info_file) | $SENDMAIL -oi -t

يتبع الآن مثال لخادم ملفات بسيط جدًا يمكن الوصول إليه عبر البريد. للتطبيقات الأكثر تطلبًا، أقترح عليك إلقاء نظرة على SmartList (متاح من نفس مكان توزيعة procmail). كما هو مدرج، يعيد خادم الملفات هذا ملفًا واحدًا على الأكثر لكل طلب، ويتجاهل نص البريد الوارد، ويجب أن يبدو سطر الموضوع كالتالي "Subject: send file the_file_you_want" (الفراغات مهمة)، ولا يعيد الملفات التي تبدأ أسماؤها بنقطة، ولا يسمح باسترجاع الملفات الموجودة خارج شجرة دليل خادم الملفات (إذا قررت تعديل هذا المثال، تأكد من عدم تخفيف هذا القيد الأخير عن غير قصد).

    :0 * ^Subject: send file [0-9a-z] * !^X-Loop: yourname@your.main.mail.address * !^Subject:.*Re: * !^FROM_DAEMON * !^Subject: send file .*[/.]\. {
      MAILDIR=$HOME/fileserver # chdir to the fileserver directory

      :0 fhw # reverse mailheader and extract name
      * ^Subject: send file \/[^ ]*
      | formail -rA "X-Loop: yourname@your.main.mail.address"

      FILE="$MATCH" # the requested filename

      :0 ah
      | cat - ./$FILE 2>&1 | $SENDMAIL -oi -t }

يقوم المثال التالي بتحويل مسبق لجميع البريد النصي العادي الوارد بتنسيقات MIME مشفرة معينة إلى تنسيق 8 بت أكثر ضغطًا يمكن استخدامه وعرضه بسهولة أكبر بواسطة معظم البرامج. برنامج mimencode(1) هو جزء من حزمة metamail الخاصة بناثانيال بورنشتاين.

    :0 * ^Content-Type: *text/plain {
      :0 fbw
      * ^Content-Transfer-Encoding: *quoted-printable
      | mimencode -u -q

         :0 Afhw
         | formail -I "Content-Transfer-Encoding: 8bit"

      :0 fbw
      * ^Content-Transfer-Encoding: *base64
      | mimencode -u -b

         :0 Afhw
         | formail -I "Content-Transfer-Encoding: 8bit" }

المثال التالي غريب نوعًا ما، لكنه يخدم فقط لعرض ميزة. افترض أن لديك ملفًا في دليل HOME الخاص بك يسمى ".urgent"، والشخص (الواحد) المسمى في ذلك الملف هو مرسل بريد وارد، وتريد تخزين هذا البريد في $MAILDIR/urgent بدلاً من أي من مجلدات البريد العادية التي كان سيتم فرزها فيها. إذن هذا ما يمكنك فعله (انتبه، يجب أن يكون طول ملف $HOME/.urgent أقل بكثير من $LINEBUF، قم بزيادة LINEBUF إذا لزم الأمر):

    URGMATCH=`cat $HOME/.urgent`

    :0: * $^From.*${URGMATCH} urgent

تطبيق مختلف تمامًا لـ procmail هو تطبيق المرشحات بشكل شرطي على نص أو بريد معين (صادر). مثال نموذجي هو مرشح تقوم بتوجيه جميع البريد الصادر من خلاله، للتأكد من أنه سيتم ترميزه بتنسيق MIME فقط إذا كان بحاجة إلى ذلك. أي في هذه الحالة يمكنك بدء procmail في منتصف أنبوب مثل:

    cat newtext | procmail ./mimeconvert | mail chris@where.ever

يمكن أن يحتوي ملف rc الخاص بـ mimeconvert على شيء مثل (يجب استبدال =0x80= و =0xff= بالأحرف الحقيقية ذات 8 بت):

    DEFAULT=| # pipe to stdout instead of
                  # delivering mail as usual :0 Bfbw * [=0x80=-=0xff=] | mimencode -q

      :0 Afhw
      | formail -I 'MIME-Version: 1.0' \
         -I 'Content-Type: text/plain; charset=ISO-8859-1' \
         -I 'Content-Transfer-Encoding: quoted-printable'

انظر أيضًا
procmail(1)، procmailrc(5)، procmailsc(5)، sh(1)، csh(1)، mail(1)، mailx(1)، uucp(1)، aliases(5)، sendmail(8)، egrep(1)، grep(1)، biff(1)، comsat(8)، mimencode(1)، lockfile(1)، formail(1)

المؤلفون
ستيفن ر. فان دن بيرج
    <srb@cuci.nl>
Philip A. Guenther
    <guenther@sendmail.com>

ترجمة
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.