PHP मेल फ़ंक्शन ई-मेल भेजना पूरा नहीं करता है


477
<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $from = 'From: yoursite.com';
    $to = 'contact@yoursite.com';
    $subject = 'Customer Inquiry';
    $body = "From: $name\n E-Mail: $email\n Message:\n $message";

    if ($_POST['submit']) {
        if (mail ($to, $subject, $body, $from)) {
            echo '<p>Your message has been sent!</p>';
        } else {
            echo '<p>Something went wrong, go back and try again!</p>';
        }
    }
?>

मैंने एक साधारण मेल फ़ॉर्म बनाने की कोशिश की है। प्रपत्र स्वयं मेरे index.htmlपृष्ठ पर है, लेकिन यह एक अलग "आपके सबमिशन के लिए धन्यवाद" पृष्ठ पर जमा होता है thankyou.php, जहां उपरोक्त PHP कोड एम्बेडेड है। कोड पूरी तरह से प्रस्तुत करता है, लेकिन कभी भी ईमेल नहीं भेजता है। मैं इसे कैसे ठीक करूं?


2
स्थानीय कंप्यूटर या लाइव होस्ट में आपका कार्यक्रम है
तमिल सेल्वन C

6
1. क्या आप सुनिश्चित हैं कि यह आपके स्पैम में नहीं जा रहा है? 2. क्या आपके पास अपने बॉक्स पर Sendmail कॉन्फ़िगर है?
स्टीवन मोसले

इसके लाइव होस्ट पर यह मेरे स्पैम में नहीं जा रहा है..मुझे यकीन नहीं है कि मेरे बॉक्स पर सेंडमेल कॉन्फिगर होने से आपका क्या मतलब है तो मान लीजिए कि नहीं?
user3818620

के बिना भेजने की कोशिश$from
Artem Ilchenko

जवाबों:


512

हालाँकि इस उत्तर के कुछ भाग हैं जो केवल 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 साझा की गई वेबहोस्टिंग योजना हिट या मिस हो जाती है।)


11
अच्छा लिखा, जॉन। मैं बस एक और बात जोड़ना चाहूंगा: भेजने वाले मेल सर्वर के मेल सर्वर लॉग्स (चाहे वह स्थानीय रूप से हो या दूरस्थ रूप से होस्ट किया गया हो) की जाँच करना, यदि संभव हो तो, अक्सर समस्या पैदा करने वाले पर प्रकाश डाल सकते हैं। इन लॉग्स को 1) यह दिखाना चाहिए कि भेजने वाले मेल सर्वर द्वारा PHP स्क्रिप्ट से संदेश प्राप्त किया गया था या नहीं और यदि ऐसा है, तो 2) मेल भेजने वाले सर्वर से प्राप्त एमएक्स स्वीकृत डिलीवरी है या नहीं।
mti2935

@ mti2935 यह इतना उपयोगी है कि मुझे आश्चर्य है कि मैं चूक गया। मुझे लगता है कि शीघ्र ही इसे जोड़ना सुनिश्चित करूंगा। :)
जॉन कॉनडे

1
मैं न तो उपयोग करना शुरू करूंगा mail(), यह इतना खराब काम करता है और किसी भी अन्य मेल लाइब्रेरी की तुलना में डिबग करना कठिन है

1
000webhost पर एक ही वेबसाइट netai.net डोमेन पर सफलतापूर्वक और तेज़ ईमेल भेजती है, लेकिन साइट88.net पर मेरे पास वही वेबसाइट है जो मुझे दिलासा देती है कि संदेश सफलतापूर्वक भेजा जाता है, लेकिन मुझे कोई संदेश नहीं मिलता है। इसके अलावा comuf.com डोमेन में मुझे त्रुटि मिलती है। (एक ही होस्ट पर एक ही वेबसाइट केवल netai.net डोमेन पर काम करती है, net16.net भी काम करती है)
निकोलस

1
मेरे प्रश्न ( stackoverflow.com/questions/44866673/… ) को इस एक के डुप्लिकेट के रूप में चिह्नित किया गया था, लेकिन मैं अभी भी इसका पता नहीं लगा सकता। कोई सुझाव?
ज़ाचरी एल्किन्स

37

मेल फ़ंक्शन में एक मेल हेडर जोड़ें:

$header = "From: noreply@example.com\r\n";
$header.= "MIME-Version: 1.0\r\n";
$header.= "Content-Type: text/html; charset=ISO-8859-1\r\n";
$header.= "X-Priority: 1\r\n";

$status = mail($to, $subject, $message, $header);

if($status)
{
    echo '<p>Your mail has been sent!</p>';
} else {
    echo '<p>Something went wrong. Please try again!</p>';
}

25
  1. मेल फंक्शन में हमेशा हेडर भेजने की कोशिश करें।
  2. अगर आप लोकलहोस्ट के माध्यम से मेल भेज रहे हैं तो मेल भेजने के लिए एसएमटीपी सेटिंग्स करें।
  3. यदि आप किसी सर्वर के माध्यम से मेल भेज रहे हैं तो चेक करें कि आपके सर्वर पर ईमेल भेजने की सुविधा सक्षम है।

