PGSQL_TABLE(5) File Formats Manual PGSQL_TABLE(5)

pgsql_table - پیکربندی کلاینت PostgreSQL در Postfix

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


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

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

به‌منظور استفاده از جستجوهای PostgreSQL، یک منبع PostgreSQL را به‌صورت جدول جستجو در main.cf تعریف کنید، برای نمونه:

alias_maps = pgsql:/etc/postfix/pgsql-aliases.cf

فایل /etc/postfix/pgsql-aliases.cf همان قالبی را دارد که فایل main.cf در Postfix داراست، و می‌تواند پارامترهای شرح‌داده‌شده در زیر را مشخص کند.

هنگام استفاده از SQL برای ذخیره فهرست‌هایی نظیر $mynetworks، $mydestination، $relay_domains، $local_recipient_maps و غیره، درک این نکته اهمیت دارد که جدول باید هر عضو فهرست را به‌صورت یک کلید جداگانه ذخیره کند. جستجوی جدول *وجود داشتن* کلید را اعتبارسنجی می‌کند. برای بحث بیشتر، به بخش "Postfix lists versus tables" در سند DATABASE_README مراجعه کنید.

جدول‌هایی ایجاد نکنید که فهرست کامل دامنه‌ها را در $mydestination یا $relay_domains و غیره، یا نشانی‌های IP را در $mynetworks بازگردانند.

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

میزبان‌هایی که Postfix تلاش خواهد کرد به آن‌ها متصل شده و پرس‌وجو انجام دهد. علاوه بر URI اتصال PostgreSQL، این تنظیم از شکل‌های قدیمی unix:/pathname برای سوکت‌های دامنه یونیکس (UNIX-domain) و inet:host:port برای اتصال‌های TCP پشتیبانی می‌کند، که در آن‌ها پیشوندهای unix: و inet: پذیرفته شده و برای سازگاری با گذشته نادیده گرفته می‌شوند. نمونه‌ها:
hosts = postgresql://username@example.com/databasename?sslmode=require
hosts = postgres://user:secret@localhost
hosts = inet:host1.some.domain inet:host2.some.domain:port
hosts = host1.some.domain host2.some.domain:port
hosts = unix:/file/name

برای نحو پشتیبانی‌شده URI اتصال، به نشانی https://www.postgresql.org/docs/current/libpq-connect.html مراجعه کنید.

میزبان‌ها به ترتیب تصادفی آزمایش می‌شوند. اتصال‌ها پس از حدود ۱ دقیقه بیکار بودن به‌طور خودکار بسته می‌شوند و در صورت نیاز مجدداً باز خواهند شد. برای جزئیات بیشتر به idle_interval مراجعه کنید.

نکته: اگر تنظیم hosts یک URI اتصال PostgreSQL را مشخص کند، کلاینت PostgreSQL در Postfix تنظیمات dbname، user و password را برای آن اتصال نادیده خواهد گرفت.

نکته: اگر تنظیم hosts تنها یک سرور را مشخص کند، این کلاینت فرض می‌کند که مقصد یک متعادل‌کننده بار (load balancer) است و پس از یک خرابی منفرد بلافاصله دوباره متصل می‌شود. در نسخه‌های 3.9 و پیشین Postfix، همان سرور را دوبار مشخص کنید.

نام کاربری و گذرواژه برای ورود به سرور pgsql. نمونه:
user = someone
password = some_password

تنظیمات user و password برای اتصال‌های hosts که به‌صورت یک URI مشخص شده‌اند، نادیده گرفته می‌شوند.

نام پایگاه داده روی سرورها. نمونه:
dbname = customer_database

تنظیم dbname برای اتصال‌های hosts که به‌صورت یک URI مشخص شده‌اند، نادیده گرفته می‌شود.

تنظیم dbname در Postfix نسخه 3.10 و بالاتر، هنگامی که hosts هرگونه اتصال غیر URI را مشخص کرده باشد، الزامی است؛ این تنظیم در نسخه‌های پیشین Postfix همواره الزامی است.

