PIPE(8) System Manager's Manual PIPE(8)

pipe - تحویل ایمیل به دستور خارجی در Postfix

pipe [generic Postfix daemon options] command_attributes...


دیمن pipe(8) درخواست‌های دریافتی از مدیر صف Postfix را پردازش می‌کند تا پیام‌ها را به دستورات خارجی تحویل دهد. انتظار می‌رود این برنامه از طریق مدیر فرآیند master(8) اجرا شود.

ویژگی‌های پیام از قبیل آدرس فرستنده، آدرس گیرنده و نام میزبان گام بعدی (next-hop) را می‌توان به صورت ماکروهای خط فرمان مشخص کرد که پیش از اجرای دستور خارجی بسط می‌یابند.

دیمن pipe(8) فایل‌های صف را به‌روزرسانی کرده و گیرندگان را به عنوان پایان‌یافته علامت‌گذاری می‌کند، یا به مدیر صف اطلاع می‌دهد که تحویل باید در زمان دیگری دوباره امتحان شود. گزارش‌های وضعیت تحویل بر حسب مورد به دیمن‌های bounce(8)، defer(8) یا trace(8) ارسال می‌شوند.

برخی از مقصدها نمی‌توانند بیش از یک گیرنده را در هر درخواست تحویل پردازش کنند. دستگاه‌های پیجر یا فکس نمونه‌هایی از این موارد هستند. علاوه بر این، هنگام افزودن سرآیند پیام Delivered-To: یا X-Original-To: به ابتدای پیام، تحویل چندگیرنده‌ای نامطلوب است.

برای جلوگیری از ارسال چند گیرنده در هر درخواست تحویل توسط Postfix، عبارت زیر را مشخص کنید:

transport_destination_recipient_limit = 1

در فایل main.cf مربوط به Postfix، که در آن transport نام موجود در ستون اول ورودی master.cf در Postfix برای ترابری تحویل مبتنی بر pipe است.

ویژگی‌های دستور خارجی در فایل master.cf در انتهای تعریف یک سرویس مشخص می‌شوند. نحو به شرح زیر است:

تغییر دایرکتوری ریشه (root) و دایرکتوری کاری فرآیند به دایرکتوری نام‌برده‌شده. این عمل پیش از جابجایی به مجوزهای مشخص‌شده با ویژگی user، و پیش از اجرای دستورالعمل اختیاری directory=pathname رخ می‌دهد. در صورت بروز خطا، تحویل به تعویق می‌افتد.

این ویژگی در Postfix 2.3 و نسخه‌های پس از آن در دسترس است.

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

این ویژگی در Postfix 2.2 و نسخه‌های پس از آن در دسترس است.

جداکننده رکوردهای خروجی. معمولاً از \r\n یا \n استفاده می‌شود. توالی‌های گریز متداول به سبک زبان C با علامت اسلش وارو (backslash) شناسایی می‌شوند: \a \b \f \n \r \t \v \ddd (حداکثر تا سه رقم هشت‌هشتی) و \\.
پرچم‌های اختیاری پردازش پیام. به‌طور پیش‌فرض، پیام بدون تغییر کپی می‌شود.
افزودن یک خط خالی در انتهای هر پیام. این عمل برای برخی از عامل‌های کاربر ایمیل (MUA) که خطوط "From " را تنها در صورتی که پیش از آن‌ها خط خالی باشد شناسایی می‌کنند، الزامی است.
افزودن سرآیند پیام "Delivered-To: recipient" با آدرس گیرنده پاکت به ابتدای پیام. توجه: برای کارکرد این گزینه، transport_destination_recipient_limit باید برابر ۱ باشد (برای جزئیات، بخش تحویل تک‌گیرنده را در بالا ببینید).

پرچم D همچنین تشخیص حلقه را اعمال می‌کند (Postfix 2.5 و بالاتر): اگر پیامی از قبل حاوی یک سرآیند Delivered-To: با همان آدرس گیرنده باشد، پیام به عنوان غیرقابل‌تحویل بازگردانده می‌شود. مقایسه آدرس‌ها به حروف بزرگ و کوچک حساس نیست.

این ویژگی در Postfix 2.0 و نسخه‌های پس از آن در دسترس است.

