TABLE_MYSQL(5) File Formats Manual TABLE_MYSQL(5)
table-mysql - شرح قالب جدول‌های MySQL یا MariaDB برای smtpd

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

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

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

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

یک جدول MySQL شامل یک یا چند پایگاه داده mysql(1) با یک یا چند جدول است.

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

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

hostname
این میزبان اجراکننده MySQL یا MariaDB است. برای مثال:
host db.example.com
username
نام کاربری لازم برای ارتباط با پایگاه داده MySQL یا MariaDB. برای مثال:
username maildba
password
گذرواژه لازم برای ارتباط با پایگاه داده MySQL یا MariaDB. برای مثال:
password OpenSMTPDRules!
databse
نام پایگاه داده MySQL یا MariaDB. برای مثال:
databse 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=?;

مثال بر اساس پرسش‌های متداول 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

MySQL schema

CREATE TABLE domains (
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  domain VARCHAR(255) NOT NULL DEFAULT ''
);
CREATE TABLE virtuals (
    id INT AUTO_INCREMENT PRIMARY KEY,
    email VARCHAR(255) NOT NULL DEFAULT '',
    destination VARCHAR(255) NOT NULL DEFAULT ''
);
CREATE TABLE credentials (
    id INT AUTO_INCREMENT PRIMARY KEY,
    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/mysql.conf

host db.example.com
username maildba
password OpenSMTPDRules!
database opensmtpdb
query_alias SELECT destination FROM virtuals WHERE email=?;
query_credentials SELECT email, password FROM credentials WHERE email=?;
query_domain SELECT domain FROM domains WHERE domain=?;

/etc/mail/smtpd.conf

table domains mysql:/etc/mail/mysql.conf
table virtuals mysql:/etc/mail/mysql.conf
table credentials mysql:/etc/mail/mysql.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/mysql.conf

host db.example.com
username postfix
password PostfixOutOpenSMTPDin
database postfix
query_alias SELECT destination FROM alias WHERE email=?;
query_credentials SELECT username, password FROM mailbox WHERE username=?;
query_domain SELECT domain FROM domain WHERE domain=?;
باقی پیکربندی بدون تغییر می‌ماند.

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

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

query_netaddr
query_userinfo
query_source
query_mailaddr
query_addrname

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

July 4, 2016 Linux 6.12.107+deb13-amd64