کدگذاری مورداستفاده توسط کلاینت پایگاه داده. تنظیم پیش‌فرض عبارت است از:
encoding = UTF8

از نظر تاریخی، کلاینت پایگاه داده به‌صورت ثابت برای استفاده از LATIN1 کدنویسی شده بود تا پشتیبانی از نویسه‌های چندبایتی غیرفعال شود.

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

تعداد ثانیه‌هایی که پس از آن یک اتصال پایگاه داده بیکار بسته خواهد شد.

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

تعداد ثانیه‌هایی که پس از بروز یک خطا، از اتصال پایگاه داده صرف‌نظر خواهد شد.

نکته: اگر تنظیم hosts تنها یک سرور را مشخص کند، این کلاینت فرض می‌کند که مقصد یک متعادل‌کننده بار است و پس از یک خرابی منفرد بلافاصله دوباره متصل می‌شود. در نسخه‌های 3.9 و پیشین Postfix، همان سرور را دوبار مشخص کنید.

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

الگوی پرس‌وجوی SQL مورداستفاده برای جستجو در پایگاه داده، که در آن %s جایگزینی برای نشانی‌ای است که Postfix در تلاش برای تحلیل آن است، برای نمونه:
query = SELECT replacement FROM aliases WHERE mailbox = '%s'

این پارامتر از بسط‌های '%' زیر پشتیبانی می‌کند:

%%
این مورد با یک نویسه پیش‌پاافتاده '%' جایگزین می‌شود. (Postfix 2.2 و بالاتر)
%s
این مورد با کلید ورودی جایگزین می‌شود. نقل‌قول‌گذاری SQL (SQL quoting) استفاده می‌شود تا اطمینان حاصل گردد که کلید ورودی نویسه‌های متا (metacharacters) غیرمنتظره اضافه نمی‌کند.
%u
هنگامی که کلید ورودی یک نشانی به شکل user@domain باشد، %u با بخش محلی (local part) نشانی که نقل‌قول‌گذاری SQL شده جایگزین می‌شود. در غیر این صورت، %u با کل رشته جستجو جایگزین می‌شود. اگر بخش محلی خالی باشد، پرس‌وجو متوقف شده و هیچ نتیجه‌ای برنمی‌گرداند.
%d
هنگامی که کلید ورودی یک نشانی به شکل user@domain باشد، %d با بخش دامنه نشانی که نقل‌قول‌گذاری SQL شده جایگزین می‌شود. در غیر این صورت، پرس‌وجو متوقف شده و هیچ نتیجه‌ای برنمی‌گرداند.
%[SUD]
معادل‌های با حروف بزرگ بسط‌های بالا در پارامتر query رفتاری کاملاً همسان با همتایان حروف کوچک خود دارند. با پارامتر result_format (زیر را ببینید)، آن‌ها به‌جای مقدار نتیجه، کلید ورودی را بسط می‌دهند.
بسط‌های %S، %U و %D بالا در Postfix نسخه 2.2 و بالاتر در دسترس هستند.
%[1-9]
الگوهای %1، %2، ... %9 با مؤلفه متناظر با بیشترین اهمیت از دامنه کلید ورودی جایگزین می‌شوند. اگر کلید ورودی user@mail.example.com باشد، آنگاه %1 برابر با com، %2 برابر با example و %3 برابر با mail است. اگر کلید ورودی بدون صلاحیت (unqualified) باشد یا مؤلفه‌های دامنه کافی برای برآورده کردن تمام الگوهای مشخص‌شده نداشته باشد، پرس‌وجو متوقف شده و هیچ نتیجه‌ای برنمی‌گرداند.
بسط‌های %1، ... %9 بالا در Postfix نسخه 2.2 و بالاتر در دسترس هستند.
پارامتر domain شرح داده شده در زیر، کلیدهای ورودی را به نشانی‌های دامنه‌های منطبق محدود می‌کند. هنگامی که پارامتر domain خالی نباشد، پرس‌وجوهای SQL برای نشانی‌های فاقد نام دامنه کامل یا نشانی‌های موجود در دامنه‌های غیرمنطبق متوقف شده و هیچ نتیجه‌ای بازنمی‌گردانند.