افزودن سرآیند پاکت "From sender time_stamp" به ابتدای محتوای پیام. این مورد برای نمونه توسط نرم‌افزارهای UUCP انتظار می‌رود.
افزودن سرآیند پیام "X-Original-To: recipient" با آدرس گیرنده همان‌طور که به Postfix داده شده به ابتدای پیام. توجه: برای کارکرد این گزینه، transport_destination_recipient_limit باید برابر ۱ باشد (برای جزئیات، بخش تحویل تک‌گیرنده را در بالا ببینید).

این ویژگی در Postfix 2.0 و نسخه‌های پس از آن در دسترس است.

افزودن سرآیند پیام Return-Path: با آدرس فرستنده پاکت به ابتدای پیام.
نشان می‌دهد که دستور خارجی تحویل نهایی را انجام می‌دهد. این پرچم بر وضعیت گزارش‌شده در پیام‌های DSN (اعلان وضعیت تحویل) مربوط به موفقیت اثر می‌گذارد، و آن را از "relayed" (رله‌شده) به "delivered" (تحویل داده‌شده) تغییر می‌دهد.

این ویژگی در Postfix 2.5 و نسخه‌های پس از آن در دسترس است.

تبدیل بخش دامنه در آدرس خط فرمان $original_recipient و $recipient (متن سمت راست راست‌ترین نویسه @) به حروف کوچک؛ و تبدیل کل اطلاعات میزبان یا دامنه خط فرمان $domain و $nexthop به حروف کوچک. این مورد برای تحویل از طریق UUCP توصیه می‌شود.
قرار دادن فاصله‌ها و سایر نویسه‌های خاص در نقل‌قول در بخش محلی (localpart) آدرس‌های خط فرمان $sender، $original_recipient و $recipient (متن سمت چپ راست‌ترین نویسه @)، مطابق با نسخه شفاف ۸ بیتی RFC 822. این مورد برای تحویل از طریق UUCP یا BSMTP توصیه می‌شود.

نتیجه با تجزیه آدرس گیرندگان خط فرمان توسط دستور ارسال ایمیل sendmail(1) در Postfix سازگار است.

پرچم q تنها بر کل آدرس‌ها اثر می‌گذارد، نه اطلاعات ناقص آدرس حاصل از ماکروهای خط فرمان $user، $extension یا $mailbox.

تبدیل بخش محلی آدرس خط فرمان $original_recipient و $recipient (متن سمت چپ راست‌ترین نویسه @) به حروف کوچک. این مورد برای تحویل از طریق UUCP توصیه می‌شود.
.
افزودن "." به ابتدای خطوطی که با "." شروع می‌شوند. این مورد برای نمونه توسط نرم‌افزارهای BSMTP مورد نیاز است.
>
افزودن ">" به ابتدای خطوطی که با "From " شروع می‌شوند. این مورد برای نمونه توسط نرم‌افزارهای UUCP انتظار می‌رود.
جایگزین کردن آدرس فرستنده پوچ (null) (که معمولاً برای اعلان‌های وضعیت تحویل استفاده می‌شود) با متن مشخص‌شده هنگام بسط ماکروی خط فرمان $sender، و هنگام تولید سرآیند پیام From_ یا Return-Path:.

اگر متن جایگزین فرستنده پوچ یک رشته غیرخالی باشد، تحت تأثیر پرچم q برای نقل‌قول آدرس در آرگومان‌های خط فرمان قرار می‌گیرد.

متن جایگزین فرستنده پوچ می‌تواند خالی باشد؛ این حالت برای فیلترهای محتوایی که ایمیل را مجدداً به Postfix بازمی‌گردانند توصیه می‌شود. آدرس فرستنده خالی تحت تأثیر پرچم q برای نقل‌قول آدرس در آرگومان‌های خط فرمان قرار نمی‌گیرد.

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

نادرست: command -f$sender -- $recipient
دستور مقدار گزینه -f را زمانی که آدرس فرستنده یک رشته پوچ باشد به اشتباه تجزیه خواهد کرد. برای تجزیه صحیح، $sender را به عنوان یک آرگومان مستقل مشخص کنید:
درست: command -f $sender -- $recipient
نکته: اطراف command، $sender یا $recipient علامت نقل‌قول قرار ندهید.
این ویژگی در Postfix 2.3 و نسخه‌های پس از آن در دسترس است.
پیام‌هایی که از این حد اندازه (به بایت) فراتر می‌روند تحویل داده نشوند؛ در عوض به فرستنده بازگردانده شوند.
اجرای دستور خارجی با شناسه کاربر و شناسه گروه مشخص‌شده با username. این نرم‌افزار از اجرای دستورات با دسترسی‌های root، یا با دسترسی‌های مالک سیستم پستی خودداری می‌کند. اگر groupname مشخص شود، شناسه گروه متناظر به جای شناسه گروه username استفاده می‌شود.
دستوری که باید اجرا شود. این ویژگی باید به عنوان آخرین ویژگی دستور مشخص شود. دستور مستقیماً اجرا می‌شود، یعنی بدون تفسیر نویسه‌های متا توسط مفسر دستورات شِل.

