TABLE_POSTGRESQL(5) File Formats Manual TABLE_POSTGRESQL(5)
table-postgres - شرح قالب جدول‌های PostgreSQL برای smtpd

این صفحه راهنما، قالب فایل جدول‌های PostgreSQL را مستند می‌کند که توسط دیمن ایمیل smtpd(8) استفاده می‌شوند.

قالب شرح‌داده‌شده در اینجا برای جدول‌هایی اعمال می‌شود که در smtpd.conf(5) تعریف شده‌اند.

یک جدول postgresql امکان ذخیره‌سازی نام‌های کاربری، گذرواژه‌ها، نام‌های مستعار و دامنه‌ها را در قالبی فراهم می‌کند که در میان ماشین‌های مختلف پشتیبانی‌کننده از postgres(1) قابل اشتراک‌گذاری است.

این جدول توسط smtpd(8) هنگام احراز هویت کاربر، هنگامی که اطلاعات کاربر مانند user-id و/یا دایرکتوری خانگی برای تحویل مورد نیاز است، زمانی که جستجوی دامنه ممکن است لازم باشد، و/یا هنگام جستجوی یک نام مستعار استفاده می‌شود.

یک جدول PostgreSQL از یک یا چند پایگاه‌داده postgresql(1) با یک یا چند جدول تشکیل شده است.

اگر جدول برای احراز هویت استفاده شود، گذرواژه باید با استفاده از تابع crypt(3) رمزگذاری شود. چنین گذرواژه‌هایی را می‌توان با ابزار encrypt(1) یا دستور encrypt در smtpctl(8) تولید کرد.

گزینه‌های پیکربندی زیر در دسترس هستند:

host='host' user='user' password='password' dbname='dbname'
اطلاعات اتصال مورد نیاز برای اتصال به پایگاه‌داده PostgreSQL. برای نمونه:
conninfo host='db.example.com' user='maildba' password='...' dbname='opensmtpdb'
SQL statement
این گزینه برای ارائه یک پرسمان جهت جستجوی نام‌های مستعار استفاده می‌شود. علامت سؤال با داده‌های مناسب جایگزین می‌شود. برای نام مستعار، این مقدار سمت چپ نشانی SMTP است. این پرسمان انتظار دارد یک VARCHAR حاوی نام کاربری که نام مستعار به آن ارجاع داده می‌شود، برگردانده شود.
SQL statement
این گزینه برای ارائه یک پرسمان جهت جستجوی اطلاعات احراز هویت کاربر استفاده می‌شود. علامت سؤال با داده‌های مناسب جایگزین می‌شود. برای اطلاعات احراز هویت، این مقدار سمت چپ نشانی SMTP است. این پرسمان انتظار دارد دو VARCHAR برگردانده شود، یکی حاوی نام کاربری و دیگری حاوی گذرواژه در قالب crypt(3).
SQL statement
این گزینه برای ارائه یک پرسمان جهت جستجوی یک دامنه استفاده می‌شود. علامت سؤال با داده‌های مناسب جایگزین می‌شود. برای دامنه، این مقدار سمت راست نشانی SMTP خواهد بود. این پرسمان انتظار دارد یک VARCHAR حاوی نام دامنه منطبق برگردانده شود.
SQL statement
این گزینه برای ارائه یک پرسمان جهت جستجوی فرستندگان استفاده می‌شود. علامت سؤال با داده‌های مناسب جایگزین می‌شود. این پرسمان انتظار دارد یک VARCHAR حاوی نشانی که فرستنده مجاز به ارسال ایمیل از آن است برگردانده شود.

یک دستور عمومی SQL چیزی شبیه به این خواهد بود:

query_ SELECT value FROM table WHERE key=$1;

/etc/mail/postgres.conf
فایل پیکربندی پیش‌فرض table-postgresql(5).

مثال بر اساس پرسش‌های متداول OpenSMTPD: ساخت یک سرور ایمیل (Building a Mail Server). بخش فیلتر کردن در این مثال لحاظ نشده است.

