PCRE_TABLE(5) File Formats Manual PCRE_TABLE(5)

pcre_table - قالب جدول‌های PCRE در Postfix

postmap -q "string" pcre:/etc/postfix/filename
postmap -q - pcre:/etc/postfix/filename <inputfile
postmap -hmq - pcre:/etc/postfix/filename <inputfile
postmap -bmq - pcre:/etc/postfix/filename <inputfile


سیستم ایمیل Postfix از جدول‌های اختیاری برای بازنویسی آدرس (address rewriting) یا مسیریابی ایمیل (mail routing) استفاده می‌کند. این جدول‌ها معمولاً در قالب‌های lmdb:، cdb:، hash: یا dbm: هستند.

به عنوان جایگزین، جدول‌های جستجو را می‌توان در قالب عبارت‌های باقاعده سازگار با پرل (Perl Compatible Regular Expression یا PCRE) مشخص کرد. در این حالت، هر ورودی با فهرستی از الگوها مقایسه می‌شود. هنگامی که یک تطابق یافت شد، نتیجه مربوطه بازگردانده شده و جستجو پایان می‌یابد.

برای آگاهی از اینکه سیستم Postfix شما از چه نوع جدول‌های جستجویی پشتیبانی می‌کند، از دستور «postconf -m» استفاده کنید.

برای آزمایش جدول‌های جستجو، از دستور «postmap -q» همان‌طور که در بخش خلاصه دستور در بالا شرح داده شد، استفاده کنید. از «postmap -hmq - <file» برای الگوهای header_checks(5) و از «postmap -bmq - <file» برای body_checks(5) (در Postfix نسخه ۲.۶ و بالاتر) استفاده کنید.

این درایور را می‌توان با کتابخانه pcre2 (در Postfix نسخه ۳.۷ و بالاتر) یا با کتابخانه قدیمی pcre (تمام نسخه‌های Postfix) ساخت.

در Postfix نسخه ۲.۲ و قدیمی‌تر، برای پرس‌وجو از جدولی که شامل الگوهای حساس به حروف کوچک و بزرگ است، «postmap -fq» را مشخص کنید. الگوها به‌طور پیش‌فرض به بزرگی و کوچکی حروف حساس نیستند.

قالب کلی یک جدول PCRE به صورت زیر است:

/pattern/flags result
هنگامی که pattern با رشته ورودی مطابقت داشته باشد، از مقدار result مربوطه استفاده می‌شود.
!/pattern/flags result
هنگامی که pattern با رشته ورودی مطابقت نداشته باشد، از مقدار result مربوطه استفاده می‌شود.
اگر رشته ورودی با /pattern/ مطابقت داشته باشد، آن رشته ورودی با الگوهای بین if و endif مقایسه می‌شود. بلوک‌های if..endif می‌توانند تو در تو باشند.

نکته: در ابتدای الگوهای داخل if..endif از نویسه‌های فاصله (whitespace) استفاده نکنید.

این ویژگی در Postfix نسخه ۲.۱ و بالاتر در دسترس است.

اگر رشته ورودی با /pattern/ مطابقت نداشته باشد، آن رشته ورودی با الگوهای بین if و endif مقایسه می‌شود. بلوک‌های if..endif می‌توانند تو در تو باشند.

نکته: در ابتدای الگوهای داخل if..endif از نویسه‌های فاصله (whitespace) استفاده نکنید.

این ویژگی در Postfix نسخه ۲.۱ و بالاتر در دسترس است.

خطوط خالی و کامنت‌ها
خطوط خالی و خطوطی که فقط حاوی نویسه‌های فاصله هستند نادیده گرفته می‌شوند، همان‌طور که خطوطی که اولین نویسه غیرفاصله‌ای آن‌ها «#» است نادیده گرفته می‌شوند.
متن چندخطی
یک خط منطقی با متنی غیر از نویسه‌های فاصله آغاز می‌شود. خطی که با نویسه فاصله آغاز شود ادامه‌دهنده خط منطقی است.

هر الگو یک عبارت باقاعده شبیه به perl است. جداکننده عبارت (delimiter) می‌تواند هر نویسه غیرحرفی-عددی به جز نویسه‌های فاصله یا نویسه‌های دارای معنای خاص باشد (به‌طور سنتی از اسلش «/» استفاده می‌شود). عبارت باقاعده می‌تواند شامل نویسه‌های فاصله باشد.

به‌طور پیش‌فرض، تطابق بدون حساسیت به بزرگی و کوچکی حروف است و خطوط جدید به عنوان نویسه‌های خاص در نظر گرفته نمی‌شوند. این رفتار توسط پرچم‌ها (flags) کنترل می‌شود که با افزودن یک یا چند مورد از نویسه‌های زیر به انتهای الگو فعال یا غیرفعال می‌شوند:

تغییر وضعیت پرچم حساسیت به بزرگی و کوچکی حروف. به‌طور پیش‌فرض، تطابق به بزرگی و کوچکی حروف حساس نیست.
تغییر وضعیت پرچم MULTILINE در pcre. هنگامی که این پرچم روشن است، فرانَویسه‌های (metacharacters) ^ و $ علاوه بر تطابق در ابتدا و انتهای رشته مورد نظر، به ترتیب بلافاصله پس از و بلافاصله قبل از یک نویسه خط جدید (newline) نیز تطابق می‌یابند.
تغییر وضعیت پرچم DOTALL در pcre. هنگامی که این پرچم روشن است، فرانَویسه . با نویسه خط جدید نیز تطابق می‌یابد. در نسخه‌های قبل از ۲.۰ نرم‌افزار Postfix، این پرچم به‌طور پیش‌فرض خاموش بود که برای تطابق سرآیندهای پیام‌های چندخطی نامناسب بود.
تغییر وضعیت پرچم extended در pcre. هنگامی که این پرچم روشن است، نویسه‌های فاصله در الگو (به جز درون یک کلاس نویسه) نادیده گرفته می‌شوند. برای گنجاندن یک نویسه فاصله به عنوان بخشی از الگو، آن را با بک‌اسلش گریز دهید (escape کنید).

نکته: بعد از الگوها از #comment استفاده نکنید.

تغییر وضعیت پرچم ANCHORED در pcre. هنگامی که این پرچم روشن است، الگو مجبور می‌شود «مهار» شود، یعنی فقط در ابتدای رشته‌ای که مورد جستجو قرار می‌گیرد («رشته هدف») تطابق یابد. این اثر را می‌توان با ساختارهای مناسب در خود الگو نیز به دست آورد.
تغییر وضعیت پرچم DOLLAR_ENDONLY در pcre. هنگامی که این پرچم روشن است، فرانَویسه $ در الگو فقط در انتهای رشته هدف تطابق می‌یابد. بدون این پرچم، اگر نویسه پایانی یک نویسه خط جدید باشد، علامت دلار بلافاصله قبل از آن نیز تطابق می‌یابد (اما قبل از سایر نویسه‌های خط جدید تطابق نمی‌یابد). اگر پرچم MULTILINE تنظیم شده باشد، این پرچم نادیده گرفته می‌شود.
تغییر وضعیت پرچم UNGREEDY در pcre. هنگامی که این پرچم روشن است، موتور تطابق الگو «طمع‌ورزی» (greediness) کمیت‌سنج‌ها را معکوس می‌کند، به طوری که به‌طور پیش‌فرض حریصانه نباشند، اما اگر بعد از آن‌ها «?» بیاید حریصانه شوند. این پرچم را می‌توان با تغییردهنده (?U) در داخل الگو نیز تنظیم کرد.
تغییر وضعیت پرچم EXTRA در pcre. هنگامی که این پرچم روشن است، هر بک‌اسلش در الگو که پس از آن حرفی بدون معنای خاص قرار گیرد باعث ایجاد خطا می‌شود؛ بدین ترتیب این ترکیب‌ها برای استفاده‌های آینده رزرو می‌شوند.

این ویژگی در PCRE2 پشتیبانی نمی‌شود.

الگوها به ترتیبی که در جدول مشخص شده‌اند اعمال می‌شوند، تا زمانی که الگویی پیدا شود که با رشته ورودی مطابقت داشته باشد.

هر الگو روی کل رشته ورودی اعمال می‌شود. بسته به کاربرد، آن رشته ممکن است کل نام میزبان سرویس‌گیرنده، کل آدرس IP سرویس‌گیرنده یا کل یک آدرس ایمیل باشد. بنابراین، هیچ جستجویی در دامنه والد یا شبکه والد انجام نمی‌شود و آدرس‌های ایمیل user@domain به بخش‌های تشکیل‌دهنده user و domain تفکیک نمی‌شوند، و همچنین user+foo به user و foo تجزیه نمی‌شود.

جایگزینی زیررشته‌ها (متنی که با الگوهای داخل «()» تطابق دارد) از عبارت تطابق‌یافته در رشته نتیجه با $1، $2 و غیره درخواست می‌شود؛ برای تولید نویسه $ در خروجی، $$ را مشخص کنید. اگر پس از ماکروها در رشته نتیجه، نویسه فاصله نیاید، ممکن است لازم باشد به صورت ${n} یا $(n) نوشته شوند. این ویژگی از نام‌های زیررشته در pcre2 پشتیبانی نمی‌کند.

