ایمیل چگونه کار می کند
ایمیل شما مستقیم به گیرنده نمی رود: اول به سرور پست فرستنده تحویل داده می شود، آن سرور از DNS می پرسد سرور پست دامنه گیرنده کجاست، و بعد نامه را همان جا تحویل می دهد. سرور گیرنده در همان لحظه یکی از سه تصمیم را می گیرد، قبول یا اسپم یا رد، و سه رکورد SPF و DKIM و DMARC بیشترین اثر را روی این تصمیم دارند.
- درس ۹ از ۱۲
- میانی
- رایگان، بدون ثبت نام
پنج ایستگاه بین دکمه ارسال و صندوق گیرنده
هیچ جای این مسیر دستگاه شما مستقیم به دستگاه گیرنده وصل نمی شود.
-
۱
می نویسید و ارسال را می زنید
وبمیل یا اپ روی گوشی، فرقی ندارد
-
۲
تحویل به سرور پست خودتان
با پروتکل SMTP. از اینجا به بعد کار از دست شما خارج است.
-
۳
پرسش از DNS: سرور پست گیرنده کجاست
رکورد MX. دامنه ای که نامه قبول نمی کند، همین جا اعلامش می کند.
-
۴
اتصال به آن سرور و تحویل نامه
اگر جواب نداد، نامه در صف می ماند و بعدا دوباره تلاش می شود
-
۵
تصمیم سرور گیرنده
صندوق ورودی، پوشه اسپم، یا رد کردن همان لحظه
مسیر برای یک نامه بین دو دامنه مستقل است. اگر فرستنده و گیرنده روی یک سرویس باشند، ایستگاه های دوم و سوم و چهارم داخل همان سرویس اتفاق می افتند و نامه هیچ وقت به اینترنت نمی رود.
آخرین بررسی: فکت ها و نام ابزارهای این درس در همین تاریخ با منابعشان بازبینی شده اند.
وقتی دکمه ارسال را می زنید، نامه از کجاها رد می شود؟
پنج ایستگاه، و هیچ کدامشان اتصال مستقیم بین شما و گیرنده نیست. اول برنامه ای که با آن می نویسید، چه وبمیل باشد چه یک اپ روی گوشی، نامه را به سرور پست خودتان تحویل می دهد. این تحویل با پروتکلی به نام SMTP انجام می شود و همین پروتکل بعدا بین سرورها هم به کار می رود؛ خواندن نامه کار دیگری است و با IMAP یا POP انجام می شود، که خیلی ها این دو را با هم اشتباه می گیرند.
ایستگاه دوم جالب ترینشان است. سرور فرستنده نمی داند نامه های example.ir کجا باید تحویل داده شوند، پس از DNS می پرسد و رکوردی به نام MX را می خواند. آن رکورد اسم سرور پست آن دامنه را می گوید. دامنه ما این را دارد: 10 mail.rgb.ir، یعنی نامه های rgb.ir به ماشینی به این نام تحویل داده می شوند.
و دامنه ای که اصلا نامه قبول نمی کند این را صریح اعلام می کند. example.com یک رکورد MX خالی منتشر کرده، چیزی که RFC 7505 اسمش را null MX گذاشته، و معنی اش این است که تلاش نکنید. در لاگ سرور خودمان همین را می بینید: نامه ای به یک نشانی روی آن دامنه، بدون هیچ تلاشی برای اتصال، همان جا برگشت خورد با دلیل Domain example.com does not accept mail (nullMX).
ایستگاه سوم و چهارم اتصال به آن سرور و تحویل نامه است. ایستگاه پنجم تصمیم سرور گیرنده است، و بقیه این درس درباره همین یک تصمیم است.

