لعبارة «لا يصل بريد» سببان مختلفان جدًّا: إمّا أن الخادم لم يرسله أصلًا، وإمّا أنه أرسله ورفضه المستقبِل. وسجلّ البريد يجيب على ذلك في سطر واحد، وكل ما بعده يتبع الجواب.
tail -50 /var/log/mail.log
- status=sent — غادر. فالمشكلة في التسليم لا في الإرسال: انظر مقال البريد الذي يهبط في المزعج.
- status=bounced — رفضه المستقبِل، والسطر يقول لماذا.
- ولا شيء إطلاقًا — التطبيق لم يسلّم شيئًا أصلًا.
حين لا يبلغ السجلَّ شيء
دالّة mail() في PHP تُرجع true حين يقبل برنامج البريد المحليّ الرسالة، وليس ذلك كإرسالها. وإن لم يكن ثمّة برنامج بريد مثبَّت أرجعت false، وأغلب التطبيقات تتجاهل ذلك.
php -r 'var_dump(mail("you@example.com","test","body"));'
which sendmail
استعمل SMTP بدل mail()
SMTP موثَّق إلى صندوقك أنت أوثق وأفضل تسليمًا بكثير: فالرسالة موقَّعة وتأتي من خادم له سمعة، لا من عمليّة ويب.
Host: mail.yourdomain.com
Port: 465 (SSL) or 587 (TLS)
User: the full address
From: the SAME address
وعنوان From يجب أن يكون صندوقًا موجودًا على النطاق المرسِل. فنموذجٌ يرسل باسم عنوان الزائر يسقط في فحص SPF عند المستقبِل، لأن خادمك غير مأذون له بالإرسال باسمه. ضع الزائر في Reply-To.
جرّب الطريق لا النموذج
swaks --to you@example.com --from noreply@yourdomain.com --server mail.yourdomain.com:587 -tls -au noreply@yourdomain.com
ذلك يجرّب SMTP مباشرةً ويطبع الحوار كلّه. فإن نجح وظلّ الموقع يفشل، فالعطل في إعدادات التطبيق لا في خادم البريد.
وافحص الطابور كما تفحص السجلّ:
mailq. فرسالةٌ عالقة في الطابور قد قُبِلت ولم تُسلَّم بعد، والطابور يسمّي سبب انتظارها.