تقدم این پارامتر با Postfix نسخه 2.2 تغییر کرده است؛ در نسخه‌های پیشین تقدم از بالاترین به پایین‌ترین عبارت بود از: select_function، query، select_field، ...

با Postfix نسخه 2.2 پارامتر query بالاترین تقدم را دارد، به بخش رابط‌های پرس‌وجوی منسوخ در زیر مراجعه کنید.

نکته: دور پارامتر query علامت نقل‌قول قرار ندهید.

الگوی قالب اعمال‌شده بر ویژگی‌های نتیجه. معمولاً برای افزودن متن به انتها (یا ابتدا) نتیجه استفاده می‌شود. این پارامتر از بسط‌های '%' زیر پشتیبانی می‌کند:
%%
این مورد با یک نویسه پیش‌پاافتاده '%' جایگزین می‌شود.
%s
این مورد با مقدار ویژگی نتیجه جایگزین می‌شود. هنگامی که نتیجه خالی باشد، از آن صرف‌نظر می‌شود.
%u
هنگامی که مقدار ویژگی نتیجه نشانی‌ای به شکل user@domain باشد، %u با بخش محلی نشانی جایگزین می‌شود. هنگامی که نتیجه بخش محلی خالی داشته باشد، از آن صرف‌نظر می‌شود.
%d
هنگامی که مقدار ویژگی نتیجه نشانی‌ای به شکل user@domain باشد، %d با بخش دامنه مقدار ویژگی جایگزین می‌شود. هنگامی که نتیجه فاقد دامنه باشد، از آن صرف‌نظر می‌شود.
%[SUD1-9]
بسط‌های حروف بزرگ و ارقام ده‌دهی به‌جای نتیجه، بخش‌هایی از کلید ورودی را در متن درج می‌کنند. رفتار آن‌ها مشابه همان است که در مورد query شرح داده شد، و در واقع از آنجا که کلید ورودی از قبل مشخص است، پرس‌وجوهایی که کلید آن‌ها شامل تمام اطلاعات مشخص‌شده در الگوی نتیجه نباشد متوقف شده و هیچ نتیجه‌ای برنمی‌گردانند.
برای نمونه، استفاده از "result_format = smtp:[%s]" امکان استفاده از ویژگی mailHost را به‌عنوان مبنایی برای جدول transport(5) فراهم می‌کند. پس از اعمال قالب نتیجه، مقادیر چندگانه به‌صورت رشته‌های جداشده با کاما به هم متصل می‌شوند. پارامتر expansion_limit که در ادامه توضیح داده شده است، اجازه می‌دهد تعداد مقادیر در نتیجه محدود شود، که به‌ویژه برای نگاشت‌هایی که باید حداکثر یک مقدار بازگردانند مفید است.

مقدار پیش‌فرض %s مشخص می‌کند که هر مقدار نتیجه باید همان‌گونه که هست استفاده شود.

این پارامتر در Postfix نسخه 2.2 و بالاتر در دسترس است.

نکته: دور قالب نتیجه (result format) نقل‌قول قرار ندهید!

این گزینه‌ای است شامل فهرستی از نام‌های دامنه، مسیرهای فایل‌ها، یا پایگاه‌های داده "type:table". در صورت تعیین، تنها کلیدهای جستجوی واجد شرایط کامل با بخش محلی *غیرخالی* و دامنه منطبق، واجد شرایط جستجو هستند: جستجوهای 'user'، جستجوهای صرفاً دامنه و جستجوهای "@domain" انجام نمی‌شوند. این امر می‌تواند بار پرس‌وجو روی سرور PostgreSQL را به‌طور چشمگیری کاهش دهد.
domain = postfix.org, hash:/etc/postfix/searchdomains

بهتر است از SQL برای ذخیره دامنه‌های واجد شرایط جستجوهای SQL استفاده نشود.

این پارامتر در Postfix نسخه 2.2 و بالاتر در دسترس است.

