SMTPD.CONF(5) File Formats Manual SMTPD.CONF(5)

smtpd.conf — پرونده پیکربندی دیمن SMTP

smtpd.conf پرونده پیکربندی برای دیمن ارسال و دریافت ایمیل smtpd(8) است.

هنگام رسیدن ایمیل، هر دستور “RCPT TO:” یک پاکت نامه (envelope) تولید می‌کند. اگر یک پاکت با هر یک از معیارهای از پیش تعیین‌شده مطابقت داشته باشد (با استفاده از دستورالعمل match) ، پیام برای تحویل پذیرفته می‌شود. یک رونوشت از پیام و همچنین پاکت‌های مربوط به آن، در صف ایمیل ذخیره شده و بعداً طبق مجموعه‌ای از اقدامات مرتبط (با استفاده از دستورالعمل action) ارسال می‌گردد. اگر پاکتی با هیچ گزینه‌ای مطابقت نداشته باشد، رد می‌شود. قوانین تطبیق به صورت متوالی ارزیابی می‌شوند و نخستین تطبیق اعمال خواهد شد.

قالب پرونده پیکربندی نسبتاً انعطاف‌پذیر است. خط جاری می‌تواند با استفاده از یک بک‌اسلش (‘\’) به چند خط امتداد یابد. توضیحات را می‌توان با استفاده از نماد هش (‘#’) در هر کجای پرونده قرار داد و تا انتهای خط جاری امتداد می‌یابند. هنگام کامنت‌گذاری متن‌های چندخطی باید دقت کرد: توضیح تا پایان کل بلوک معتبر خواهد بود. نام آرگومان‌هایی که با حرف، عدد یا زیرخط شروع نمی‌شوند، و همچنین کلمات رزروشده (مانند listen, match, و port) ، باید داخل نقل‌قول قرار گیرند. آرگومان‌های حاوی فاصله‌های خالی باید در میان گیومه دوتایی (") محصور شوند.

یک ماکرو با دستوری به شکل name=value تعریف می‌شود. نام ماکرو name می‌تواند شامل حروف، اعداد و زیرخط باشد و نباید یک کلمه رزروشده باشد. درون آرگومان‌های بدون نقل‌قول، عبارت $name بعداً به value گسترش می‌یابد.

برای نمونه:

lan_addr = "192.168.0.1"
listen on $lan_addr
listen on $lan_addr tls auth

دستور زبان smtpd.conf در زیر شرح داده شده است.

name method [options]
هنگامی که پردازشگر صف، پاکتی را از صف ایمیل پردازش می‌کند، اقدام action name را که توسط دستورالعمل match ... action در زمان دریافت پیام انتخاب شده است، اجرا می‌کند. دستورالعمل action داده‌های پیکربندی را برای تلاش‌های تحویل فراهم می‌سازد. جستجوهای لازم در زمان هر تلاش برای تحویل انجام می‌شوند. در نتیجه، تغییر یک دستورالعمل action یا پرونده‌های ارجاع‌شده توسط آن و راه‌اندازی مجدد دیمن smtpd(8) باعث اعمال تغییرات برای تلاش‌های بعدی تحویل برای ارسال‌کننده مربوطه name می‌شود، حتی برای پیام‌هایی که پیش از تغییرات پیکربندی در صف گیر کرده بودند.

پارامتر روش تحویل method می‌تواند یکی از موارد زیر باشد:

تنها در صورتی پیام را بپذیر که یک روش تحویل در پرونده نام‌های مستعار یا .forward مشخص شده باشد.
تنها در صورتی پیام را بپذیر که گیرنده پس از پردازش نام‌های مستعار یا پرونده forward به یک نشانی راه دور منتهی شود.
destination [rcpt-to]
پیام را به یک سرور LMTP در destination تحویل بده. مکان می‌تواند به صورت host:port یا به صورت یک سوکت یونیکس بیان شود.

به صورت اختیاری، rcpt-to می‌تواند مشخص شود تا به جای کاربر محلی، از نشانی ایمیل گیرنده (پس از بسط) در نشست LMTP به عنوان RCPT TO استفاده شود.

[pathname] [junk]
پیام را به maildir در pathname (در صورت تعیین) یا به طور پیش‌فرض به ~/Maildir تحویل بده.

مسیر pathname می‌تواند شامل مشخص‌کننده‌های قالبی باشد که پیش از استفاده بسط می‌یابند (نگاه کنید به FORMAT SPECIFIERS).

اگر آرگومان junk ارائه شود، پیام در صورتی که حاوی سربرگ مثبت ‘X-Spam’ باشد به پوشه ‘Junk’ منتقل خواهد شد. این پوشه اگر هنوز وجود نداشته باشد، در زیر pathname ایجاد خواهد شد.

پیام را با mail.local(8) به mbox کاربر تحویل بده.
command
تحویل را به یک command محول کن که پیام را روی ورودی استاندارد خود دریافت می‌کند (نگاه کنید به MDA COMMANDS).

دستور command می‌تواند حاوی مشخص‌کننده‌های قالب باشد که پیش از استفاده بسط می‌یابند (نگاه کنید به FORMAT SPECIFIERS).

پیام را به یک سرور SMTP دیگر بازپخش کن.

روش‌های تحویل محلی از گزینه‌های اضافی زیر پشتیبانی می‌کنند:

<table>
از جدول نگاشت table برای بسط aliases(5) استفاده کن.
n{s|m|h|d}
مدت زمانی را که یک پیام می‌تواند در صف بماند مشخص کن.
username
نام کاربری username را برای انجام تحویل مشخص کن که با getpwnam(3) جستجو می‌شود.

این گزینه برای میزبانی مجازی که در آن یک نام کاربری واحد مسئول مدیریت تحویل برای همه کاربران مجازی است به کار می‌رود.

این گزینه با روش تحویل mbox قابل استفاده نیست.

تنها پرونده .forward کاربر تحویل پردازش خواهد شد.

<table>
از جدول نگاشت table برای جستجوی کاربران به جای تابع getpwnam(3) استفاده کن.

گزینه userbase روی گزینه user اعمال نمی‌شود.

<table>
از جدول نگاشت table برای بسط مجازی استفاده کن. قالب جدول نام‌های مستعار در table(5) شرح داده شده است.
name
از بسته‌بندی (wrapper) مشخص‌شده در mda wrapper استفاده کن.

روش‌های تحویل بازپخش (relay) نیز از گزینه‌های اضافی پشتیبانی می‌کنند:

به عنوان مبادله‌کننده ایمیل پشتیبان عمل کن و پیام‌ها را به هر مبادله‌کننده ایمیل با اولویت بالاتر تحویل بده.
name
به عنوان مبادله‌کننده ایمیل پشتیبان عمل کن و پیام‌ها را به هر مبادله‌کننده‌ای با اولویت بالاتر از مبادله‌کننده مشخص‌شده با نام name تحویل بده.
caname
برای اتصالات امن، از مرجع صدور گواهی مرتبط با caname (که در دستورالعمل ca تعریف شده) برای اعتبارسنجی هویت سرور استفاده کن.
heloname
نام heloname را به عنوان نام میزبان در طول فاز HELO به سایر مبادله‌کنندگان ایمیل معرفی کن.
<table>
از جدول نگاشت table برای جستجوی نام میزبان منطبق با نشانی مبدا استفاده کن تا در طول فاز HELO معرفی شود.
<domains>
جستجوی MX انجام نده، بلکه دامنه مقصد را در domains جستجو کن و از آدرس relay url منطبق به عنوان میزبان بازپخش استفاده نما.
relay-url
جستجوی MX انجام نده، بلکه پیام‌ها را به میزبان بازپخش شرح داده شده در relay-url بازپخش کن. قالب relay-url عبارت است از: [proto://[label@]]host[:port]. پروتکل‌های زیر در دسترس هستند:
smtp
نشست استاندارد SMTP با STARTTLS فرصت‌طلبانه (پیش‌فرض).
smtp+tls
نشست استاندارد SMTP با STARTTLS اجباری.
smtp+notls
نشست متن ساده SMTP بدون TLS.
lmtp
نشست LMTP. مشخص کردن port الزامی است.
smtps
نشست SMTP با TLS اجباری هنگام برقراری اتصال. درگاه پیش‌فرض ۴۶۵ است.

مگر در مواردی که ذکر شده، مقدار پیش‌فرض port برابر ۲۵ است.

برچسب label با یک مدخل در جدول مشخصات هویتی مطابقت دارد، همان‌طور که در table(5) مستند شده است. از آن با پروتکل‌های “smtp+tls” و “smtps” برای احراز هویت استفاده می‌شود. گواهی‌های سرور برای این پروتکل‌ها به طور پیش‌فرض اعتبارسنجی می‌شوند.

pkiname
برای اتصالات امن، از گواهی مرتبط با pkiname (که در دستورالعمل pki تعریف شده) برای اثبات هویت کلاینت به سرور ایمیل راه دور استفاده کن.
هنگام بازپخش ایمیلی که ناشی از فوروارد است، از طرح بازنویسی فرستنده (Sender Rewriting Scheme) برای بازنویسی نشانی فرستنده استفاده کن.
[no-verify]
استفاده از TLS را هنگام بازپخش الزامی کن، که به طور پیش‌فرض از STARTTLS اجباری استفاده می‌کند. هنگامی که با یک میزبان هوشمند (smarthost) استفاده می‌شود، پروتکل نباید “smtp+notls://” باشد. اگر no-verify مشخص شود، داشتن گواهی معتبر الزامی نیست.
protostr
نسخه‌های پروتکل مورد استفاده برای نشست‌های TLS را تعریف کن. برای اطلاع از قالب protostr به صفحه راهنمای tls_config_parse_protocols(3) مراجعه فرمایید.
cipherstr
فهرست رمزنگاره‌هایی را که می‌توان برای نشست‌های TLS استفاده کرد، تعریف کن. برای اطلاع از قالب cipherstr به صفحه راهنمای tls_config_set_ciphers(3) مراجعه فرمایید.
<table>
از جدول نگاشت table برای اتصال به relay-url با استفاده از مشخصات هویتی استفاده کن. این گزینه تنها با گزینه host قابل استفاده است. قالب جدول مشخصات هویتی در table(5) شرح داده شده است.
mailaddr
از mailaddr به عنوان نشانی MAIL FROM در تبادل SMTP استفاده کن.
sourceaddr | <sourceaddr>
از رشته یا جدول فهرست sourceaddr برای نشانی IP مبدا استفاده کن، که در دستگاه‌هایی با چندین رابط کاربری مفید است. اگر فهرست حاوی بیش از یک نشانی باشد، از همه آن‌ها به گونه‌ای استفاده می‌شود که ترافیک تا حد امکان بهینه مسیریابی شود.
authservid
دامنه مدیریت اداری (Administrative Management Domain) که این سرور ایمیل متعلق به آن است. شناسه authservid به فیلترهایی که از آن برای شناسایی یا علامت‌گذاری سربرگ‌های authentication-results استفاده می‌کنند ارسال خواهد شد. در صورت حذف، مقدار پیش‌فرض نام سرور خواهد بود.
warn-interval delay [, delay ...]
هنگامی که خطاهای موقت تحویل باعث می‌شوند پیامی بیش از delay در صف بماند، پیام‌های هشدار را به فرستنده پاکت ارسال کن. هر پارامتر delay شامل یک عدد صحیح مثبت دهدهی و یک واحد s, m, h, یا d است. حداکثر چهار پارامتر delay را می‌توان مشخص کرد. مقدار پیش‌فرض "bounce warn-interval 4h" است که یک هشدار منفرد را پس از چهار ساعت ارسال می‌کند.
caname cert cafile
پرونده گواهی مرجع صدور گواهی (CA) cafile را با مدخل ca به نام caname مرتبط کن. مدخل ca را می‌توان در قوانین listen on و action ... relay ارجاع داد.
chain-name chain {filter-name [, ...]}
یک زنجیره از فیلترها به نام chain-name شامل فیلترهای فهرست‌شده در filter-name ثبت کن. فیلترهای موجود در یک زنجیره فیلتر به ترتیب اعلان برای هر فازی که برای آن ثبت شده‌اند اجرا می‌شوند. می‌توان از یک زنجیره فیلتر به جای یک فیلتر برای هر دستورالعملی به جز خود زنجیره‌های فیلتر استفاده کرد.
filter-name phase phase-name match conditions decision
یک فیلتر به نام filter-name ثبت کن. تصمیمی decision درباره نحوه برخورد با ایمیل در فاز phase-name هنگام تطبیق شرایط conditions اتخاذ می‌شود. فازها، شرایط تطبیق و تصمیم‌ها در بخش MAIL FILTERING در زیر شرح داده شده‌اند.
filter-name proc proc-name
فیلتر "proc" به نام filter-name مبتنی بر فرایند proc-name را ثبت کن.
filter-name proc-exec command
فیلتر "proc" به نام filter-name را از دستور command مطابق با API smtpd-filters(7) ثبت و اجرا کن. اگر command با یک اسلش شروع شود با یک مسیر مطلق اجرا می‌شود، در غیر این صورت از “/usr/lib/smtpd/opensmtpd” اجرا خواهد شد.
"pathname"
این دستورالعمل را با محتوای پرونده پیکربندی اضافی در مسیر مطلق pathname جایگزین کن.
interface [family] [options]
روی رابط شبکه interface برای اتصالات ورودی با استفاده از همان دستور زبان ifconfig(8) گوش بده. پارامتر رابط interface همچنین می‌تواند یک گروه رابط، یک نشانی IP یا یک نام دامنه باشد. گوش دادن را می‌توان به صورت اختیاری به یک خانواده نشانی خاص family محدود کرد که می‌تواند inet4 یا inet6 باشد.

گزینه‌های options به شرح زیر هستند:

[<authtable>]
از SMTPAUTH پشتیبانی کن: کلاینت‌ها تنها پس از احراز هویت موفق می‌توانند تبادلات SMTP را آغاز کنند. کاربران یا در برابر مشخصات هویتی ورود عادی خود یا در برابر یک جدول مشخصات هویتی authtable احراز هویت می‌شوند که قالب آن در table(5) شرح داده شده است.
[<authtable>]
از SMTPAUTH به صورت اختیاری پشتیبانی کن: کلاینت‌ها نیازی به احراز هویت ندارند، اما می‌توانند این کار را انجام دهند. این ویژگی به یک دستورالعمل listen on امکان می‌دهد تا هم ایمیل‌های ورودی را از فرستندگان غیرقابل اعتماد بپذیرد و هم به کاربران احراز هویت شده اجازه ارسال ایمیل خروجی را بدهد (با استفاده از match auth). این گزینه در شرایطی کاربرد دارد که امکان گوش دادن روی یک درگاه جداگانه (معمولاً درگاه submission، ۵۸۷) برای احراز هویت کاربران وجود ندارد.
caname
برای اتصالات امن، از گواهی CA مرتبط با caname (تعریف‌شده در دستورالعمل ca) به عنوان گواهی CA هنگام اعتبارسنجی گواهی‌های کلاینت استفاده کن.
name
فیلتر name را روی اتصالات مدیریت‌شده توسط این شنونده اعمال کن.
hostname
از hostname در بنر خوش‌آمدگویی به جای نام پیش‌فرض سرور استفاده کن.
<names>
نام سرور را برای نشانی‌های خاص بازنویسی کن. جدول names حاوی یک نگاشت از نشانی‌های IP به نام‌های میزبان است. اگر نشانی‌ای که اتصال روی آن وارد می‌شود در نگاشت ظاهر شود، نام میزبان مرتبط استفاده می‌شود.
قسمت from را هنگام افزودن سربرگ‌های “Received” حذف کن.
پسوند DSN (اعلان وضعیت تحویل) را غیرفعال کن.
pkiname
برای اتصالات امن، از گواهی مرتبط با pkiname (تعریف‌شده در یک دستورالعمل pki) برای اثبات هویت سرور ایمیل استفاده کن. این گزینه می‌تواند چندین بار برای ارائه گواهی‌های جایگزین برای SNI استفاده شود.
[port]
به جای درگاه پیش‌فرض ۲۵، روی درگاه مشخص‌شده port گوش بده.
از پروتکل PROXYv2 پشتیبانی کن و نشانی مبدا دریافت شده از پراکسی را به طور مناسب بازنویسی نما.
در سربرگ‌های “Received ،” گزارش بده که آیا نشست احراز هویت شده بود و توسط کدام کاربر محلی.
<users> [masquerade]
کاربر احراز هویت شده را در جدول نگاشت users جستجو کن تا نشانی‌های ایمیلی را که آن کاربر مجاز به ارسال ایمیل با آن‌هاست بیابی. علاوه بر این، اگر گزینه masquerade ارائه شود، سربرگ From بازنویسی می‌شود تا با فرستنده ارائه‌شده در نشست SMTP مطابقت داشته باشد.
[verify]
از SMTPS، به طور پیش‌فرض روی درگاه ۴۶۵، پشتیبانی کن. با گزینه tls ناسازگار و مانعة‌الجمع است. با گزینه verify ، کلاینت‌ها برای برقراری یک نشست SMTP باید یک گواهی معتبر نیز ارائه دهند.
tag
کلاینت‌هایی که به این شنونده متصل می‌شوند با برچسب مشخص‌شده tag علامت‌گذاری می‌شوند.
از STARTTLS، به طور پیش‌فرض روی درگاه ۲۵، پشتیبانی کن. با smtps ناسازگار و مانعة‌الجمع است.
[verify]
مشابه tls ، اما کلاینت‌ها را مجبور می‌کند پیش از شروع تبادل SMTP یک اتصال امن برقرار کنند. با گزینه verify ، کلاینت‌ها همچنین باید یک گواهی معتبر برای برقراری نشست SMTP ارائه دهند.
protostr
نسخه‌های پروتکل مورد استفاده برای نشست‌های TLS را مشخص کن. برای قالب protostr به صفحه راهنمای tls_config_parse_protocols(3) مراجعه فرمایید.
cipherstr
فهرست رمزنگاره‌های مجاز برای نشست‌های TLS را مشخص کن. برای قالب cipherstr به صفحه راهنمای tls_config_set_ciphers(3) مراجعه فرمایید.
socket [options]
برای اتصالات ورودی SMTP روی سوکت دامنه یونیکس /run/smtpd.sock گوش بده. این کار حتی در صورت عدم درج دستورالعمل، به طور پیش‌فرض انجام می‌شود.

گزینه‌های options به شرح زیر هستند:

name
فیلتر name را روی اتصالات مدیریت‌شده توسط این شنونده اعمال کن.
قسمت from را هنگام افزودن سربرگ‌های “Received” حذف کن.
پسوند DSN (اعلان وضعیت تحویل) را غیرفعال کن.
tag
کلاینت‌های متصل به شنونده با برچسب مشخص‌شده tag علامت‌گذاری می‌شوند.
options action name
اگر حداقل یک پاکت ایمیل با گزینه‌های options یک دستورالعمل match action مطابقت داشته باشد، پیام ورودی را دریافت کن، یک رونوشت در هر پاکت تطبیق‌یافته قرار بده و پاکت‌ها را به صورت اتمیک در صف ایمیل ذخیره کن تا بعداً توسط توزیع‌کننده مربوطه name (که باید از قبل با دستورالعمل action تعریف شده باشد) پردازش شوند.

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

[!] for any
مشخص می‌کند که نشست می‌تواند هر مقصدی را مخاطب قرار دهد.
[!] for local
مشخص می‌کند که نشست می‌تواند هر دامنه محلی را مخاطب قرار دهد. این حالت پیش‌فرض است و می‌توان آن را حذف کرد.
[!] for domain [regex] domain | <domain>
مشخص می‌کند که نشست می‌تواند رشته یا جدول فهرست domain را مخاطب قرار دهد. کلیدواژه regex در صورتی لازم است که domain یک عبارت باقاعده یا جدولی از عبارات باقاعده باشد.
[!] for rcpt-to [regex] recipient | <recipient>
مشخص می‌کند که نشست می‌تواند رشته یا جدول فهرست recipient را مخاطب قرار دهد. کلیدواژه regex در صورتی لازم است که recipient یک عبارت باقاعده یا جدولی از عبارات باقاعده باشد.
[!] from any
مشخص می‌کند که نشست می‌تواند از هر مبدایی سرچشمه بگیرد.
[!] from auth
مشخص می‌کند که نشست می‌تواند از هر کاربر احراز هویت شده‌ای، بدون در نظر گرفتن نشانی IP مبدا، سرچشمه بگیرد.
[!] from auth [regex] user | <user>
مشخص می‌کند که نشست می‌تواند از کاربر احراز هویت شده یا فهرست کاربران user ، بدون در نظر گرفتن نشانی IP مبدا، سرچشمه بگیرد. کلیدواژه regex در صورتی لازم است که user یک عبارت باقاعده یا جدولی از عبارات باقاعده باشد.
[!] from local
مشخص می‌کند که نشست تنها می‌تواند از یک نشانی IP محلی یا از ثبت‌کننده محلی (local enqueuer) سرچشمه بگیرد. این حالت پیش‌فرض است و می‌توان آن را حذف کرد.
[!] from mail-from [regex] sender | <sender>
مشخص می‌کند که نشست می‌تواند از فرستنده یا فهرست فرستندگان sender ، بدون در نظر گرفتن نشانی IP مبدا، سرچشمه بگیرد. کلیدواژه regex در صورتی لازم است که sender یک عبارت باقاعده یا جدولی از عبارات باقاعده باشد.
[!] from rdns
مشخص می‌کند که نشست تنها می‌تواند از یک نشانی IP سرچشمه بگیرد که به یک reverse DNS تفکیک شود.
[!] from rdns [regex] hostname | <hostname>
مشخص می‌کند که نشست تنها می‌تواند از یک نشانی IP سرچشمه بگیرد که به یک reverse DNS منطبق با رشته یا رشته فهرست hostname تفکیک شود. کلیدواژه regex در صورتی لازم است که hostname یک عبارت باقاعده یا جدولی از عبارات باقاعده باشد.
[!] from socket
مشخص می‌کند که نشست تنها می‌تواند از ثبت‌کننده محلی در صف سرچشمه بگیرد.
[!] from src [regex] address | <address>
مشخص می‌کند که نشست تنها می‌تواند از رشته یا جدول فهرست address سرچشمه بگیرد که می‌تواند یک نشانی مشخص یا یک زیرشبکه در قالب نشانه‌گذاری CIDR باشد. کلیدواژه regex در صورتی لازم است که address یک عبارت باقاعده یا جدولی از عبارات باقاعده باشد.

علاوه بر این، گزینه‌های تبادل زیر نیز می‌توانند تطبیق داده شوند:

[!] auth
تبادلاتی را که احراز هویت شده‌اند تطبیق می‌دهد.
[!] auth [regex] username | <username>
تبادلاتی را که برای کاربر یا فهرست کاربران username احراز هویت شده‌اند تطبیق می‌دهد. کلیدواژه regex در صورتی لازم است که username یک عبارت باقاعده یا جدولی از عبارات باقاعده باشد.
[!] helo [regex] helo-name | <helo-name>
مشخص می‌کند که HELO / EHLO نشست باید با رشته یا جدول فهرست helo-name مطابقت داشته باشد. کلیدواژه regex در صورتی لازم است که helo-name یک عبارت باقاعده یا جدولی از عبارات باقاعده باشد.
[!] mail-from [regex] sender | <sender>
مشخص می‌کند که MAIL FROM تبادل باید با رشته یا جدول فهرست sender مطابقت داشته باشد. کلیدواژه regex در صورتی لازم است که sender یک عبارت باقاعده یا جدولی از عبارات باقاعده باشد.
[!] rcpt-to [regex] recipient | <recipient>
مشخص می‌کند که RCPT TO تبادل باید با رشته یا جدول فهرست recipient مطابقت داشته باشد. کلیدواژه regex در صورتی لازم است که recipient یک عبارت باقاعده یا جدولی از عبارات باقاعده باشد.
[!] tag [regex] tag
تبادلات علامت‌گذاری‌شده با برچسب مشخص‌شده tag را تطبیق می‌دهد. کلیدواژه regex در صورتی لازم است که tag یک عبارت باقاعده باشد.
[!] tls
مشخص می‌کند که تبادل باید در یک کانال TLS انجام گیرد.
options reject
پیام ورودی را در طول گفتگوی SMTP رد کن. همان گزینه‌های options که برای دستورالعمل match action پشتیبانی می‌شوند، در اینجا نیز معتبر هستند.
wrapper name command
دستور command را با بسته‌بندی تحویل‌دهنده ایمیل به نام name مرتبط کن. هنگامی که یک تحویل محلی یک بسته‌بندی را مشخص می‌کند، به جای آن command مرتبط با بسته‌بندی اجرا خواهد شد. این دستور می‌تواند حاوی مشخص‌کننده‌های قالب باشد (نگاه کنید به FORMAT SPECIFIERS).
max-deferred number
هنگامی که تحویل به یک میزبان معین به دلیل خطاهای موقت معلق می‌شود، حداکثر number پاکت را برای آن میزبان ذخیره (کش) کن تا به محض موفقیت‌آمیز بودن تحویل دیگری به آن میزبان، بتوان آنها را تحویل داد. مقدار پیش‌فرض ۱۰۰ است.
pkiname cert certfile
پرونده گواهی certfile را با مدخل pki به نام pkiname مرتبط کن. مدخل pki پیکربندی یک جفت‌کلید را تعریف می‌کند که می‌توان در قوانین شنونده و اقدامات بازپخش به آن ارجاع داد.

می‌توان با افزودن یک یا چند گواهی، از جمله گواهی مرجع صدور گواهی (CA)، به certfile یک زنجیره گواهی ایجاد کرد. ایجاد گواهی‌ها در starttls(8) مستند شده است.

pkiname key keyfile
کلید واقع در keyfile را با مدخل pki به نام pkiname مرتبط کن.
pkiname dhe params
پارامترهای DHE را برای استفاده در مجموعه‌های رمزنگاری DHE با مدخل pki به نام pkiname مشخص کن. مقادیر معتبر پارامتر عبارتند از none, legacy, و auto. برای legacy ، یک طول کلید ثابت ۱۰۲۴ بیتی استفاده می‌شود، در حالی که برای auto ، طول کلید به صورت خودکار تعیین می‌گردد. مقدار پیش‌فرض none است که مجموعه‌های رمزنگاری DHE را غیرفعال می‌کند.
proc-name command
یک فرایند خارجی به نام proc-name را از دستور command مطابق با API smtpd-filters(7) ثبت کن. از چنین فرایندهایی می‌توان برای به اشتراک گذاشتن یک نمونه واحد بین چندین فیلتر استفاده کرد. اگر command با یک اسلش آغاز شود با یک مسیر مطلق اجرا می‌شود، در غیر این صورت از “/usr/lib/smtpd/opensmtpd” اجرا خواهد شد.
compression
پرونده‌های صف را در قالبی فشرده ذخیره کن. این کار برای صرفه‌جویی در فضای دیسک مفید است.
encryption [key]
پرونده‌های صف را با EVP_aes_256_gcm(3) رمزگذاری کن. اگر هیچ کلیدی key مشخص نشده باشد، با getpass(3) خوانده می‌شود. اگر به جای یک key ، رشته stdin یا یک خط تیره منفرد (‘-’) داده شود، کلید از ورودی استاندارد خوانده می‌شود.
ttl delay
زمان انقضای پیش‌فرض را برای پیام‌هایی که به طور موقت غیرقابل تحویل هستند تنظیم کن، که به صورت یک عدد صحیح مثبت دهدهی به همراه یک واحد s, m, h, یا d داده می‌شود. مقدار پیش‌فرض چهار روز (4d) است.
ciphers control
رشته کنترلی control را برای SSL_CTX_set_cipher_list(3) تنظیم کن. مقدار پیش‌فرض "HIGH:!aNULL:!MD5" است.
smtp limit max-mails count
تعداد پیام‌ها را برای هر نشست به count محدود کن. مقدار پیش‌فرض ۱۰۰ است.
smtp limit max-rcpt count
تعداد گیرندگان را برای هر تبادل به count محدود کن. مقدار پیش‌فرض ۱۰۰۰ است.
max-message-size size
پیام‌های بزرگتر از size را رد کن، که به صورت یک عدد مثبت از بایت‌ها یا به عنوان رشته‌ای که با scan_scaled(3) تجزیه می‌شود مشخص می‌گردد. مقدار پیش‌فرض "35M" است.
sub-addr-delim character
هنگام تفکیک بخش محلی نشانی ایمیل محلی، کاراکتر اسکی character و تمام کاراکترهای پس از آن را نادیده بگیر. مقدار پیش‌فرض ‘+’ است.
key [backup] secret
کلید مخفی مورد استفاده برای SRS (طرح بازنویسی فرستنده) را تنظیم کن. گزینه backup را می‌توان برای تنظیم یک کلید مخفی جهت استفاده به عنوان جایگزین اضطراری برای SRS مشخص کرد؛ از این قابلیت می‌توان برای پیاده‌سازی چرخش کلیدهای SRS استفاده نمود.
ttl delay
مدت‌زمان اعتبار (TTL) را برای پاکت‌های SRS تنظیم کن. پس از این تاخیر، پاسخ بازگشتی (bounce) به نشانی SRS دور انداخته می‌شود تا خطرات نشانی‌های جعل‌شده کاهش یابد. مقدار پیش‌فرض چهار روز (4d) است.
name [type:]pathname
جدول‌ها اطلاعات پیکربندی اضافی را برای smtpd(8) در قالب فهرست‌ها یا نگاشت‌های کلید-مقدار فراهم می‌کنند. قالب مدخل‌ها بستگی به کاربرد جدول دارد. برای مستندات جامع به table(5) مراجعه فرمایید.

هر جدول با یک نام دلخواه و یکتا name مشخص می‌شود.

اگر نوع type برابر db باشد، اطلاعات در پرونده‌ای که با makemap(8) ساخته شده ذخیره می‌شود؛ اگر file یا حذف شده باشد، اطلاعات در یک پرونده متن ساده با قالبی که در table(5) شرح داده شده ذخیره می‌گردد. مسیر pathname به پرونده باید مطلق باشد.

name {value [, ...]}
به جای استفاده از یک پرونده جداگانه، یک جدول فهرست حاوی مقادیر ایستای values داده‌شده تعریف کن. جدول باید حداقل شامل یک مقدار باشد و می‌تواند چندین مقدار را به صورت فهرستی جداشده با کاما (فاصله اختیاری است) اعلان کند.
name {key=value [, ...]}
به جای استفاده از یک پرونده جداگانه، یک جدول نگاشت حاوی جفت‌های ایستای key-value داده‌شده تعریف کن. جدول باید حداقل شامل یک جفت کلید-مقدار باشد و می‌تواند چندین جفت را به صورت فهرستی جداشده با کاما (فاصله اختیاری است) اعلان کند.

در یک گردش کار معمولی، smtpd(8) ممکن است پیامی را تنها بر اساس محتوای پاکت‌ها بپذیرد یا رد کند. تصمیم‌های آن درباره نحوه مدیریت پیام است، نه درباره مدیریت یک نشست فعال.

فیلتر کردن فرآیند تصمیم‌گیری را با مجاز ساختن smtpd(8) به توقف در هر فاز از یک نشست SMTP، بررسی برقراری شرایط، و سپس تصمیم‌گیری درباره اینکه آیا نشست اجازه پیشروی دارد یا خیر، گسترش می‌دهد.

با فیلتر کردن، یک نشست می‌تواند در هر فازی پیش از کامل شدن یک پاکت متوقف شود. همچنین یک پیام می‌تواند پس از ثبت شدن رد شود، صرف‌نظر از اینکه پاکت پذیرفته شده بود یا خیر.

فازهای زیر در حال حاضر پشتیبانی می‌شوند:

connect هنگام اتصال، پیش از نمایش بنر
helo پس از ارسال دستور HELO
ehlo پس از ارسال دستور EHLO
mail-from پس از ارسال دستور MAIL FROM
rcpt-to پس از ارسال دستور RCPT TO
data پس از ارسال دستور DATA
commit پس از ثبت کامل پیام

در هر فاز، شرایط مختلفی را می‌توان تطبیق داد. داده‌های fcrdns، rdns و src در تمامی فازها در دسترس هستند، اما داده‌های دیگر باید قبلاً ارسال شده باشند تا در دسترس قرار گیرند.

fcrdns سامانه DNS معکوس تاییدشده مستقیم معتبر است
rdns نشست دارای یک DNS معکوس است
rdns <table> نشست دارای DNS معکوس در جدول است
src <table> نشانی مبدا در جدول موجود است
helo <table> نام helo در جدول موجود است
auth نشست احراز هویت شده است
auth <table> نام کاربری نشست در جدول موجود است
mail-from <table> نشانی فرستنده در جدول موجود است
rcpt-to <table> نشانی گیرنده در جدول موجود است

این شرایط را می‌توان با افزودن علامت تعجب به ابتدای آنها منفی کرد:

!fcrdns سامانه DNS معکوس تاییدشده مستقیم نامعتبر است

هر شرطی که از یک جدول استفاده می‌کند می‌تواند با افزودن کلیدواژه regex به ابتدای نام جدول مشخص کند که جدول حاوی عبارات باقاعده است.

helo regex <table> نام helo با یک regex در جدول مطابقت دارد

در نهایت، تعدادی تصمیم را می‌توان اتخاذ کرد:

bypass نشست یا تبادل از فیلترها گذر می‌کند
disconnect message اتصال نشست همراه با پیام قطع می‌شود
junk نشست یا تبادل به عنوان هرزنامه علامت‌گذاری می‌شود، یعنی یک سربرگ ‘X-Spam: yes’ به پیام‌ها اضافه می‌شود
reject message دستور همراه با پیام رد می‌شود
rewrite value پارامتر دستور با مقدار بازنویسی می‌شود

تصمیماتی که شامل یک پیام هستند مستلزم آنند که پیام طبق استانداردهای RFC معتبر باشد، به این معنی که باید با یک کد وضعیت 4xx یا 5xx شروع شوند. تصمیم‌ها را می‌توان در هر فازی اتخاذ کرد، اگرچه علامت‌گذاری به عنوان هرزنامه (junk) تنها پیش از ثبت نهایی پیام می‌تواند رخ دهد.

برخی از دستورالعمل‌های پیکربندی از بسط پارامترهای خود در زمان اجرا پشتیبانی می‌کنند. چنین دستورالعمل‌هایی (برای نمونه action maildir, action mda) می‌توانند از مشخص‌کننده‌های قالبی استفاده کنند که پیش از تحویل یا بازپخش بسط می‌یابند. قالب‌های زیر در حال حاضر پشتیبانی می‌شوند:

%{sender} نشانی ایمیل فرستنده، ممکن است رشته خالی باشد
%{sender.user} بخش کاربری نشانی ایمیل فرستنده، ممکن است خالی باشد
%{sender.domain} بخش دامنه نشانی ایمیل فرستنده، ممکن است خالی باشد
%{rcpt} نشانی ایمیل گیرنده
%{rcpt.user} بخش کاربری نشانی ایمیل گیرنده
%{rcpt.domain} بخش دامنه نشانی ایمیل گیرنده
%{dest} نشانی ایمیل گیرنده پس از بسط
%{dest.user} بخش کاربری پس از بسط
%{dest.domain} بخش دامنه پس از بسط
%{user.username} کاربر محلی
%{user.directory} دایرکتوری خانگی کاربر محلی
%{mbox.from} نام مورد استفاده در خطوط جداکننده From در mbox
%{mda} دستور mda، تنها برای بسته‌بندی‌های mda در دسترس است

قالب‌های بسط همچنین از بسط جزئی با استفاده از نشانه‌گذاری اختیاری براکت با آفست زیررشته پشتیبانی می‌کنند. برای نمونه، با دامنه گیرنده “example.org”:

%{rcpt.domain[0]} به “e بسط می‌یابد”
%{rcpt.domain[1]} به “x بسط می‌یابد”
%{rcpt.domain[8:]} به “org بسط می‌یابد”
%{rcpt.domain[-3:]} به “org بسط می‌یابد”
%{rcpt.domain[0:6]} به “example بسط می‌یابد”
%{rcpt.domain[0:-4]} به “example بسط می‌یابد”

علاوه بر این، اصلاح‌کننده‌ها می‌توانند روی توکن اعمال شوند. برای نمونه، با گیرنده “User+Tag@Example.org”:

%{rcpt:lowercase} به “user+tag@example.org بسط می‌یابد”
%{rcpt:uppercase} به “USER+TAG@EXAMPLE.ORG بسط می‌یابد”
%{rcpt:strip} به “User@Example.org بسط می‌یابد”
%{rcpt:lowercase|strip} به “user@example.org بسط می‌یابد”

به دلایل امنیتی، مقادیر بسط‌یافته پالایش می‌شوند و نویسه‌های بالقوه خطرناک با ‘:’ جایگزین می‌گردند. در شرایطی که حضور آنها مطلوب باشد، می‌توان اصلاح‌کننده “raw” را اعمال کرد. برای نمونه، با گیرنده “user+t?g@example.org”:

%{rcpt} به “user+t:g@example.org بسط می‌یابد”
%{rcpt:raw} به “user+t?g@example.org بسط می‌یابد”

هنگامی که روش تحویل یک اقدام mda باشد، smtpd(8) دستور مرتبط را برای تحویل اجرا می‌کند در حالی که محتوای ایمیل از طریق ورودی استاندارد ارائه می‌شود. انتظار می‌رود که دستور تمام محتوای ایمیل را بخواند.

کد خروج دستور نتیجه تحویل را گزارش می‌دهد: وضعیت 0 (EX_OK) تحویل موفقیت‌آمیز است؛ وضعیت‌های 71 (EX_OSERR) و 75 (EX_TEMPFAIL) شکست‌های موقت هستند؛ و تمام کدهای خروج دیگر به عنوان شکست دائمی در نظر گرفته می‌شوند.

متغیرهای محیطی زیر تنظیم می‌شوند:

دامنه گیرنده.
زیرنشانی گیرنده (ممکن است تنظیم نشده باشد).
دایرکتوری ورود کاربر تحویل.
بخش محلی نشانی کاربر گیرنده.
نام ورود کاربر.
نشانی گیرنده اصلی.
تنظیم‌شده روی _PATH_DEFPATH. به طور سنتی /usr/bin:/bin ، اما بسط‌یافته برای دربرگیری /usr/sbin ، /sbin ، /usr/X11R6/bin ، /usr/local/bin ، و /usr/local/sbin در OpenBSD.
نشانی گیرنده نهایی.
نشانی فرستنده (ممکن است خالی باشد).
تنظیم‌شده روی /bin/sh.
مترادف LOGNAME برای سازگاری با گذشته.

/etc/smtpd/smtpd.conf
پرونده پیکربندی پیش‌فرض smtpd(8).
/etc/smtpd/mailname
اگر این پرونده وجود داشته باشد، خط اول به عنوان نام سرور استفاده می‌شود. در غیر این صورت، نام سرور از نام میزبان محلی بازگردانده‌شده توسط gethostname(3) گرفته می‌شود؛ یا مستقیماً اگر یک نام دامنه کاملاً واجد شرایط باشد، یا با بازیابی نام متعارف مرتبط از طریق getaddrinfo(3).
/run/smtpd.sock
سوکت دامنه یونیکس برای اتصالات ورودی SMTP.
/var/spool/smtpd/
دایرکتوری‌های صف برای ایمیل‌ها در حین پردازش.

پرونده پیش‌فرض smtpd.conf که همراه با OpenBSD عرضه می‌شود، روی رابط شبکه loopback (lo0) گوش می‌دهد و امکان دریافت ایمیل از کاربران و دیمن‌های روی ماشین محلی را فراهم می‌سازد، و همچنین اجازه ارسال ایمیل به سرورهای راه دور را می‌دهد. چندین پیکربندی پیچیده‌تر در زیر ارائه شده است.

این مثال اول مشابه پیکربندی پیش‌فرض است، اما تمام ایمیل‌های خروجی به یک سرور SMTP راه دور بازپخش می‌شوند. یک پرونده اطلاعات محرمانه (secrets) برای تعیین نام کاربری و گذرواژه مورد نیاز است:

# touch /etc/smtpd/secrets
# chmod 640 /etc/smtpd/secrets
# chown root:smtpd /etc/smtpd/secrets
# echo "bob username:password" > /etc/smtpd/secrets

پرونده smtpd.conf به این صورت خواهد بود:

table aliases file:/etc/smtpd/aliases
table secrets file:/etc/smtpd/secrets

listen on lo0

action "local_mail" mbox alias <aliases>
action "outbound" relay host smtp+tls://bob@smtp.example.com \
	auth <secrets>

match from local for local action "local_mail"
match from local for any action "outbound"

در این مثال دوم، هدف این است که تحویل و بازپخش ایمیل تنها برای کاربرانی مجاز باشد که می‌توانند احراز هویت کنند (با استفاده از مشخصات ورود عادی خود). یک گواهی RSA باید برای اثبات هویت سرور ارائه شود. سرور ایمیل روی تمام رابط‌هایی که مسیرهای پیش‌فرض به آنها اشاره دارند گوش می‌دهد. ایمیل با مقصد محلی به یک MDA خارجی ارسال می‌شود. نخست، گواهی RSA ایجاد می‌شود:

# openssl genrsa -out /etc/ssl/private/mail.example.com.key 4096
# openssl req -new -x509 -key /etc/ssl/private/mail.example.com.key \
	-out /etc/ssl/mail.example.com.crt -days 365
# chmod 600 /etc/ssl/mail.example.com.crt
# chmod 600 /etc/ssl/private/mail.example.com.key

در مثال بالا، یک گواهی با اعتبار یک سال ایجاد شد. پرونده پیکربندی به این صورت خواهد بود:

pki mail.example.com cert "/etc/ssl/mail.example.com.crt"
pki mail.example.com key "/etc/ssl/private/mail.example.com.key"

table aliases file:/etc/smtpd/aliases

listen on lo0
listen on egress tls pki mail.example.com auth

action mda_with_aliases mda "/path/to/mda -f -" alias <aliases>
action mda_without_aliases mda "/path/to/mda -f -"
action "outbound" relay

match for local action mda_with_aliases
match from any for domain example.com action mda_without_aliases
match for any action "outbound"
match auth from any for any action "outbound"

برای سایت‌هایی که مایل به امضای پیام‌ها با استفاده از DKIM هستند، مثال زیر از برای امضای DKIM استفاده می‌کند:

table aliases file:/etc/smtpd/aliases

filter "dkimsign" proc-exec "filter-dkimsign -d <domain> -s <selector> \
	-k /etc/smtpd/dkim/private.key" user _dkimsign group _dkimsign

listen on socket filter "dkimsign"
listen on lo0 filter "dkimsign"

action "local_mail" mbox alias <aliases>
action "outbound" relay

match for local action "local_mail"
match for any action "outbound"

روش دیگر این است که بسته می‌تواند برای یکپارچه‌سازی با rspamd استفاده شود؛ یک دیمن شخص ثالث که چندین ویژگی ضد هرزنامه و همچنین امضای DKIM را ارائه می‌دهد. علاوه بر پیکربندی خود rspamd ، این کار مستلزم استفاده از کلیدواژه proc-exec است:

filter "rspamd" proc-exec "filter-rspamd"

سایت‌هایی که پیام‌های غیرمحلی را می‌پذیرند ممکن است بتوانند با رد پیام‌های جعلی که ادعا می‌کنند از دامنه محلی هستند، حجم هرزنامه‌های دریافتی را کاهش دهند. مثال زیر از یک جدول فهرست برای تعیین نشانی‌های IP بازپخش‌هایی استفاده می‌کند که ممکن است به طور قانونی ایمیلی با دامنه مالک به عنوان فرستنده ارسال کنند.

table aliases file:/etc/smtpd/aliases
table other-relays file:/etc/smtpd/other-relays

listen on lo0
listen on egress

action "local_mail" mbox alias <aliases>
action "outbound" relay

match for local action "local_mail"
match for any action "outbound"
match !from src <other-relays> mail-from "@example.com" for any \
      reject
match from any for domain example.com action "local_mail"

mailer.conf(5), table(5), smtpd-filters(7), makemap(8), smtpd(8)

دیمن smtpd(8) نخستین بار در OpenBSD 4.6 ظاهر شد.

August 26, 2025 Linux 6.12.107+deb13-amd64