REGEXP_TABLE(5) File Formats Manual REGEXP_TABLE(5)

regexp_table - قالب جدول‌های عبارات باقاعده در Postfix

postmap -q "string" regexp:/etc/postfix/filename
postmap -q - regexp:/etc/postfix/filename <inputfile


سیستم ایمیل Postfix از جدول‌های اختیاری برای بازنویسی نشانی‌ها یا مسیریابی نامه‌ها استفاده می‌کند. این جدول‌ها معمولاً در قالب‌های lmdb:، cdb:، hash:، یا dbm: هستند.

به‌عنوان جایگزین، جدول‌های جستجو می‌توانند در قالب عبارات باقاعده POSIX مشخص شوند. در این حالت، هر ورودی با فهرستی از الگوها مقایسه می‌شود. هنگام یافتن تطابق، نتیجه متناظر بازگردانده می‌شود و جستجو خاتمه می‌یابد.

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

برای آزمودن جدول‌های جستجو، از دستور "postmap -q" مطابق آنچه در خلاصه دستور در بالا آمده استفاده کنید. از "postmap -hmq - <file" برای الگوهای header_checks(5)، و از "postmap -bmq - <file" برای body_checks(5) (در Postfix نسخه 2.6 و بالاتر) استفاده کنید.

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

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

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

نکته: در الگوهای داخل if..endif فاصله خالی در ابتدا اضافه نکنید.

این قابلیت در Postfix نسخه 2.1 و بالاتر در دسترس است.

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

نکته: در الگوهای داخل if..endif فاصله خالی در ابتدا اضافه نکنید.

این قابلیت در Postfix نسخه 2.1 و بالاتر در دسترس است.

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

هر الگو یک عبارت باقاعده POSIX است که در میان دو نویسه جداکننده قرار می‌گیرد. نحو عبارات باقاعده در re_format(7) در 4.4BSD، در regex(5) در Solaris، و در regex(7) در Linux مستند شده است. سیستم‌های دیگر ممکن است از نام‌های اسناد دیگری استفاده کنند.

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

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

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

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

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

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

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

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

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

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

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

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

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

# عدم اجازه به مسیریابی مشخص‌شده توسط فرستنده. در صورت رله ایمیل
# برای دامنه‌های دیگر، این مورد الزامی است.
/[%!@].*[%!@]/       550 Sender-specified routing rejected
# نشانی postmaster مشکلی ندارد، تا بتوانند درباره نحوه رفع
# مشکل خود با ما گفتگو کنند.
/^postmaster@/       OK
# محافظت از گسترش‌دهنده‌های majordomo خروجی شما
if !/^owner-/
/^(.*)-outgoing@(.*)$/  550 Use ${1}@${2} instead
endif

# این موارد زمانی در ایمیل‌های هرزنامه رایج بودند.
/^Subject: make money fast/     REJECT
/^To: friend@public\.com/       REJECT

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

postmap(1), Postfix lookup table manager
pcre_table(5), format of PCRE tables
cidr_table(5), format of CIDR tables

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

DATABASE_README, Postfix lookup table overview

کد جستجوی جدول regexp در ابتدا توسط:
LaMont Jones
lamont@hp.com
نوشته شده است.
آن کد بر پایه دیکشنری 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