در اطراف آرگومان‌های دستوری که حاوی فاصله هستند، آرگومان‌هایی که با "{" شروع می‌شوند، یا آرگومان‌هایی که باید یک رشته خالی باشند، "{" و "}" قرار دهید (در Postfix 3.0 و بالاتر). نویسه‌های خارجی "{" و "}" به همراه هرگونه فاصله ابتدایی یا انتهایی در متن باقی‌مانده حذف خواهند شد.

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

علاوه بر قالب ${name}، قالب‌های $name و قالب منسوخ‌شده $(name) نیز شناسایی می‌شوند. در جایی که یک $ تکی مد نظر است، $$ را مشخص کنید.

${client_address}
این ماکرو به آدرس شبکه کلاینت راه دور بسط می‌یابد.

این ویژگی در Postfix 2.2 و نسخه‌های پس از آن در دسترس است.

${client_helo}
این ماکرو به پارامتر دستور HELO کلاینت راه دور بسط می‌یابد.

این ویژگی در Postfix 2.2 و نسخه‌های پس از آن در دسترس است.

${client_hostname}
این ماکرو به نام میزبان کلاینت راه دور بسط می‌یابد.

این ویژگی در Postfix 2.2 و نسخه‌های پس از آن در دسترس است.

${client_port}
این ماکرو به شماره درگاه TCP کلاینت راه دور بسط می‌یابد.

این ویژگی در Postfix 2.5 و نسخه‌های پس از آن در دسترس است.

${client_protocol}
این ماکرو به پروتکل کلاینت راه دور بسط می‌یابد.

این ویژگی در Postfix 2.2 و نسخه‌های پس از آن در دسترس است.

${domain}
این ماکرو به بخش دامنه آدرس گیرنده بسط می‌یابد. به عنوان مثال، در آدرس user+foo@domain دامنه برابر domain است.

این اطلاعات توسط پرچم h برای تبدیل حروف کوچک و بزرگ تغییر می‌یابد.

این ویژگی در Postfix 2.5 و نسخه‌های پس از آن در دسترس است.

${envid}
این ماکرو در صورت موجود بودن به شناسه پاکت طبق RFC 3461، و در غیر این صورت به یک رشته خالی بسط می‌یابد.

این ویژگی در Postfix 3.9 و نسخه‌های پس از آن در دسترس است.

${extension}
این ماکرو به بخش پسوند آدرس گیرنده بسط می‌یابد. به عنوان مثال، در آدرس user+foo@domain پسوند برابر foo است.

یک آرگومان خط فرمان که حاوی ${extension} باشد به همان تعداد گیرندگان به آرگومان‌های خط فرمان بسط می‌یابد.

این اطلاعات توسط پرچم u برای تبدیل حروف کوچک و بزرگ تغییر می‌یابد.

${mailbox}
این ماکرو به کل بخش محلی یک آدرس گیرنده بسط می‌یابد. به عنوان مثال، در آدرس user+foo@domain صندوق پستی برابر user+foo است.

یک آرگومان خط فرمان که حاوی ${mailbox} باشد به همان تعداد گیرندگان به آرگومان‌های خط فرمان بسط می‌یابد.

این اطلاعات توسط پرچم u برای تبدیل حروف کوچک و بزرگ تغییر می‌یابد.

${nexthop}
این ماکرو به نام میزبان گام بعدی (next-hop) بسط می‌یابد.

این اطلاعات توسط پرچم h برای تبدیل حروف کوچک و بزرگ تغییر می‌یابد.

${original_recipient}
این ماکرو به آدرس کامل گیرنده پیش از هرگونه بازنویسی آدرس یا ایجاد نام مستعار بسط می‌یابد.