نکته: از آنجا که الگوهای نفی‌شده (آن‌هایی که با ! شروع می‌شوند) زمانی نتیجه را برمی‌گردانند که عبارت تطابق نداشته باشد، امکان جایگزینی برای الگوهای نفی‌شده وجود ندارد.

محتویات یک جدول را می‌توان در نام جدول مشخص کرد (در Postfix نسخه ۳.۷ و بالاتر). نحو پایه عبارت است از:

main.cf:
    parameter = .. pcre:{ { rule-1 }, { rule-2 } .. } ..
master.cf:
    .. -o { parameter = .. pcre:{ { rule-1 }, { rule-2 } .. } .. } ..

نرم‌افزار Postfix به‌طور بازگشتی تمام نمونه‌های $parametername را در مقدار پارامتر بالا بسط می‌دهد، فاصله‌های بعد از «{» و قبل از «}» را نادیده می‌گیرد و هر rule را به صورت یک خط متنی در یک فایل درون‌حافظه‌ای می‌نویسد:

in-memory file:
    rule-1
    rule-2
    ..

سپس Postfix نتیجه را به گونه‌ای پردازش می‌کند که گویی فایلی در مسیر /etc/postfix است.

  • هنگام استفاده از $parametername در داخل یک الگوی درون‌خطی، از \Q$parametername\E برای غیرفعال کردن فرانَویسه‌هایی مانند «.» در بسط $parametername استفاده کنید. در غیر این صورت، الگو ممکن است تطابق‌های غیرمنتظره‌ای داشته باشد.
  • هنگامی که یک قاعده درون‌خطی باید شامل $ باشد، $$ را مشخص کنید تا از تلاش Postfix برای بسط دادن $name در حین ارزیابی مقدار پارامتر جلوگیری شود. برای بررسی یک پیکربندی درون‌خطی، از گزینه «postconf -x» همان‌طور که در زیر نشان داده شده است استفاده کنید:
  • هنگامی که یک مقدار «parametername = value» در main.cf شامل یک جدول درون‌خطی :pcre است، از دستور «postconf -x parametername» استفاده کنید. بررسی کنید که هیچ هشدار "undefined parameter" وجود نداشته باشد و خروجی دارای نحوی باشد که در یک فایل غیردرون‌خطی :pcre در Postfix استفاده می‌شود.
  • هنگامی که یک بازنویسی به صورت «-o { parametername = value }» در master.cf شامل یک جدول درون‌خطی :pcre است، از دستور «postconf -Px '*/*/parametername' » استفاده کنید. بررسی کنید که هیچ هشدار "undefined parameter" وجود نداشته باشد و خروجی دارای نحوی باشد که در یک فایل غیردرون‌خطی :pcre در Postfix استفاده می‌شود.

# محافظت از exploderهای خروجی majordomo شما
/^(?!owner-)(.*)-outgoing@(.*)/ 550 Use ${1}@${2} instead
# بازگرداندن friend@whatever، به جز زمانی که whatever دامنه خودمان باشد
/^(friend@(?!my\.domain$).*)$/  550 Stick this in your pipe $1
# یک ورودی چندخطی. متن به صورت یک خط ارسال می‌شود.
#
/^noddy@my\.domain$/
 550 This user is a funny one. You really don't want to send mail to
 them as it only makes their head spin.

/^Subject: make money fast/     REJECT
/^To: friend@public\.com/       REJECT

# ابتدا متن کدگذاری‌شده با base 64 را برای صرفه‌جویی در چرخه‌های پردازنده رد کنید.
# نیازمند PCRE نسخه ۳ است.
~^[[:alnum:]+/]{60,}$~          OK
# الگوهای بدنه خود را در اینجا قرار دهید.

postmap(1), مدیر جدول‌های جستجوی Postfix
postconf(5), پارامترهای پیکربندی
regexp_table(5), قالب جدول‌های عبارت باقاعده POSIX

برای یافتن این اطلاعات از «postconf readme_directory» یا «postconf html_directory» استفاده کنید.

DATABASE_README, بررسی اجمالی جدول‌های جستجوی Postfix

کد جستجوی جدول PCRE در ابتدا توسط افراد زیر نوشته شد:
Andrew McNamara
andrewm@connect.com.au
connect.com.au Pty. Ltd.
Level 3, 213 Miller St
North Sydney, NSW, Australia
پذیرفته شده و تطبیق داده شده توسط:
Wietse Venema
IBM T.J. Watson Research
P.O. Box 704
Yorktown Heights, NY 10598, USA
Wietse Venema
Google, Inc.
111 8th Avenue
New York, NY 10011, USA