فرق «به اسپم رفت» با «اصلا نرسید» چیست؟
این دو یک اتفاق نیستند و علاجشان هم یکی نیست. نامه ای که به اسپم رفته، قبول شده است؛ سرور گیرنده آن را گرفته و بعد تصمیم گرفته کجا بگذاردش. نامه ای که رد شده اصلا قبول نشده و شما یک نامه برگشتی می گیرید که علتش را می گوید. حالت سومی هم هست که بیشتر مردم نمی شناسندش: نامه در صف مانده و سرور فرستنده هر چند دقیقه دوباره تلاش می کند.
لاگ سرور خودمان هر چهار حالت را در چند ساعت نشان می دهد. قبول شدن این شکلی است: status=sent (250 2.0.0 OK). صف این شکلی: status=deferred با پیام 452-4.2.2 The recipient's inbox is out of storage space، که برای یکی از نامه های ما دو روز و اندی تکرار شد. رد شدن این شکلی: status=bounced. و نرفتن اصلا، همان مورد null MX بخش قبل.
حالا مهم ترین خط. یکی از نامه های همین سرور را جیمیل با این جواب رد کرد: 550-5.7.26 Your email has been blocked because the sender is unauthenticated. Gmail requires all senders to authenticate with either SPF or DKIM. و بعد نتیجه را نوشت: DKIM = did not pass و SPF [] with ip: [65.109.218.65] = did not pass.
در همان چند دقیقه، از همان سرور و همان آی پی، نامه های عادی با 250 2.0.0 OK قبول شدند. پس مشکل نه سرور بود نه آی پی. آن یکی نامه یک اعلان برگشتی بود و فرستنده پاکتش خالی بود، همان from=<> که در لاگ دیده می شود؛ وقتی پاکت نامی ندارد، SPF چیزی برای بررسی ندارد و اگر امضای DKIM هم نباشد، از نظر جیمیل نامه بی هویت است. این دقیقا همان جایی است که بحث احراز هویت شروع می شود.
SPF و DKIM و DMARC هر کدام چه کاری می کنند؟
هر سه رکوردهای متنی در DNS دامنه شما هستند و هر سه به یک سوال جواب می دهند از سه زاویه: این نامه واقعا از طرف این دامنه است؟
SPF فهرست سرورهایی است که اجازه دارند از طرف دامنه شما نامه بفرستند. رکورد ما این است: v=spf1 +mx +a ~all، یعنی سرور پست دامنه و سرور خود سایت مجازند و بقیه مشکوک اند. آن ~all در انتها حالت میانی است، نه رد قاطع؛ سخت گیرانه ترش -all است و ما عمدا آن را انتخاب نکرده ایم، چون کافی است یک سرویس فرستنده را از قلم بیندازید تا نامه های واقعی رد شوند.
DKIM امضایی است که سرور فرستنده روی خود نامه می گذارد. کلید خصوصی روی سرور می ماند و کلید عمومی در DNS منتشر می شود، زیر نامی که به آن سلکتور می گویند. مال ما زیر default._domainkey.rgb.ir نشسته و کلید خصوصی اش روی همین ماشین است؛ همین حالا هم بررسی کردیم که کلید منتشرشده دقیقا همان کلید روی دیسک است. یک محدودیت را هم رک بگوییم: کلید ما ۱۰۲۴ بیتی است، که RFC 8301 آن را کف تعیین کرده و ۲۰۴۸ بیت را توصیه می کند. یعنی جای بهتر شدن دارد.
DMARC هیچ چیزی را خودش بررسی نمی کند. به سرور گیرنده می گوید اگر دو تای قبلی نگرفت چه کند، و گزارش ها را کجا بفرستد. رکورد ما v=DMARC1;p=quarantine;rua=mailto:admin@rgb.ir است، یعنی نامه مشکوک را قرنطینه کن و گزارشش را بفرست.
ظرافتی که معمولا گفته نمی شود: SPF نشانی روی پاکت را می بیند و DKIM امضای روی خود نامه را، و این دو می توانند با هم فرق کنند. کاری که DMARC اضافه می کند این است که می خواهد یکی از آن دو با نام فرستنده ای که کاربر می بیند هم خانواده باشد. برای همین است که سرویس های خبرنامه ای که از دامنه خودشان می فرستند ولی نام شما را نشان می دهند، بدون تنظیم درست، از نظر DMARC رد می شوند.
سه رکوردی که تصمیم سرور گیرنده را می سازند
ستون سوم چیزی را بررسی نمی کند؛ فقط می گوید وقتی دو تای اول نگرفتند چه کار کنند.
-
SPF
کدام سرورها اجازه دارند از طرف این دامنه نامه بفرستند. نشانی روی پاکت را بررسی می کند.
-
DKIM
امضایی روی خود نامه، که با کلید عمومی منتشرشده در DNS بررسی می شود.
-
DMARC
اگر دو تای بالا نگرفتند چه کند، و گزارش را کجا بفرستد. مال ما روی قرنطینه است.
هر سه با هم هم تضمین صندوق ورودی نیستند. اعتبار آی پی فرستنده و خود متن نامه هم اثر دارند و هیچ رکورد DNS ای آنها را درست نمی کند.
کدام یک از این سه را دارید؟ روش بررسی
سه استعلام DNS جواب دو تای اول را می دهند و سومی چیز دیگری لازم دارد. برای SPF رکوردهای متنی خود دامنه را بخوانید، برای DMARC رکورد متنی زیرشاخه _dmarc را:
dig +short example.ir TXT
dig +short _dmarc.example.ir TXTبرای DKIM اما نمی شود کورکورانه پرسید، چون اسم سلکتور را باید بدانید و هر سرویس ایمیل سلکتور خودش را دارد. آن را از پنل سرویس ایمیلتان بردارید و بعد dig +short SELECTOR._domainkey.example.ir TXT بگیرید. اگر نمی خواهید با دستور کار کنید، ابزار رایگان بررسی رکوردهای DNS و سلامت ایمیل همین سه را یکجا نشان می دهد و صادقانه می گوید که DKIM را بدون دانستن سلکتور چک نمی کند.
ولی هیچ کدام از این ها ثابت نمی کند نامه شما در عمل قبول می شود. تنها مدرک واقعی نظر گیرنده است. یک نامه به نشانی ای بفرستید که خودتان به آن دسترسی دارید و در آن سرویس دنبال گزینه ای بگردید که هدرهای اصلی نامه را نشان می دهد؛ در جیمیل اسمش «Show original» است. سطری به نام Authentication-Results پیدا کنید و ببینید کنار هر سه چه نوشته.
یک اشتباه رایج را هم اینجا بگیریم: نتیجه را با فرستادن به نشانی روی همان دامنه آزمایش نکنید. سرور با نامه ای که از خودش آمده مثل غریبه رفتار نمی کند و نتیجه گمراه کننده می شود.
چرا وضعیت «ارسال شد» هیچ چیزی را ثابت نمی کند؟
وقتی یک فرم تماس یا یک افزونه می گوید ایمیل ارسال شد، منظورش این است که نامه را به سرور پست محلی تحویل داده. این آغاز مسیر است، نه پایانش. در وردپرس تابع wp_mail() وقتی true برمی گرداند دقیقا همین را می گوید و نه بیشتر؛ ما این را روی سایت های خودمان بارها دیده ایم و قاعده ثابتمان شده که تا لاگ سرور پست را ندیده ایم، درباره تحویل چیزی نگوییم.
جایی که جواب واقعی نوشته می شود لاگ سرور پست است، و آنجا هر نامه یک خط دارد که با status= تمام می شود و جواب عین به عین سرور گیرنده را نقل می کند. تفاوت این دو نگاه در آمار همین سرور دیده می شود: در بازه ای که لاگ فعلی نگه داشته، ۴۴ نامه status=sent گرفتند و ۲۴ نامه status=bounced. برنامه ای که فرستاده بود، برای بخشی از آن ۲۴ تا هم گفته بود ارسال شد.
اگر ایمیل برایتان مهم است، یک عادت بیشتر لازم نیست: بعد از هر تغییری در تنظیمات ایمیل، یک نامه واقعی بفرستید و لاگ را نگاه کنید. اگر به لاگ سرور دسترسی ندارید، از میزبان سایتتان بخواهید خط مربوط به آن نامه را برایتان بفرستد. یک خط لاگ از ده ساعت حدس زدن باارزش تر است.
زیر یک پیام «ارسال شد» چه چیزهایی هست
بالای خط چیزی است که برنامه به شما نشان می دهد. زیر خط، چهار سرنوشتی که واقعا ممکن است.
ارسال شد
یعنی نامه به سرور پست محلی تحویل داده شد. درباره گیرنده هیچ نمی گوید.
-
قبول شد
سرور گیرنده جواب 250 داده. در لاگ: status=sent
-
در صف ماند
جواب موقت. دوباره تلاش می شود؛ یکی از نامه های ما دو روز در صف بود.
-
همان جا رد شد
جواب دائمی و یک نامه برگشتی. در لاگ: status=bounced
-
اصلا فرستاده نشد
دامنه گیرنده اعلام کرده نامه قبول نمی کند. هیچ اتصالی برقرار نمی شود.
حتی حالت اول هم نمی گوید نامه در کدام پوشه نشسته. قبول شدن یعنی سرور گیرنده نامه را گرفته، نه اینکه گیرنده آن را دیده است.
مسیر سریع با هوش مصنوعی
راه معمولی برخورد با ایمیلی که به اسپم می رود این است که در اینترنت دنبال «رکورد SPF آماده» بگردیم و یکی را کپی کنیم. راه سریع این است که اول مدرک را جمع کنید و بعد مدل زبانی را وادار کنید فقط همان مدرک را با رکوردهای فعلی خودتان مقایسه کند. تفاوتش این است که در حالت دوم می فهمید کدام یک از سه بررسی نگرفته، و رکورد دیگری هم به دامنه اضافه نمی کنید که فردا خودش دردسر شود.
- مدرک را بردارید. یا متن کامل نامه برگشتی، یا سطر <code>Authentication-Results</code> از نامه ای که به یک نشانی خارج از دامنه خودتان فرستاده اید. بدون یکی از این دو، بقیه مراحل حدس زدن است.
- رکوردهای فعلی خودتان را بردارید: خروجی خام <code>dig +short DOMAIN TXT</code> و <code>dig +short _dmarc.DOMAIN TXT</code>. اگر سلکتور DKIM را می دانید، آن را هم بگیرید.
- هر دو را با هم به یک مدل ردیف اول بدهید، همان دسته ای که برای قضاوت به کار می رود نه برای کار انبوه، و بخواهید فقط تشخیص بدهد و رکورد نسازد.
- هر بار یک رکورد را عوض کنید و دوباره یک نامه واقعی بفرستید. DNS کش دارد و اگر دو چیز را با هم عوض کنید، هیچ وقت نمی فهمید کدامش کار کرد.
نسخه آماده کپی
نقش تو کارشناس تحویل ایمیل است. فقط بر اساس داده های زیر قضاوت کن و هیچ رکوردی از حافظه اضافه نکن.
دامنه من: {دامنه}
سرویسی که با آن ایمیل می فرستم: {مثلا سرور هاست، یا نام سرویس}
خروجی خام dig +short {دامنه} TXT:
{خروجی خام}
خروجی خام dig +short _dmarc.{دامنه} TXT:
{خروجی خام}
مدرک از سمت گیرنده (متن نامه برگشتی یا سطر Authentication-Results):
{متن خام}
چهار چیز بنویس:
۱. کدام یک از سه بررسی نگرفته: SPF یا DKIM یا هم راستایی DMARC. فقط بر اساس مدرک بالا، و بگو کدام تکه از متن این را نشان می دهد.
۲. علت محتمل، در یک جمله.
۳. دقیقا کدام رکورد باید عوض شود و چه چیزی از آن باید تغییر کند. متن رکورد نهایی را ننویس؛ فقط بگو چه چیزی کم است یا اضافه است.
۴. اگر داده ها برای تشخیص کافی نیستند، بنویس چه چیز دیگری لازم است.
قاعده ها: اگر سلکتور DKIM را در داده ها ندیدی، نگو DKIM ندارم؛ بنویس قابل بررسی نیست. تعداد جستجوهای DNS داخل رکورد SPF را بشمار و اگر از ده گذشت همان را اعلام کن. هیچ رکورد آماده ای پیشنهاد نکن.
قبل از اعتماد به خروجی: دو چیز را نچسبانید: نامه خام کامل، و هر رکوردی که مدل خودش ساخته باشد. نامه خام نشانی گیرنده ها و گاهی لینک های یک بار مصرف بازیابی رمز را دارد؛ فقط سطر <code>Authentication-Results</code> و متن برگشتی را بردارید. و رکورد ساختگی: یک SPF می تواند از نظر ظاهری بی نقص باشد و در عمل کار نکند، چون RFC 7208 سقف ده جستجوی DNS برای ارزیابی یک رکورد گذاشته و از آن به بعد نتیجه دائمی رد است. این خطا هیچ علامتی روی متن رکورد نمی گذارد؛ فقط با یک اعتبارسنج SPF یا با شمردن دستی دیده می شود.
هوش مصنوعی در این کار
ایمیل یکی از معدود موضوع هایی است که مدل زبانی در آن واقعا صرفه جویی می کند، چون کار اصلی خواندن متن های خام و کدهای عددی است و مدل در همین خوب است. اما مرز روشنی دارد: تشخیص را به مدل بسپارید و نوشتن رکورد را نه. یک رکورد اشتباه در DNS، برخلاف یک جواب اشتباه در چت، چند ساعت روی دامنه شما می ماند و ایمیل واقعی را قربانی می کند.
ابزارهایی که واقعا کمک می کنند
- Claude برای خواندن متن برگشتی خام و سطرهای هدر بهترین انتخاب این فهرست است، چون متن های بلند و بی ساختار را با دقت دنبال می کند. ایران در فهرست کشورهای پشتیبانی شده انتروپیک نیست، پس راه رسمی ثبت نام و پرداخت وجود ندارد.
- Gemini برای ترجمه اصطلاح های تحویل ایمیل به فارسی و توضیح دادن یک کد عددی خوب است. صفحه خود گوگل می نویسد اپ جمنای در بیش از دویست و سی کشور و منطقه کار می کند و ایران در آن فهرست نیست.
- Gemini Notebook کاربرد دقیقش اینجا این است: مستندات ایمیل سرویس میزبان خودتان را بارگذاری کنید و سلکتور DKIM و نام دقیق تنظیم را از داخل همان سند بپرسید، نه از حافظه مدل. روی حساب گوگل کار می کند و ایران در فهرست مناطق در دسترس نیست.
کجا نتیجه معکوس می دهد
خطر اصلی این موضوع یک شکل خاص دارد و کمتر جایی گفته می شود: مدل رکوردی می سازد که ظاهرش کاملا درست است و در عمل کار نمی کند. متن SPF می تواند بی عیب باشد و باز هم رد شود، چون RFC 7208 برای ارزیابی یک رکورد سقف ده جستجوی DNS گذاشته و رد شدن از آن سقف نتیجه را دائمی خراب می کند؛ این را با چشم نمی شود دید. خطر دوم DMARC است: مدلی که پیشنهاد می کند از همان اول p=reject بگذارید، بدون اینکه اول با گزارش ها ببینید چه چیزی رد می شود، می تواند ایمیل واقعی شما را از فردا قطع کند. و خود انتروپیک این ساختن با اطمینان را در مستنداتش توهم می نامد و راهکار کم کردنش را می نویسد، یعنی سازنده هم آن را ضعف واقعی می داند. درباره داده هم: راهنمای خود گوگل برای جمنای صریحا می گوید اطلاعات محرمانه وارد نکنید، و یک نامه خام دقیقا همان است. برای اینکه ببینید پرداخت این ابزارها از ایران چه شکلی دارد، راهنمای خرید را ببینید.
منبع ها: RFC 7208: Sender Policy Framework, the DNS lookup limit Anthropic: reduce hallucinations Anthropic: supported countries Google: Gemini Apps privacy and data Google: where Gemini Apps are available
حد این توصیه
این درس درباره ایمیلی است که از دامنه خودتان و از سرور خودتان یا سرور میزبان می رود. اگر ایمیل شما روی سرویس های سازمانی مثل گوگل ورک اسپیس یا مایکروسافت ۳۶۵ است، همین سه رکورد لازم اند ولی پنل خود آن سرویس بیشترش را می سازد و سلکتور DKIM هم مال آنهاست، پس مسیر عملی فرق می کند. مهم تر از آن، احراز هویت بلیت ورود است نه تضمین صندوق ورودی: بعد از این سه، اعتبار آی پی فرستنده و خود متن نامه تصمیم می گیرند و هیچ رکورد DNS ای آنها را درست نمی کند. دو چیز را هم عمدا نیاورده ایم چون برای شروع لازم نیستند و درس خودشان را می خواهند: BIMI و ARC.
از تجربه خود ما
همه عددها و خط های این درس از سرور پست خود ما در ۷ سپتامبر ۲۰۲۶ برداشته شده اند. سه چیز که خودمان با هزینه یاد گرفتیم. اول: در همان چند دقیقه، از یک سرور و یک آی پی، نامه های عادی با 250 2.0.0 OK قبول شدند و یک اعلان برگشتی با 550-5.7.26 ... the sender is unauthenticated رد شد؛ تفاوتشان فقط این بود که پاکت اعلان برگشتی خالی است و SPF چیزی برای بررسی ندارد. دوم: سرویس پست ما عمدا فقط روی IPv4 تنظیم شده (inet_protocols = ipv4)، چون این ماشین یک نشانی IPv6 عمومی دارد که رکورد معکوس ندارد و بسیاری از گیرنده ها نامه ای را که از چنین نشانی بیاید نمی پذیرند. الان هم بررسی کردیم: نشانی IPv6 این سرور همچنان هیچ رکورد معکوسی ندارد. سوم: کلید DKIM منتشرشده در default._domainkey.rgb.ir را با کلید خصوصی روی دیسک مقایسه کردیم و بایت به بایت یکی بودند، و همان مقایسه نشان داد کلید ۱۰۲۴ بیتی است، یعنی روی کف RFC 8301 و نه روی مقدار توصیه شده اش.
سوال هایی که واقعا پرسیده می شوند
ایمیل های سایتم به اسپم می روند؛ اول چه کار کنم؟
یک نامه به نشانی ای بفرستید که خودتان دارید و روی سرویس دیگری است، و سطر Authentication-Results آن را بخوانید. اگر SPF یا DKIM آنجا رد شده، جای کار همان است و نه چیز دیگر. اگر هر دو گرفته اند و باز هم اسپم می شود، موضوع اعتبار فرستنده یا متن نامه است و راه حلش هیچ ربطی به DNS ندارد.
چرا نامه من به یک نفر می رسد و به دیگری نه؟
چون تصمیم با سرور گیرنده است و هر سرویس سخت گیری خودش را دارد. جیمیل و اوت لوک و یک سرور شرکتی کوچک سه سیاست متفاوت دارند و نامه ای که یکی قبول می کند دیگری قرنطینه می کند. برای همین آزمایش روی یک نشانی هیچ وقت کافی نیست؛ دست کم دو سرویس متفاوت را امتحان کنید.
رکورد SPF را می شود دو تا داشت؟
نه، و این پرتکرارترین اشتباهی است که می بینیم. یک دامنه فقط یک رکورد SPF دارد و اگر دو تا منتشر شود نتیجه خطاست، یعنی همان حالتی که اصلا رکورد نداشته باشید. وقتی سرویس جدیدی اضافه می کنید، آن را داخل همان یک رکورد موجود بگذارید، نه در یک رکورد تازه.