یک آرگومان خط فرمان که حاوی ${original_recipient} باشد به همان تعداد گیرندگان به آرگومان‌های خط فرمان بسط می‌یابد.

این اطلاعات توسط پرچم‌های hqu برای نقل‌قول و تبدیل حروف کوچک و بزرگ تغییر می‌یابد.

این ویژگی در Postfix 2.5 و نسخه‌های پس از آن در دسترس است.

${queue_id}
این ماکرو به شناسه صف بسط می‌یابد.

این ویژگی در Postfix 2.11 و نسخه‌های پس از آن در دسترس است.

${recipient}
این ماکرو به آدرس کامل گیرنده بسط می‌یابد.

یک آرگومان خط فرمان که حاوی ${recipient} باشد به همان تعداد گیرندگان به آرگومان‌های خط فرمان بسط می‌یابد.

این اطلاعات توسط پرچم‌های hqu برای نقل‌قول و تبدیل حروف کوچک و بزرگ تغییر می‌یابد.

${sasl_method}
این ماکرو به نام سازوکار احراز هویت SASL در دستور AUTH در زمان دریافت پیام توسط سرور Postfix SMTP بسط می‌یابد.

این ویژگی در Postfix 2.2 و نسخه‌های پس از آن در دسترس است.

${sasl_sender}
این ماکرو به نام فرستنده SASL (یعنی ارسال‌کننده اصلی طبق RFC 4954) در دستور MAIL FROM در زمان دریافت پیام توسط سرور Postfix SMTP بسط می‌یابد.

این ویژگی در Postfix 2.2 و نسخه‌های پس از آن در دسترس است.

${sasl_username}
این ماکرو به نام کاربری SASL در دستور AUTH در زمان دریافت پیام توسط سرور Postfix SMTP بسط می‌یابد.

این ویژگی در Postfix 2.2 و نسخه‌های پس از آن در دسترس است.

${sender}
این ماکرو به آدرس فرستنده پاکت بسط می‌یابد. به‌طور پیش‌فرض، آدرس فرستنده پوچ به MAILER-DAEMON بسط می‌یابد؛ این مقدار را می‌توان همان‌طور که در بالا شرح داده شد با ویژگی null_sender تغییر داد.

این اطلاعات توسط پرچم q برای نقل‌قول تغییر می‌یابد.

${size}
این ماکرو به برآورد Postfix از اندازه پیام بسط می‌یابد، که تقریبی از اندازه پیام در هنگام تحویل است.
${user}
این ماکرو به بخش نام کاربری آدرس گیرنده بسط می‌یابد. به عنوان مثال، در آدرس user+foo@domain بخش نام کاربری برابر user است.

یک آرگومان خط فرمان که حاوی ${user} باشد به همان تعداد گیرندگان به آرگومان‌های خط فرمان بسط می‌یابد.

این اطلاعات توسط پرچم u برای تبدیل حروف کوچک و بزرگ تغییر می‌یابد.

RFC 3463 (کدهای وضعیت پیشرفته)


انتظار می‌رود کدهای وضعیت خروج دستور از قراردادهای تعریف‌شده در <sysexits.h> پیروی کنند. وضعیت خروج 0 به معنی اتمام موفقیت‌آمیز و عادی است.

در صورت وجود وضعیت خروج غیرصفر، مقدار محدودی از خروجی دستور در لاگ ثبت شده و در اعلان وضعیت تحویل گزارش می‌شود. هنگامی که خروجی با یک کد وضعیت پیشرفته 4.X.X یا 5.X.X آغاز شود، این کد وضعیت بر وضعیت خروج غیرصفر اولویت پیدا می‌کند (نسخه 2.3 و بالاتر Postfix).

پس از تحویل موفقیت‌آمیز (وضعیت خروج صفر)، مقدار محدودی از خروجی دستور در لاگ ثبت شده و در اعلان‌های وضعیت تحویل "موفق" گزارش می‌شود (Postfix 3.0 و بالاتر). این خروجی دستور از نظر وجود کد وضعیت پیشرفته بررسی نمی‌شود.

مشکلات و تراکنش‌ها در syslogd(8) یا postlogd(8) ثبت می‌شوند. فایل‌های پیام آسیب‌دیده به گونه‌ای علامت‌گذاری می‌شوند تا مدیر صف بتواند آن‌ها را برای بررسی بیشتر به صف corrupt منتقل کند.