پیکربندی زیر برای یک سرور ایمیل با اندازه متوسط است که چندین دامنه را با چندین کاربر مجازی مدیریت می‌کند و بر اساس چند فرض بنا شده است. یکی از آن‌ها این است که یک کاربر سیستمی منفرد به نام vmail برای تمامی کاربران مجازی استفاده می‌شود. این کاربر باید ایجاد شود:

# useradd -g =uid -c "Virtual Mail" -d /var/vmail -s /sbin/nologin vmail
# mkdir /var/vmail
# chown vmail:vmail /var/vmail

طرحواره PostgreSQL:

CREATE TABLE domains (
  id SERIAL,
  domain VARCHAR(255) NOT NULL DEFAULT ''
);
CREATE TABLE virtuals (
    id SERIAL,
    email VARCHAR(255) NOT NULL DEFAULT '',
    destination VARCHAR(255) NOT NULL DEFAULT ''
);
CREATE TABLE credentials (
    id SERIAL,
    email VARCHAR(255) NOT NULL DEFAULT '',
    password VARCHAR(255) NOT NULL DEFAULT ''
);

این مقادیر را می‌توان به شرح زیر مقداردهی کرد:

INSERT INTO domains VALUES (1, "example.com");
INSERT INTO domains VALUES (2, "example.net");
INSERT INTO domains VALUES (3, "example.org");

INSERT INTO virtuals VALUES (1, "abuse@example.com", "bob@example.com");
INSERT INTO virtuals VALUES (2, "postmaster@example.com", "bob@example.com");
INSERT INTO virtuals VALUES (3, "webmaster@example.com", "bob@example.com");
INSERT INTO virtuals VALUES (4, "bob@example.com", "vmail");
INSERT INTO virtuals VALUES (5, "abuse@example.net", "alice@example.net");
INSERT INTO virtuals VALUES (6, "postmaster@example.net", "alice@example.net");
INSERT INTO virtuals VALUES (7, "webmaster@example.net", "alice@example.net");
INSERT INTO virtuals VALUES (8, "alice@example.net", "vmail");

INSERT INTO credentials VALUES (1, "bob@example.com", "$2b$08$ANGFKBL.BnDLL0bUl7I6aumTCLRJSQluSQLuueWRG.xceworWrUIu");
INSERT INTO credentials VALUES (2, "alice@example.net", "$2b$08$AkHdB37kaj2NEoTcISHSYOCEBA5vyW1RcD8H1HG.XX0P/G1KIYwii");

/etc/mail/postgresql.conf

conninfo host='db.example.com' user='maildba' password='OpenSMTPDRules!' dbname='opensmtpdb'
query_alias SELECT destination FROM virtuals WHERE email=$1;
query_credentials SELECT email, password FROM credentials WHERE email=$1;
query_domain SELECT domain FROM domains WHERE domain=$1;

/etc/mail/smtpd.conf

table domains postgres:/etc/mail/postgres.conf
table virtuals postgres:/etc/mail/postgres.conf
table credentials postgres:/etc/mail/postgres.conf
listen on egress port 25 tls pki mail.example.com
listen on egress port 587 tls-require pki mail.example.com auth <credentials>
accept from any for domain <domains> virtual <virtuals> deliver to mbox

/etc/mail/postgres.conf

conninfo host='db.example.com' user='postfix' password='...' dbname='postfix'
query_alias SELECT destination FROM alias WHERE email=$1;
query_credentials SELECT username, password FROM mailbox WHERE username=$1;
query_domain SELECT domain FROM domain WHERE domain=$1;

بقیه پیکربندی دست‌نخورده باقی می‌ماند.

مستندسازی گزینه‌های پرسمان زیر:

query_netaddr
query_userinfo
query_source
query_mailaddr
query_addrname

encrypt(1), crypt(3), smtpd.conf(5), smtpctl(8), smtpd(8)

نخستین نسخه از table_postgresql در سال ۲۰۱۶ نوشته شد. در سال ۲۰۲۴ به پروتکل جدول stdio تبدیل شد.

table_postgresql در ابتدا توسط Gilles Chehade <gilles@poolp.org> نوشته شد. تبدیل به پروتکل جدول stdio توسط Omar Polo <op@openbsd.org> انجام گرفت.

April 21 2024 Linux 6.12.107+deb13-amd64