نکته: این پارامتر را برای نام‌های مستعار local(8) تعریف نکنید، زیرا کلیدهای ورودی همیشه بدون صلاحیت (unqualified) هستند.

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

برای سازگاری با سایر جدول‌های جستجوی Postfix، پارامترهای PostgreSQL را می‌توان در main.cf نیز تعریف کرد. برای این کار، به‌عنوان منبع PostgreSQL نامی را مشخص کنید که با یک اسلش یا نقطه شروع نشود. سپس پارامترهای PostgreSQL با نامی که برای منبع در تعریف آن تعیین کرده‌اید، یک زیرخط (_) و نام پارامتر در دسترس خواهند بود. برای نمونه، اگر نگاشت به‌صورت "pgsql:pgsqlname" مشخص شود، پارامتر "hosts" در main.cf به‌صورت "pgsqlname_hosts" تعریف خواهد شد.

نکته: با این شیوه، گذرواژه‌های منابع PostgreSQL در main.cf نوشته می‌شوند که معمولاً برای همگان قابل خواندن است. پشتیبانی از این شیوه در نسخه‌های آینده Postfix حذف خواهد شد.

این بخش رابط‌های پرس‌وجویی را شرح می‌دهد که از نسخه 2.2 به بعد Postfix منسوخ شده‌اند. لطفاً به رابط جدید query مهاجرت کنید زیرا رابط‌های قدیمی در آستانه حذف تدریجی قرار دارند.

این پارامتر نام تابع پایگاه داده را مشخص می‌کند. نمونه:
select_function = my_lookup_user_alias

این معادل است با:

query = SELECT my_lookup_user_alias('%s')

این پارامتر فیلدهای قدیمی مرتبط با جدول (که در زیر آمده) را بازنویسی و لغو می‌کند. در نسخه‌های پیش از 2.2 Postfix، پارامتر query را نیز لغو می‌کرد. از نسخه 2.2 Postfix، پارامتر query بالاترین تقدم را دارد و پارامتر select_function منسوخ شده است.

پارامترهای زیر (با اولویت پایین‌تر نسبت به رابط select_function شرح داده شده در بالا) می‌توانند برای ساخت عبارت select در SQL به‌صورت زیر استفاده شوند:

SELECT [select_field]
FROM [table]
WHERE [where_field] = '%s'
      [additional_conditions]

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

با شروع از Postfix 2.2، این رابط با رابط عمومی‌تر query که در بالا شرح داده شد جایگزین و منسوخ شده است. در صورت تعریف پارامترهای با تقدم بالاتر query یا select_function شرح داده شده در بالا، پارامترهای شرح‌داده‌شده در اینجا نادیده گرفته می‌شوند.

پارامتر "select" در SQL. نمونه:
select_field = forw_addr
نام جدول "select .. from" در SQL. نمونه:
table = mxaliases
پارامتر "select .. where" در SQL. نمونه:
where_field = alias
شرایط اضافی برای پرس‌وجوی SQL. نمونه:
additional_conditions = AND status = 'paid'

postmap(1)، مدیر جدول‌های جستجوی Postfix
postconf(5)، پارامترهای پیکربندی
ldap_table(5)، جدول‌های جستجوی LDAP
mysql_table(5)، جدول‌های جستجوی MySQL
sqlite_table(5)، جدول‌های جستجوی SQLite

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

DATABASE_README، نمای کلی جدول جستجوی Postfix
PGSQL_README، راهنمای کلاینت PostgreSQL در Postfix

مجوز نرم‌افزار ایمن (Secure Mailer license) باید همراه با این نرم‌افزار توزیع شود.


پشتیبانی از PgSQL با نسخه 2.1 نرم‌افزار Postfix معرفی شد.

بر پایه کلاینت MySQL توسط:
Scott Cotton, Joshua Marcus
IC Group, Inc.
پورت‌شده به PostgreSQL توسط:
Aaron Sethman
بهبودهای بعدی توسط:
Liviu Daia
Institute of Mathematics of the Romanian Academy
P.O. BOX 1-764
RO-014700 Bucharest, ROMANIA