این برنامه نیازمند دو نقش مجزا است: ۱) دسترسی به سازوکارهای اختصاصی صف و ارتباط بین‌فرایندی (IPC) در Postfix، و ۲) اجرای دستورات خارجی در قالب کاربر مشخص‌شده. بنابراین، این برنامه از نظر امنیتی حساس است.

تغییرات در main.cf به‌طور خودکار اعمال می‌شوند زیرا فرآیندهای pipe(8) تنها برای مدت زمان محدودی اجرا می‌گردند. برای تسریع در اعمال تغییرات، از دستور "postfix reload" استفاده کنید.

متن زیر تنها خلاصه پارامترها را ارائه می‌دهد. برای جزئیات بیشتر شامل مثال‌ها به postconf(5) مراجعه کنید.

در متن زیر، transport فیلد اول در یک ورودی master.cf است.

یک بازنویسی اختصاصی ترابری برای مقدار پارامتر command_time_limit، که در آن transport نام ترابری تحویل پیام در master.cf است.

پیاده‌سازی‌شده در دیمن qmgr(8):

یک بازنویسی اختصاصی ترابری برای مقدار پارامتر default_destination_concurrency_limit، که در آن transport نام ترابری تحویل پیام در master.cf است.
یک بازنویسی اختصاصی ترابری برای مقدار پارامتر default_destination_recipient_limit، که در آن transport نام ترابری تحویل پیام در master.cf است.

مکان پیش‌فرض فایل‌های پیکربندی main.cf و master.cf در Postfix.
حداکثر مدت زمانی که یک فرآیند دیمن Postfix مجاز است برای رسیدگی به یک درخواست صرف کند، پیش از آنکه توسط تایمر نگهبان داخلی (watchdog) متوقف شود.
حداکثر تعداد ارقام پس از ممیز اعشار هنگام ثبت مقادیر تأخیر در لاگ.
فهرست متغیرهای محیطی که یک فرآیند Postfix به فرآیندهای غیر Postfix صادر خواهد کرد.
محدودیت زمانی برای ارسال یا دریافت اطلاعات از طریق کانال ارتباطی داخلی.
حساب کاربری سیستم UNIX که مالک صف Postfix و اکثر فرآیندهای دیمن Postfix است.
حداکثر مدت زمانی که یک فرآیند دیمن بیکار Postfix در انتظار یک اتصال ورودی منتظر می‌ماند، پیش از آنکه به صورت داوطلبانه متوقف شود.
حداکثر تعداد اتصالات ورودی که یک فرآیند دیمن Postfix پیش از توقف داوطلبانه به آن‌ها سرویس می‌دهد.
شناسه فرآیند (PID) یک دستور یا فرآیند دیمن Postfix.
نام فرآیند یک دستور یا فرآیند دیمن Postfix.
مکان دایرکتوری سطح بالای صف Postfix.
مجموعه نویسه‌هایی که می‌توانند بخش محلی (localpart) یک آدرس ایمیل، نام کاربری یا نام فایل forward. را از پسوند آن جدا کنند.
تسهیلات لاگ‌گیری سیستم (syslog facility) برای ثبت وقایع Postfix.
پیشوندی که به نام فرآیند در رکوردهای syslog اضافه می‌شود، به طوری که مثلاً "smtpd" به "prefix/smtpd" تبدیل می‌شود.

در دسترس از نسخه 3.0 و بالاتر Postfix:

فیلتر اختیاری برای عامل تحویل pipe(8) به منظور تغییر کد وضعیت تحویل یا متن توضیحی تحویل‌های موفق یا ناموفق.

در دسترس از نسخه 3.3 و بالاتر Postfix:

فعال‌سازی پشتیبانی از آدرس گیرنده اصلی پس از بازنویسی آدرس به یک آدرس دیگر (برای مثال با نام مستعار یا با نگاشت متعارف).
نام سرویس master.cf برای یک فرآیند دیمن Postfix.

در دسترس از نسخه 3.5 و بالاتر Postfix:

قالب آدرس ایمیلی که در ثبت وقایع غیردیباگ (info، warning و غیره) استفاده خواهد شد.

qmgr(8), queue manager
bounce(8), delivery status reports
postconf(5), configuration parameters
master(5), generic daemon options
master(8), process manager
postlogd(8), Postfix logging
syslogd(8), system logging

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

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