20

यदि आप अपना ईमेल भेजने के लिए SMTP कॉन्फ़िगरेशन का उपयोग कर रहे हैं, तो इसके बजाय PHPMailer का उपयोग करने का प्रयास करें । आप लाइब्रेरी को https://github.com/PHPMailer/PHPMailer से डाउनलोड कर सकते हैं ।

मैंने अपना ईमेल इस तरह से बनाया:

function send_mail($email, $recipient_name, $message='')
{
    require("phpmailer/class.phpmailer.php");

    $mail = new PHPMailer();

    $mail->CharSet = "utf-8";
    $mail->IsSMTP();                                      // Set mailer to use SMTP
    $mail->Host = "mail.example.com";  // Specify main and backup server
    $mail->SMTPAuth = true;     // Turn on SMTP authentication
    $mail->Username = "myusername";  // SMTP username
    $mail->Password = "p@ssw0rd"; // SMTP password

    $mail->From = "me@walalang.com";
    $mail->FromName = "System-Ad";
    $mail->AddAddress($email, $recipient_name);

    $mail->WordWrap = 50;                                 // Set word wrap to 50 characters
    $mail->IsHTML(true);                                  // Set email format to HTML (true) or plain text (false)

    $mail->Subject = "This is a Sampleenter code here Email";
    $mail->Body    = $message;
    $mail->AltBody = "This is the body in plain text for non-HTML mail clients";
    $mail->AddEmbeddedImage('images/logo.png', 'logo', 'logo.png');
    $mail->addAttachment('files/file.xlsx');

    if(!$mail->Send())
    {
       echo "Message could not be sent. <p>";
       echo "Mailer Error: " . $mail->ErrorInfo;
       exit;
    }

    echo "Message has been sent";
}

2
मुझे भी उपयोग करना था: आवश्यकता ("phpmailer / class.smtp.php");
डग

15

मेल भेजने से पहले कुछ शीर्ष लेख जोड़ें:

<?php 
$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$from = 'From: yoursite.com'; 
$to = 'contact@yoursite.com'; 
$subject = 'Customer Inquiry';
$body = "From: $name\n E-Mail: $email\n Message:\n $message";

$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html\r\n";
$headers .= 'From: from@example.com' . "\r\n" .
'Reply-To: reply@example.com' . "\r\n" .
'X-Mailer: PHP/' . phpversion();

mail($to, $subject, $message, $headers);

एक और बात। mail()समारोह स्थानीय होस्ट में काम नहीं कर रहा है। अपना कोड सर्वर पर अपलोड करें और प्रयास करें।


1
इसने वास्तव में फॉर्म सबमिट कर दिया- मेरा सवाल अब होगा..क्या मैं उपयोगकर्ता को ईमेल में टाइप किया हुआ दिखाऊंगा, अब जब मैंने इसे हेडर से बदल दिया है ...
user3818620

क्या यह स्पैम फ़ोल्डर से मेल को रोकेगा। मैंने देखा है कि अगर हम आपके कोड gmail में उपयोग की गई इस विधि का उपयोग करके 10 से अधिक मेल भेजते हैं, तो इस मेल को स्पैम पर भेजें।
जूलहुक

ओपी में यह पंक्ति है: $from = 'From: yoursite.com'; जो पूर्ण मान्य ईमेल पते की तरह नहीं दिखता है, कोई स्थानीय हिस्सा नहीं है। आपने हेडर से प्रतिस्थापित किया है और अतिरिक्त जोड़े हैं। या बल्कि $fromउपरोक्त आपके उदाहरण में बेमानी है। और विकृत होने के कारण संभवतः ओपी मूल समस्या थी।
प्रोग्रॉक

13

इसने निम्नलिखित काम करके मेरे लिए 000webhost पर काम किया:

$headers  = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type: text/html; charset=iso-8859-1" . "\r\n";
$headers .= "From: ". $from. "\r\n";
$headers .= "Reply-To: ". $from. "\r\n";
$headers .= "X-Mailer: PHP/" . phpversion();
$headers .= "X-Priority: 1" . "\r\n";

ईमेल भेजते समय सीधे ईमेल पता दर्ज करें:

mail('email@gmail.com', $subject, $message, $headers)

का उपयोग करें ''और नहीं ""

यह कोड काम करता है, लेकिन ईमेल आधे घंटे के अंतराल के साथ प्राप्त किया गया था।


10

ज्यादातर mail()फ़ंक्शन साझा होस्टिंग में अक्षम है। एक बेहतर विकल्प एसएमटीपी का उपयोग करना है। सबसे अच्छा विकल्प जीमेल या सेंडग्रिड होगा।


SMTPconfig.php

<?php 
    $SmtpServer="smtp.*.*";
    $SmtpPort="2525"; //default
    $SmtpUser="***";
    $SmtpPass="***";
?>

SMTPmail.php

<?php
class SMTPClient
{

