हालाँकि इस उत्तर के कुछ भाग हैं जो केवल mail()
फ़ंक्शन के उपयोग पर ही लागू होते हैं , इनमें से कई समस्या निवारण चरणों को किसी भी PHP मेलिंग सिस्टम पर लागू किया जा सकता है।
आपकी स्क्रिप्ट ईमेल न भेजने के कई कारण हैं। जब तक एक स्पष्ट वाक्यविन्यास त्रुटि न हो, इन चीजों का निदान करना मुश्किल है। एक के बिना आपको किसी भी संभावित नुकसान को खोजने के लिए नीचे दी गई चेकलिस्ट के माध्यम से चलने की आवश्यकता है।
सुनिश्चित करें कि त्रुटि रिपोर्टिंग सक्षम है और सभी त्रुटियों की रिपोर्ट करने के लिए सेट है
त्रुटि रिपोर्टिंग आपके कोड में बग्स को रूट करने के लिए आवश्यक है और सामान्य त्रुटियां जो PHP का सामना करती हैं। इन त्रुटियों को प्राप्त करने के लिए त्रुटि रिपोर्टिंग को सक्षम करने की आवश्यकता है। अपनी PHP फ़ाइलों के शीर्ष पर (या एक मास्टर कॉन्फ़िगरेशन फ़ाइल में) निम्न कोड रखने से त्रुटि रिपोर्टिंग सक्षम हो जाएगी।
error_reporting(-1);
ini_set('display_errors', 'On');
set_error_handler("var_dump");
देखें कि मुझे PHP में उपयोगी त्रुटि संदेश कैसे मिल सकते हैं? - इस पर अधिक विवरण के लिए यह उत्तर ।
सुनिश्चित करें कि mail()
फ़ंक्शन कहा जाता है
यह मूर्खतापूर्ण लग सकता है लेकिन एक सामान्य त्रुटि यह है कि वास्तव में mail()
फ़ंक्शन को अपने कोड में रखना भूल जाएं । सुनिश्चित करें कि यह वहां है और टिप्पणी नहीं की गई है।
सुनिश्चित करें कि mail()
फ़ंक्शन सही ढंग से कहा जाता है
बूल मेल (स्ट्रिंग $ टू, स्ट्रिंग $ विषय, स्ट्रिंग $ संदेश [, स्ट्रिंग $ अतिरिक्त_हेडर्स [, स्ट्रिंग $ अतिरिक्त_परमीकृत]])
मेल फ़ंक्शन तीन आवश्यक पैरामीटर लेता है और वैकल्पिक रूप से एक चौथा और पांचवां होता है। यदि आपके कॉल mail()
में कम से कम तीन पैरामीटर नहीं हैं, तो यह विफल हो जाएगा।
यदि आपके कॉल mail()
में सही क्रम में सही पैरामीटर नहीं हैं, तो यह भी विफल हो जाएगा।
सर्वर के मेल लॉग की जाँच करें
आपका वेब सर्वर इसके माध्यम से ईमेल भेजने के सभी प्रयासों को लॉग कर रहा होगा। इन लॉग का स्थान अलग-अलग होगा (आपको अपने सर्वर व्यवस्थापक से पूछने की आवश्यकता हो सकती है कि वे कहाँ स्थित हैं) लेकिन वे आमतौर पर किसी उपयोगकर्ता डेटा स्रोत में पाए जा सकते हैं logs
। आपके द्वारा ईमेल भेजने के आपके प्रयासों से संबंधित सर्वर, यदि कोई हो, रिपोर्ट किए गए त्रुटि संदेश होंगे।
पोर्ट कनेक्शन विफलता के लिए जाँच करें
पोर्ट ब्लॉक एक बहुत ही आम समस्या है जो अधिकांश डेवलपर्स एसएमटीपी का उपयोग करके ईमेल वितरित करने के लिए अपने कोड को एकीकृत करते समय सामना करते हैं। और, यह आसानी से सर्वर maillogs पर पता लगाया जा सकता है (मेल लॉग के सर्वर का स्थान सर्वर से सर्वर तक भिन्न हो सकता है, जैसा कि ऊपर बताया गया है)। यदि आप साझा होस्टिंग सर्वर पर हैं, तो पोर्ट 25 और 587 डिफ़ॉल्ट रूप से अवरुद्ध रहते हैं। यह ब्लॉक जानबूझकर आपके होस्टिंग प्रदाता द्वारा किया गया है। यह कुछ समर्पित सर्वरों के लिए भी सही है। जब ये पोर्ट अवरुद्ध हो जाते हैं, तो पोर्ट 2525 का उपयोग करके कनेक्ट करने का प्रयास करें। यदि आप पाते हैं कि पोर्ट भी अवरुद्ध है, तो इन बंदरगाहों को अनब्लॉक करने के लिए अपने होस्टिंग प्रदाता से संपर्क करना ही एकमात्र उपाय है।
अधिकांश होस्टिंग प्रदाता अपने नेटवर्क को किसी भी स्पैम ईमेल को भेजने से बचाने के लिए इन ईमेल पोर्ट को ब्लॉक कर देते हैं।
सादे / टीएलएस कनेक्शन के लिए पोर्ट 25 या 587 का उपयोग करें और एसएसएल कनेक्शन के लिए 465 पोर्ट। अधिकांश उपयोगकर्ताओं के लिए, कुछ होस्टिंग प्रदाताओं द्वारा निर्धारित दर सीमाओं से बचने के लिए पोर्ट 587 का उपयोग करने का सुझाव दिया गया है।
त्रुटि दमन ऑपरेटर का उपयोग न करें
जब त्रुटि दमन ऑपरेटर @
PHP में एक अभिव्यक्ति के लिए तैयार किया जाता है, तो उस त्रुटि द्वारा उत्पन्न होने वाले किसी भी त्रुटि संदेश को अनदेखा किया जाएगा। ऐसी परिस्थितियां हैं जहां इस ऑपरेटर का उपयोग करना आवश्यक है लेकिन मेल भेजना उनमें से एक नहीं है।
यदि आपका कोड शामिल है, @mail(...)
तो आप महत्वपूर्ण त्रुटि संदेश छिपा सकते हैं जो आपको यह डीबग करने में मदद करेगा। निकालें @
और देखें कि क्या कोई त्रुटि बताई गई है।
यह तभी उचित है जब आप ठोस विफलताओं के लिए सही जाँच करेंerror_get_last()
।
mail()
वापसी मान की जाँच करें
mail()
समारोह:
TRUE
यदि मेल को डिलीवरी के लिए सफलतापूर्वक स्वीकार कर लिया गया था, तो रिटर्न FALSE
। यह नोट करना महत्वपूर्ण है कि सिर्फ इसलिए कि डाक को डिलीवरी के लिए स्वीकार किया गया था, इसका मतलब यह नहीं है कि मेल वास्तव में इच्छित गंतव्य तक पहुंच जाएगा।
यह नोट करना महत्वपूर्ण है क्योंकि:
- यदि आप प्राप्त करते हैं
FALSE
रिटर्न वैल्यू तो आपको पता है कि आपके सर्वर द्वारा आपके मेल को स्वीकार करने में त्रुटि है। यह शायद एक कोडिंग समस्या नहीं है, लेकिन सर्वर कॉन्फ़िगरेशन समस्या है। ऐसा क्यों हो रहा है, यह जानने के लिए आपको अपने सिस्टम एडमिनिस्ट्रेटर से बात करने की जरूरत है।
- यदि आपका
TRUE
रिटर्न रिटर्न प्राप्त होता है तो इसका मतलब यह नहीं है कि आपका ईमेल निश्चित रूप से भेजा जाएगा। इसका मतलब यह है कि ईमेल PHP द्वारा सफलतापूर्वक सर्वर पर अपने संबंधित हैंडलर को भेजा गया था। पीएचपी के नियंत्रण के बाहर अभी भी विफलता के अधिक बिंदु हैं जो ईमेल को नहीं भेजा जा सकता है।
तो FALSE
आपको सही दिशा में इंगित करने में मदद करेगा जबकि TRUE
जरूरी नहीं कि आपका ईमेल सफलतापूर्वक भेजा गया था। यह नोट करना महत्वपूर्ण है!
सुनिश्चित करें कि आपका होस्टिंग प्रदाता आपको ईमेल भेजने की अनुमति देता है और मेल भेजने को सीमित नहीं करता है
कई साझा किए गए वेबहोस्ट, विशेष रूप से मुफ्त वेबहोस्टिंग प्रदाता, या तो ईमेल को अपने सर्वर से भेजने की अनुमति नहीं देते हैं या किसी भी समय अवधि के दौरान भेजी जाने वाली राशि को सीमित कर सकते हैं। यह उनकी सस्ती सेवाओं का लाभ लेने से स्पैमर्स को सीमित करने के उनके प्रयासों के कारण है।
अगर आपको लगता है कि आपके मेजबान की ईमेल की सीमाएँ हैं या ईमेल भेजने की प्रक्रिया को अवरुद्ध करता है, तो उनके FAQs की जाँच करके देखें कि क्या वे ऐसी कोई सीमाएँ सूचीबद्ध करते हैं। अन्यथा, आपको यह सत्यापित करने के लिए उनके समर्थन तक पहुंचने की आवश्यकता हो सकती है कि क्या ईमेल भेजने के आसपास कोई प्रतिबंध हैं।
स्पैम फ़ोल्डरों की जांच करें; ईमेल को स्पैम के रूप में चिह्नित किए जाने से रोकें
अक्सर, विभिन्न कारणों से, PHP (और अन्य सर्वर-साइड प्रोग्रामिंग भाषाओं) के माध्यम से भेजे गए ईमेल प्राप्तकर्ता के स्पैम फ़ोल्डर में समाप्त हो जाते हैं। अपना कोड समस्या निवारण से पहले हमेशा जांचें।
PHP के माध्यम से भेजे गए मेल को प्राप्तकर्ता के स्पैम फ़ोल्डर में भेजे जाने से बचने के लिए, विभिन्न चीजें हैं जो आप कर सकते हैं, आपके PHP कोड में और अन्यथा, आपके ईमेल को स्पैम के रूप में चिह्नित किए जाने की संभावना को कम करने के लिए। Michiel de Mare के अच्छे सुझावों में शामिल हैं:
- यह प्रमाणित करने के लिए कि आपके ईमेल और आपके डोमेन नाम एक साथ हैं, और अपने डोमेन नाम को खराब होने से बचाने के लिए SPF और DKIM जैसे ईमेल प्रमाणीकरण विधियों का उपयोग करें । SPF वेबसाइट में आपकी साइट के लिए DNS जानकारी उत्पन्न करने के लिए एक विज़ार्ड शामिल है।
- अपने मेल सर्वर के आईपी पते को उस डोमेन नाम पर सुनिश्चित करने के लिए अपने रिवर्स डीएनएस की जाँच करें जिसका उपयोग आप मेल भेजने के लिए करते हैं।
- सुनिश्चित करें कि आपके द्वारा उपयोग किया जा रहा आईपी-पता एक ब्लैकलिस्ट पर नहीं है
- सुनिश्चित करें कि रिप्लाई-टू एड्रेस एक मान्य, मौजूदा एड्रेस है।
- ई-मेल में पताकर्ता का पूरा, वास्तविक नाम का उपयोग करें, न कि केवल ईमेल-पता (जैसे
"John Smith" <john@blacksmiths-international.com>
)।
- अपने दुरुपयोग खातों की निगरानी करें, जैसे कि दुरुपयोग @yourdomain.com और postmaster@yourdomain.com। इसका मतलब है - सुनिश्चित करें कि ये खाते मौजूद हैं, पढ़ें कि उन्हें क्या भेजा गया है, और शिकायतों पर कार्रवाई करें।
- अंत में, सदस्यता समाप्त करना वास्तव में आसान बना देता है । अन्यथा, आपके उपयोगकर्ता स्पैम बटन दबाकर सदस्यता समाप्त कर देंगे , और यह आपकी प्रतिष्ठा को प्रभावित करेगा।
देखें कि आप यह कैसे सुनिश्चित करते हैं कि आप जिस प्रोग्राम को भेजते हैं वह स्वचालित रूप से स्पैम के रूप में चिह्नित नहीं है? इस विषय पर अधिक जानकारी के लिए।
सुनिश्चित करें कि सभी मेल हेडर सप्लाई किए गए हैं
कुछ स्पैम सॉफ़्टवेयर मेल को अस्वीकार कर देंगे, यदि वह "हेड" और "रिप्लाई-टू" जैसे सामान्य हेडर गायब है।
$headers = array("From: from@example.com",
"Reply-To: replyto@example.com",
"X-Mailer: PHP/" . PHP_VERSION
);
$headers = implode("\r\n", $headers);
mail($to, $subject, $message, $headers);
सुनिश्चित करें कि मेल हेडर में कोई सिंटैक्स त्रुटियां नहीं हैं
अमान्य हेडर केवल हेडर के रूप में खराब हैं। एक गलत चरित्र यह सब हो सकता है कि यह आपके ईमेल को पटरी से उतार दे। यह सुनिश्चित करने के लिए कि आपका सिंटैक्स सही है डबल-चेक करें क्योंकि PHP आपके लिए इन त्रुटियों को नहीं पकड़ेगी।
$headers = array("From from@example.com", // missing colon
"Reply To: replyto@example.com", // missing hyphen
"X-Mailer: "PHP"/" . PHP_VERSION // bad quotes
);
एक अशुद्ध From:
प्रेषक का उपयोग न करें
जबकि मेल में प्रेषक: प्रेषक होना चाहिए, आप केवल किसी भी मूल्य का उपयोग नहीं कर सकते हैं । विशेष रूप से उपयोगकर्ता-प्रवर्धित प्रेषक पतों में मेल को अवरुद्ध करने का एक निश्चित तरीका है:
$headers = array("From: $_POST[contactform_sender_email]"); // No!
कारण: आपका वेब या मेल सर्वर भेजने वाला एसपीएफ / डीकेआईएम-श्वेतपत्रित नहीं है, जो @hotmail या @ मेल पते के लिए जिम्मेदार होने का दिखावा करता है। यह उन मेल From:
भेजने वाले डोमेन के साथ मेल भी छोड़ सकता है, जिनके लिए इसे कॉन्फ़िगर नहीं किया गया है।
सुनिश्चित करें कि प्राप्तकर्ता मान सही है
कभी-कभी यह समस्या ईमेल के प्राप्तकर्ता के लिए गलत मान रखने जैसी सरल होती है। यह गलत चर का उपयोग करने के कारण हो सकता है।
$to = 'user@example.com';
// other variables ....
mail($recipient, $subject, $message, $headers); // $recipient should be $to
इसे जांचने का दूसरा तरीका यह है कि mail()
फ़ंक्शन कॉल में प्राप्तकर्ता मान को हार्ड कोड करें:
mail('user@example.com', $subject, $message, $headers);
यह सभी mail()
मापदंडों पर लागू हो सकता है ।
कई खातों में भेजें
ईमेल खाता समस्याओं से निपटने में मदद करने के लिए, विभिन्न ईमेल प्रदाताओं को अपने ईमेल कई ईमेल खातों में भेजें । यदि आपके ईमेल किसी उपयोगकर्ता के Gmail खाते में नहीं आ रहे हैं, तो वही ईमेल याहू खाते, हॉटमेल खाते और एक नियमित POP3 खाते (जैसे कि आपके ISP द्वारा प्रदान किया गया ईमेल खाता) को भेजें।
यदि ईमेल सभी या कुछ अन्य ईमेल खातों में आते हैं, तो आप जानते हैं कि आपका कोड ईमेल भेज रहा है, लेकिन संभावना है कि ईमेल खाता प्रदाता किसी कारण से उन्हें रोक रहा है। यदि ईमेल किसी भी ईमेल खाते पर नहीं आता है, तो समस्या आपके कोड से संबंधित होने की अधिक संभावना है।
सुनिश्चित करें कि कोड फॉर्म विधि से मेल खाता है
यदि आपने अपना फ़ॉर्म विधि निर्धारित कर लिया है POST
, तो सुनिश्चित करें कि आप $_POST
अपने फ़ॉर्म मूल्यों की तलाश करने के लिए उपयोग कर रहे हैं । यदि आपने इसे सेट किया है GET
या इसे बिल्कुल सेट नहीं किया है, तो सुनिश्चित करें कि आप $_GET
अपने फॉर्म वैल्यू की तलाश कर रहे हैं।
सुनिश्चित करें कि आपका फ़ॉर्म action
मान सही स्थान पर है
सुनिश्चित करें कि आपकी फ़ॉर्म action
विशेषता में एक मूल्य है जो आपके PHP मेलिंग कोड को इंगित करता है।
<form action="send_email.php" method="POST">
सुनिश्चित करें कि वेब होस्ट ईमेल भेजने का समर्थन करता है
कुछ वेब होस्टिंग प्रदाता अपने सर्वर के माध्यम से ईमेल भेजने की अनुमति नहीं देते हैं या उन्हें सक्षम नहीं करते हैं। इसके कारण अलग-अलग हो सकते हैं लेकिन अगर उन्होंने मेल भेजने को निष्क्रिय कर दिया है तो आपको एक वैकल्पिक विधि का उपयोग करना होगा जो आपके लिए उन ईमेल को भेजने के लिए एक तीसरे पक्ष का उपयोग करता है।
उनके तकनीकी समर्थन के लिए एक ईमेल (उनके ऑनलाइन समर्थन या FAQ के लिए एक यात्रा के बाद) को स्पष्ट करना चाहिए कि क्या ईमेल क्षमताएं आपके सर्वर पर उपलब्ध हैं।
सुनिश्चित करें कि localhost
मेल सर्वर कॉन्फ़िगर किया गया है
यदि आप WAMP, MAMP, या XAMPP का उपयोग करके अपने स्थानीय वर्कस्टेशन पर विकसित कर रहे हैं, तो एक ईमेल सर्वर संभवतः आपके वर्कस्टेशन पर स्थापित नहीं है। एक के बिना, PHP डिफ़ॉल्ट रूप से मेल नहीं भेज सकती है।
आप एक बुनियादी मेल सर्वर स्थापित करके इसे दूर कर सकते हैं। विंडोज के लिए आप मुफ्त पारा मेल का उपयोग कर सकते हैं ।
अपने ईमेल भेजने के लिए आप SMTP का भी उपयोग कर सकते हैं। देखें इस महान जवाब से विकास द्विवेदी ऐसा करने के तरीके जानने के लिए।
PHP के रिवाज को सक्षम करें mail.log
अपने MTA और PHP की लॉग फ़ाइल के अलावा, आप विशेष रूप से mail()
फ़ंक्शन के लिए लॉगिंग को सक्षम कर सकते हैं । यह संपूर्ण SMTP इंटरैक्शन को रिकॉर्ड नहीं करता है, लेकिन कम से कम फ़ंक्शन कॉल पैरामीटर और मंगलाचरण स्क्रिप्ट।
ini_set("mail.log", "/tmp/mail.log");
ini_set("mail.add_x_header", TRUE);
देखें http://php.net/manual/en/mail.configuration.php जानकारी के लिए। ( या शायद php.ini
या इन विकल्पों को सक्षम करना सबसे अच्छा है ।).user.ini
.htaccess
एक मेल परीक्षण सेवा के साथ जांचें
आपके MTA / वेबसर्वर सेटअप का परीक्षण करने के लिए विभिन्न डिलीवरी और स्पैमेनेस जाँच सेवाएँ हैं जिनका आप उपयोग कर सकते हैं। आमतौर पर आप एक मेल जांच को भेजते हैं: उनके पते पर, फिर एक डिलीवरी रिपोर्ट और बाद में अधिक ठोस विफलताएं या विश्लेषण प्राप्त करें:
एक अलग मेलर का उपयोग करें
PHP का बनाया गया mail()
फंक्शन आसान है और अक्सर काम हो जाता है, लेकिन इसकी कमियाँ हैं । सौभाग्य से ऐसे विकल्प हैं जो अधिक बिजली और लचीलेपन की पेशकश करते हैं, जिसमें ऊपर उल्लिखित बहुत सारे मुद्दों को संभालना शामिल है:
जिनमें से सभी को एक पेशेवर SMTP सर्वर / सेवा प्रदाता के साथ जोड़ा जा सकता है। (क्योंकि ईमेल सेटअप / कॉन्फ़िगरेशन के लिए विशिष्ट 08/15 साझा की गई वेबहोस्टिंग योजना हिट या मिस हो जाती है।)