    function SMTPClient ($SmtpServer, $SmtpPort, $SmtpUser, $SmtpPass, $from, $to, $subject, $body)
    {

        $this->SmtpServer = $SmtpServer;
        $this->SmtpUser = base64_encode ($SmtpUser);
        $this->SmtpPass = base64_encode ($SmtpPass);
        $this->from = $from;
        $this->to = $to;
        $this->subject = $subject;
        $this->body = $body;

        if ($SmtpPort == "") 
        {
            $this->PortSMTP = 25;
        }
        else
        {
            $this->PortSMTP = $SmtpPort;
        }
    }

    function SendMail ()
    {
        $newLine = "\r\n";
        $headers = "MIME-Version: 1.0" . $newLine;  
        $headers .= "Content-type: text/html; charset=iso-8859-1" . $newLine;  

        if ($SMTPIN = fsockopen ($this->SmtpServer, $this->PortSMTP)) 
        {
            fputs ($SMTPIN, "EHLO ".$HTTP_HOST."\r\n"); 
            $talk["hello"] = fgets ( $SMTPIN, 1024 ); 
            fputs($SMTPIN, "auth login\r\n");
            $talk["res"]=fgets($SMTPIN,1024);
            fputs($SMTPIN, $this->SmtpUser."\r\n");
            $talk["user"]=fgets($SMTPIN,1024);
            fputs($SMTPIN, $this->SmtpPass."\r\n");
            $talk["pass"]=fgets($SMTPIN,256);
            fputs ($SMTPIN, "MAIL FROM: <".$this->from.">\r\n"); 
            $talk["From"] = fgets ( $SMTPIN, 1024 ); 
            fputs ($SMTPIN, "RCPT TO: <".$this->to.">\r\n"); 
            $talk["To"] = fgets ($SMTPIN, 1024); 
            fputs($SMTPIN, "DATA\r\n");
            $talk["data"]=fgets( $SMTPIN,1024 );
            fputs($SMTPIN, "To: <".$this->to.">\r\nFrom: <".$this->from.">\r\n".$headers."\n\nSubject:".$this->subject."\r\n\r\n\r\n".$this->body."\r\n.\r\n");
            $talk["send"]=fgets($SMTPIN,256);
            //CLOSE CONNECTION AND EXIT ... 
            fputs ($SMTPIN, "QUIT\r\n"); 
            fclose($SMTPIN); 
            // 
        } 
        return $talk;
    } 
}
?>

contact_email.php

<?php 
include('SMTPconfig.php');
include('SMTPmail.php');
if($_SERVER["REQUEST_METHOD"] == "POST")
{
    $to = "";
    $from = $_POST['email'];
    $subject = "Enquiry";
    $body = $_POST['name'].'</br>'.$_POST['companyName'].'</br>'.$_POST['tel'].'</br>'.'<hr />'.$_POST['message'];
    $SMTPMail = new SMTPClient ($SmtpServer, $SmtpPort, $SmtpUser, $SmtpPass, $from, $to, $subject, $body);
    $SMTPChat = $SMTPMail->SendMail();
}
?>

क्या सर्वर पर प्लेनटेक्स्ट में smtp यूजर और पासवर्ड को सेव करना अच्छा है?
जूरी

@ जूरी शायद नहीं ... भगवान मैं यह पता नहीं लगा सकता कि काम करने के लिए मेल फ़ंक्शन कैसे प्राप्त करें: (

9

यदि आप केवल mail()फ़ंक्शन का उपयोग करते हैं, तो आपको कॉन्फ़िगरेशन फ़ाइल को पूरा करने की आवश्यकता है।

आपको मेल विस्तार को खोलने की आवश्यकता है, और SMTP smtp_portऔर इसी तरह, और सबसे महत्वपूर्ण, आपका उपयोगकर्ता नाम और पासवर्ड सेट करें। उसके बिना, मेल नहीं भेजा जा सकता। इसके अलावा, आप PHPMailभेजने के लिए कक्षा का उपयोग कर सकते हैं ।


9

इन दोनों चीजों को अलग-अलग और एक साथ आज़माएँ:

  1. हटाए if($_POST['submit']){}
  2. निकालें $from(बस मेरी आंत)

8

मुझे लगता है कि यह चाल चलनी चाहिए। मैंने अभी हाल ही if(issetमें HTML से PHP को अलग करने के लिए शरीर में चर के लिए एक जोड़ा और संघनन जोड़ा।

<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $from = 'From: yoursite.com'; 
    $to = 'contact@yoursite.com'; 
    $subject = 'Customer Inquiry';
    $body = "From:" .$name."\r\n E-Mail:" .$email."\r\n Message:\r\n" .$message;

if (isset($_POST['submit'])) 
{
    if (mail ($to, $subject, $body, $from)) 
    { 
        echo '<p>Your message has been sent!</p>';
    } 
    else 
    { 
        echo '<p>Something went wrong, go back and try again!</p>'; 
    }
}

?>

8

जो कोई भी इसे आगे बढ़ाता है, मैं इसका उपयोग करने की सलाह नहीं दूंगा mail। कुछ उत्तर हैं जो इस पर स्पर्श करते हैं, लेकिन इसके क्यों नहीं ।

PHP का mailकार्य न केवल अपारदर्शी है, यह पूरी तरह से उस एमटीए पर निर्भर करता है जो आप काम करने के लिए (यानी सेंडमेल ) का उपयोग करते हैं। mailहोगा केवल आपको बताती हैं कि एमटीए इसे स्वीकार करने में विफल रहा है (जब आप भेजने की कोशिश की यानी सेंडमेल नीचे था)। यह आपको बता नहीं सकता है कि मेल सफल रहा क्योंकि इसे बंद कर दिया गया है। जैसे ( जॉन कोंडे का जवाब विवरण के रूप में), अब आप एमटीए के लॉग के साथ फिडेल करते हैं और आशा करते हैं कि यह आपको इसे ठीक करने में विफलता के बारे में पर्याप्त बताता है। यदि आप एक साझा होस्ट पर हैं या MTA लॉग का उपयोग नहीं करते हैं, तो आप भाग्य से बाहर हैं। अफसोस की बात है, लिनक्स के लिए अधिकांश वेनिला इंस्टॉल करने के लिए डिफ़ॉल्ट इसे इस तरह से संभालता है।

एक मेल लाइब्रेरी ( PHPMailer , Zend फ्रेमवर्क 2+, आदि), से बहुत अलग कुछ करता है mail। वे सीधे मेल सर्वर को एक सॉकेट खोलते हैं और फिर उस सॉकेट पर सीधे एसएमटीपी मेल कमांड भेजते हैं। दूसरे शब्दों में, वर्ग अपने स्वयं के एमटीए के रूप में कार्य करता है (ध्यान दें कि आप पुस्तकालयों mailको अंततः मेल भेजने के लिए उपयोग करने के लिए कह सकते हैं , लेकिन मैं आपको दृढ़ता से सलाह दूंगा कि आप ऐसा न करें)।

इसका मतलब है कि आप प्राप्त सर्वर से सीधे प्रतिक्रिया देख सकते हैं (उदाहरण के लिए, PHPMailer में, आप डिबगिंग आउटपुट चालू कर सकते हैं )। कोई और अनुमान नहीं लगा सकता है कि कोई मेल भेजने में विफल रहा या क्यों।

यदि आप SMTP (यानी आप कॉल कर रहे हैं isSMTP()) का उपयोग कर रहे हैं , तो आप SMTPDebugसंपत्ति का उपयोग करके SMTP वार्तालाप की एक विस्तृत प्रतिलिपि प्राप्त कर सकते हैं।

अपनी स्क्रिप्ट में इस तरह से एक लाइन शामिल करके इस विकल्प को सेट करें:

$mail->SMTPDebug = 2;

आपको एक बेहतर इंटरफ़ेस का लाभ भी मिलता है। आपके साथ mailअपने सभी हेडर, अटैचमेंट्स इत्यादि को स्थापित करना होगा। लाइब्रेरी के साथ, आपके पास ऐसा करने के लिए एक समर्पित कार्य है। इसका मतलब यह भी है कि फ़ंक्शन सभी मुश्किल भागों (जैसे हेडर) कर रहा है।


6
$name = $_POST['name'];
$email = $_POST['email'];
$reciver = '/* Reciver Email address */';
if (filter_var($reciver, FILTER_VALIDATE_EMAIL)) {
    $subject = $name;
    // To send HTML mail, the Content-type header must be set.
    $headers = 'MIME-Version: 1.0' . "\r\n";
    $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
    $headers .= 'From:' . $email. "\r\n"; // Sender's Email
    //$headers .= 'Cc:' . $email. "\r\n"; // Carbon copy to Sender
    $template = '<div style="padding:50px; color:white;">Hello ,<br/>'
        . '<br/><br/>'
        . 'Name:' .$name.'<br/>'
        . 'Email:' .$email.'<br/>'
        . '<br/>'
        . '</div>';
    $sendmessage = "<div style=\"background-color:#7E7E7E; color:white;\">" . $template . "</div>";
    // Message lines should not exceed 70 characters (PHP rule), so wrap it.
    $sendmessage = wordwrap($sendmessage, 70);
    // Send mail by PHP Mail Function.
    mail($reciver, $subject, $sendmessage, $headers);
    echo "Your Query has been received, We will contact you soon.";
} else {
    echo "<span>* invalid email *</span>";
}

6

आप CodeIgniter द्वारा कॉन्फ़िगर ईमेल का उपयोग कर सकते हैं । उदाहरण के लिए, SMTP (सरल तरीका) का उपयोग करना:

$config = Array(
        'protocol' => 'smtp',
        'smtp_host' => 'mail.domain.com', // Your SMTP host
        'smtp_port' => 26, // Default port for SMTP
        'smtp_user' => 'name@domain.com',
        'smtp_pass' => 'password',
        'mailtype' => 'html',
        'charset' => 'iso-8859-1',
        'wordwrap' => TRUE
);
$message = 'Your msg';
$this->load->library('email', $config);
$this->email->from('name@domain.com', 'Title');
$this->email->to('emaildestination@domain.com');
$this->email->subject('Header');
$this->email->message($message);

if($this->email->send()) 
{
   // Conditional true
}

इससे मेरा काम बनता है!


1
fsockopen () [function.fsockopen]: php_network_getaddresses: getaddrinfo विफल: ऐसा कोई होस्ट ज्ञात नहीं है। - अगर मैं इस त्रुटि का सामना करता हूं, तो क्या कारण है और क्या करने की आवश्यकता है?
चौधरी सादमान महमूद

1
"मेरे लिए काम करता है" सिर्फ एक महत्वपूर्ण जानकारी है, लेकिन वास्तव में बहुत कुछ नहीं है। अधिकांश उपयोगकर्ताओं के लिए पोर्ट और smtp पासवर्ड भ्रामक होगा।
मारियो

"Config email" क्या है ? क्या आपके पास एक संदर्भ है?
पीटर मॉर्टेंसन

4

इसे इस्तेमाल करे

if ($_POST['submit']) {
    $success= mail($to, $subject, $body, $from);
    if($success)
    { 
        echo '
        <p>Your message has been sent!</p>
        ';
    } else { 
        echo '
        <p>Something went wrong, go back and try again!</p>
        '; 
    }
}

4

हो सकता है कि समस्या मेल सर्वर के कॉन्फ़िगरेशन की हो। इस प्रकार की समस्याओं से बचने के लिए या आपको मेल सर्वर समस्या के बारे में चिंता करने की आवश्यकता नहीं है, मैं आपको PHPMailer का उपयोग करने की सलाह देता हूं ।

यह एक प्लगइन है जिसमें मेल भेजने के लिए आवश्यक सब कुछ है, और केवल एक चीज जिसे आपको ध्यान में रखना है वह है एसएमटीपी पोर्ट (पोर्ट: 25 और 465), सक्षम।

require_once 'PHPMailer/PHPMailer.php';
require_once '/servicios/PHPMailer/SMTP.php';
require_once '/servicios/PHPMailer/Exception.php';

$mail = new \PHPMailer\PHPMailer\PHPMailer(true);
try {
    //Server settings
    $mail->SMTPDebug = 0;
    $mail->isSMTP();
    $mail->Host = 'smtp.gmail.com';
    $mail->SMTPAuth = true;
    $mail->Username = 'correo@gmail.com';
    $mail->Password = 'contrasenia';
    $mail->SMTPSecure = 'ssl';
    $mail->Port = 465;

    // Recipients
    $mail->setFrom('correo@gmail.com', 'my name');
    $mail->addAddress('destination@correo.com');

    // Attachments
    $mail->addAttachment('optional file');         // Add files, is optional

    // Content
    $mail->isHTML(true);// Set email format to HTML
    $mail->Subject = utf8_decode("subject");
    $mail->Body    = utf8_decode("mail content");
    $mail->AltBody = '';
    $mail->send();
}
catch (Exception $e) {
    $error = $mail->ErrorInfo;
}

1
IANA ने पोर्ट 465 द्वारा पोर्ट 465 को बदल दिया है। यह डिफ़ॉल्ट मेल सबमिशन पोर्ट है। जब एक ईमेल क्लाइंट या आउटगोइंग सर्वर एक उचित मेल सर्वर द्वारा रूट किए जाने के लिए एक ईमेल सबमिट कर रहा है, तो उसे हमेशा डिफ़ॉल्ट पोर्ट के रूप में SMTP पोर्ट 587 का उपयोग करना चाहिए। Mailgun.com/blog/which-smtp-port-understanding-ports-25-465-587 पर देखें । एक समझदार सलाह: यदि आप पूरी तरह से जानते नहीं हैं कि आप क्या कर रहे हैं, तो अपने कंप्यूटर पर पोर्ट न खोलें!
नुकसान

3

सुनिश्चित करें कि आपके पास Sendmail आपके सर्वर में स्थापित है।

यदि आपने अपना कोड चेक किया है और सत्यापित किया है कि वहां कुछ भी गलत नहीं है, तो / var / mail पर जाएं और जांचें कि क्या वह फ़ोल्डर खाली है।

यदि यह खाली है, तो आपको निम्न कार्य करने की आवश्यकता होगी:

sudo apt-get install sendmail

यदि आप उबंटू सर्वर पर हैं।


इस तरह से भी उपयोगी होने के लिए मोटे हैं। केवल MTA स्थापित करने से शायद ही इसे प्राप्त करने की अनुमति मिल सके। और एक पूर्ण Sendmail / पोस्टफिक्स / qmail सेटअप गाइड यहां ऑफ-टॉपिक होगा।
मारियो

क्या यह टिप्पणी मेरे उत्तर के संदर्भ में है? क्योंकि मेरे साथ ऐसा नहीं हुआ है और मैंने इसे ठीक उसी तरह से हल नहीं किया है। प्रश्न के विभिन्न संभावित उत्तर हैं, मेरा अतीत में उपरोक्त सभी को आजमाने के बाद उनमें से एक होने के नाते, मेरे उत्तर ने मेरे लिए समस्या हल कर दी थी, इसलिए मैंने इसे एक और संभावित समाधान के रूप में पेश किया।
डैनियल

हाँ यकीनन। यह कई संभावित उत्तरों में से एक है। हालाँकि, यह अभी भी सतही IMO का तरीका है। इसे "आपको एक एमटीए की आवश्यकता है" जैसे कि सामान्य बनाना ... - और यहां कुछ सेटअप गाइड जुड़े हुए हैं ... हालांकि अधिक व्यावहारिक हो सकते हैं।
mario

3

सबसे पहले, आपके पास मेल () फ़ंक्शन के लिए बहुत अधिक पैरामीटर हो सकते हैं ... आपके पास अधिकतम पांच हैं, mail(to, subject, message, headers, parameters);

जहां तक $fromवैरिएबल जाता है, कि आपके वेबहोस्ट से स्वचालित रूप से आना चाहिए अगर आपका लिनक्स cPanel का उपयोग कर रहा है । यह स्वचालित रूप से आपके cPanel उपयोगकर्ता नाम और आईपी पते से आता है।

$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$from = 'From: yoursite.com';
$to = 'contact@yoursite.com';
$subject = 'Customer Inquiry';
$body = "From: $name\n E-Mail: $email\n Message:\n $message";

यह भी सुनिश्चित करें कि आपके मेल () फ़ंक्शन में चर का सही क्रम है।

mail($to, $subject, $message, etc.)इसी क्रम में, वरना वहाँ यह काम नहीं कर का एक मौका है।


3

यदि आपको PHP के साथ मेल भेजने में समस्या हो रही है, तो PHPMailer या SwiftMailer जैसे विकल्प पर विचार करें ।

जब भी मुझे PHP के साथ मेल भेजने की आवश्यकता होती है, मैं आमतौर पर SwiftMailer का उपयोग करता हूं।


मूल उपयोग:

require 'mail/swift_required.php';

$message = Swift_Message::newInstance()
    // The subject of your email
    ->setSubject('Jane Doe sends you a message')
    // The from address(es)
    ->setFrom(array('jane.doe@gmail.com' => 'Jane Doe'))
    // The to address(es)
    ->setTo(array('frank.stevens@gmail.com' => 'Frank Stevens'))
    // Here, you put the content of your email
    ->setBody('<h3>New message</h3><p>Here goes the rest of my message</p>', 'text/html');

if (Swift_Mailer::newInstance(Swift_MailTransport::newInstance())->send($message)) {
    echo json_encode([
        "status" => "OK",
        "message" => 'Your message has been sent!'
    ], JSON_PRETTY_PRINT);
} else {
    echo json_encode([
        "status" => "error",
        "message" => 'Oops! Something went wrong!'
    ], JSON_PRETTY_PRINT);
}

SwiftMailer का उपयोग कैसे करें के बारे में अधिक जानकारी के लिए आधिकारिक दस्तावेज देखें ।


3

उन लोगों के लिए जो बाहरी मेलर्स का उपयोग नहीं करना चाहते हैं और समर्पित लिनक्स सर्वर पर मेल () करना चाहते हैं।

जिस तरह से, PHP मेल कैसे, php.iniअनुभाग में वर्णित है[mail function]

पैरामीटर sendmail-pathबताता है कि सेंडमेल को कैसे कहा जाता है। डिफ़ॉल्ट मान है sendmail -t -i, इसलिए यदि आपको sendmail -t -i < message.txtलिनक्स कंसोल में एक काम मिलता है - तो आपको किया जाएगा। आप mail.logडिबग में भी जोड़ सकते हैं और सुनिश्चित करें कि मेल () वास्तव में कहा जाता है।

विभिन्न एमटीए लागू कर सकते हैं sendmail। वे बस उस नाम पर अपने बायनेरिज़ का एक प्रतीकात्मक लिंक बनाते हैं। उदाहरण के लिए, डेबियन में डिफ़ॉल्ट पोस्टफिक्स है । मेल भेजने के लिए अपने MTA को कॉन्फ़िगर करें और इसे कंसोल से परीक्षण करें sendmail -v -t -i < message.txt। फ़ाइल message.txtमें एक संदेश और एक निकाय के सभी शीर्षलेख शामिल होने चाहिए, लिफाफे के लिए गंतव्य का पता To:हेडर से लिया जाएगा । उदाहरण:

From: myapp@example.com
To: mymail@example.com
Subject: Test mail via sendmail.

Text body.

मैं एमटीए के रूप में ssmtp का उपयोग करना पसंद करता हूं क्योंकि यह सरल है और खुले बंदरगाहों के साथ डेमॉन चलाने की आवश्यकता नहीं है। ssmtp केवल लोकलहोस्ट से मेल भेजने के लिए फिट बैठता है । यह एक सार्वजनिक मेल सेवा पर आपके खाते के माध्यम से प्रमाणित ईमेल भी भेज सकता है। Ssmtp स्थापित करें और कॉन्फ़िगरेशन फ़ाइल संपादित करें /etc/ssmtp/ssmtp.conf। यूनिक्स खातों (उदाहरण के लिए, क्रोन नौकरियों से रूट करने के लिए अलर्ट) /etc/ssmtp/revaliasesफ़ाइल को कॉन्फ़िगर करने के लिए स्थानीय सिस्टम मेल प्राप्त करने में सक्षम होने के लिए भी ।

यहां यैंडेक्स मेल पर मेरे खाते के लिए मेरा कॉन्फ़िगरेशन है:

root=mymail@example.com
mailhub=smtp.yandex.ru:465
FromLineOverride=YES
UseTLS=YES
AuthUser=abcde@yandex.ru
AuthPass=password

2

यह केवल कुछ मुट्ठी भर उपयोगकर्ताओं को प्रभावित करेगा, लेकिन मैं इसे उस छोटे मुट्ठी भर के लिए प्रलेखित करना चाहूंगा। इस छोटे से मुट्ठी भर सदस्य ने इस समस्या के कारण वर्किंग PHP मेल स्क्रिप्ट के 6 घंटे का समय बिताया।

यदि आप www.AceITLab.com से XAMPP चलाने वाले विश्वविद्यालय में जा रहे हैं, तो आपको पता होना चाहिए कि हमारे प्रोफेसर ने हमें क्या नहीं बताया: AceITLab फ़ायरवॉल (विंडोज़ फ़ायरवॉल नहीं) XAMPP में MercuryMail को ब्लॉक करता है। आपको एक वैकल्पिक मेल क्लाइंट का उपयोग करना होगा, नाशपाती हमारे लिए काम कर रही है। आपको कम सुरक्षा सेटिंग्स वाले Gmail खाते में भेजना होगा।

हाँ, मुझे पता है, यह असली दुनिया के ईमेल के लिए पूरी तरह से बेकार है। हालाँकि, मैंने जो भी देखा है, अकादमिक सेटिंग्स और वास्तविक दुनिया में अक्सर बहुत कम कीमती है।


यह बहुत अजीब तरह से विशिष्ट है, और वास्तव में किसी और की मदद करेगा। कृपया अपने उत्तर के नीचे [हटाएं] लिंक का उपयोग करें।
mario

इस संदर्भ में "नाशपाती" क्या है? क्या आपका मतलब है PEAR , PHP सॉफ्टवेयर रिपॉजिटरी? या कुछ और? एग पीयर ?
पीटर मॉर्टेंसन

क्या आप वास्तव में "कीमती छोटी" का मतलब है ? क्या यह कुछ करने की इच्छा है? क्यों?
पीटर मोर्टेंसन

1

यदि आप इस कोड को किसी स्थानीय सर्वर (यानी विकास के उद्देश्य से आपका कंप्यूटर) पर चला रहे हैं, तो यह प्राप्तकर्ता को ईमेल नहीं भेजेगा। यह .txtनाम के फोल्डर में एक फाइल बनाएगाmailoutput

इस मामले में, यदि आप एक मुफ्त hosing सेवा का उपयोग कर रहे हैं, जैसे 000webhostया hostinger, उन सेवा प्रदाताओं को अक्षम करेंmail() ईमेल स्पूफिंग, स्पैमिंग आदि के अनपेक्षित उपयोगों को रोकने के फ़ंक्शन को करते हैं, तो मैं आपको यह देखने के लिए उनसे संपर्क करना पसंद करता हूं कि क्या वे इस सुविधा का समर्थन करते हैं।

यदि आप सुनिश्चित हैं कि सेवा प्रदाता मेल () फ़ंक्शन का समर्थन करता है, तो आप आगे के संदर्भ के लिए इस PHP मैनुअल की जांच कर सकते हैं,

PHP मेल ()

मौसम की जांच करने के लिए आपकी होस्टिंग सेवा मेल () फ़ंक्शन का समर्थन करती है, इस कोड को चलाने का प्रयास करें (प्राप्तकर्ता ईमेल पता बदलने के लिए याद रखें) :

<?php
    $to      = 'nobody@example.com';
    $subject = 'the subject';
    $message = 'hello';
    $headers = 'From: webmaster@example.com' . "\r\n" .
        'Reply-To: webmaster@example.com' . "\r\n" .
        'X-Mailer: PHP/' . phpversion();

    mail($to, $subject, $message, $headers);
?>

1

डेबियन 10.0.0 ('बस्टर') के लिए Sendmail इंस्टॉलेशन वास्तव में तुच्छ था!

php.ini

[mail function]
sendmail_path=/usr/sbin/sendmail -t -i
; (Other directives are mostly windows)

मानक Sendmail पैकेज स्थापित ('भेजें' की अनुमति):

su -                                        # Install as user 'root'
dpkg --list                                 # Is install necessary?
apt-get install sendmail sendmail-cf m4     # Note multiple package selection
sendmailconfig                              # Respond all 'Y' for new install

विविध उपयोगी आदेश:

which sendmail                              # /usr/sbin/sendmail
which sendmailconfig                        # /usr/sbin/sendmailconfig
man sendmail                                # Documentation
systemctl restart sendmail                  # As and when required

सत्यापन (भेजने की क्षमता)

echo "Subject: sendmail test" | sendmail -v <yourEmail>@gmail.com

ऊपर से लगभग 5 मिनट लगे। फिर मैंने 5 घंटे बर्बाद कर दिए ... अपना स्पैम फोल्डर देखना न भूलें !


0

कई संभावनाएं हैं:

  1. आप एक सर्वर समस्या का सामना कर रहे हैं। सर्वर में कोई मेल सर्वर नहीं है। इसलिए आपका मेल काम नहीं कर रहा है, क्योंकि आपका कोड ठीक है और मेल टाइप के साथ काम कर रहा है।

  2. आपको पोस्ट किया गया मान नहीं मिल रहा है। एक स्थिर मूल्य के साथ अपने कोड का प्रयास करें।

  3. मेल भेजने के लिए SMTP मेल का उपयोग करें ...


0

आप libmail का उपयोग कर सकते हैं: http://lwest.free.fr/doc/php/lib/index.php3?page=mail&lang=en

include "libmail.php";
$m = new Mail(); // Create the mail
$m->From($_POST['form']);
$m->To($_POST['to']);
$m->Subject($_POST['subject']);
$m->Body($_POST['body']);
$m->Cc($_POST['cc']);
$m->Priority(4);
// Attach a file of type 'image/gif' to be displayed in the message if possible
$m->Attach("/home/leo/toto.gif", "image/gif", "inline");
$m->Send(); // Send the mail
echo "Mail was sent:"
echo $m->Get(); // Show the mail source

5
उल्लेख करने के लिए महत्वपूर्ण: यह केवल एक mail()फ़ंक्शन आवरण है। केवल संदेश निर्माण और कुछ नौटंकी जोड़ता है।
mario

0

आप अपनी त्रुटियों को देख सकते हैं:

error_reporting(E_ALL);

और मेरा नमूना कोड है:

<?php
    use PHPMailer\PHPMailer\PHPMailer;
    require 'PHPMailer.php';
    require 'SMTP.php';
    require 'Exception.php';

    $name = $_POST['name'];
    $mailid = $_POST['mail'];
    $mail = new PHPMailer;
    $mail->IsSMTP();
    $mail->SMTPDebug = 0;                   // Set mailer to use SMTP
    $mail->Host = 'smtp.gmail.com';         // Specify main and backup server
    $mail->Port = 587;                      // Set the SMTP port
    $mail->SMTPAuth = true;                 // Enable SMTP authentication
    $mail->Username = 'someone@gmail.com';  // SMTP username
    $mail->Password = 'password';           // SMTP password
    $mail->SMTPSecure = 'tls';              // Enable encryption, 'ssl' also accepted

    $mail->From = 'someone@gmail.com';
    $mail->FromName = 'name';
    $mail->AddAddress($mailid, $name);       // Name is optional
    $mail->IsHTML(true);                     // Set email format to HTML
    $mail->Subject = 'Here is the subject';
    $mail->Body    = 'Here is your message' ;
    $mail->AltBody = 'This is the body in plain text for non-HTML mail clients';
    if (!$mail->Send()) {
       echo 'Message could not be sent.';
       echo 'Mailer Error: ' . $mail->ErrorInfo;
       exit;
    }
    echo 'Message has been sent';
?>

1
SMTPDebug = 0सहायक नहीं है। और न ही GMail के साथ एक सादा "पासवर्ड" काम करेगा। यह उत्तर यहां बहुत योगदान नहीं देता है।
मारियो

-2

बशर्ते आपके Sendmail सिस्टम काम करता है, आपके कोड को इस प्रकार संशोधित किया जाना चाहिए:

<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];

    $header ="
Content-Type: text/html; charset=UTF-8\r\n
MIME-Version: 1.0\r\n
From: \"$name\" <$email>\r\n
Reply-To: no-reply@yoursite.com\r\n
X-Mailer: yoursite.com mailer\r\n
";

    $to = '"Contact" <contact@yoursite.com>'; 
    $subject = 'Customer Inquiry';
    $body =<<<EOB
<!DOCTYPE html>
<html>
    <body>
        $message
    </body>
</html>
EOB;

    if ($_POST['submit']) {
        if (mail ($to, $subject, $body, $header) !== false) { 
            echo '<p>Your message has been sent!</p>';
        } else { 
            echo '<p>Something went wrong, go back and try again!</p>'; 
        }
    }
?>

यह आपको HTML- आधारित ईमेल भेजने में सक्षम बनाता है।

उल्लेखनीय ब्याज:

  1. हमने एक हेडर मल्टीलाइन स्ट्रिंग (प्रत्येक पंक्ति को \ r \ n द्वारा अलग किया) बनाया;
  2. हमने HTML लौटाने के लिए सामग्री-प्रकार जोड़ा है ताकि आप बेहतर ईमेल लिख सकें (आप nay HTML कोड जोड़ सकते हैं जो आप चाहते हैं, CSS सहित, आपके संदेश में जैसा कि आप HTML पृष्ठ में करेंगे)।

नोट: <<<EOBसिंटैक्स को अंतिम ईओबी मार्कर की आवश्यकता होती है, जो कि शुरुआत में पीएफ लाइन के रूप में शुरू होता है और इसमें अर्धविराम के बाद कोई स्थान या कोई भी चरित्र नहीं होता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.