मैं एक रिले के रूप में msmtp का उपयोग कर रहा हूं और मेल() फ़ंक्शन के साथ एक ईमेल भेजने का प्रयास कर रहा हूं यह सीएलआई में पूरी तरह से काम करता है, लेकिन अपाचे में कुछ नहीं करता है। क्ली और अपाचे के लिए मेरी PHP कॉन्फ़िगरेशन समान हैं, किसी भी लॉग में कोई त्रुटि नहीं है और मैं वास्तव में विचारों से बाहर हूं।

कोई विचार यह क्या कारण हो सकता है?

answer

मैंने इस समस्या का हल ढूंढ लिया है। मैं msmtp का उपयोग कर रहा हूं , जो एक SMTP प्रॉक्सी है और सेंडमेल के समान काम करता है, इस प्रकार, मेल भेजने का प्रयास करते समय, msmtp कमांड को php से समान सिंटैक्स के साथ सेंडमेल पर कॉल किया जाता है।

अब, msmtp कमांड उसी यूजर द्वारा चलाया जाएगा जिसके तहत apache2 चल रहा है। मेरे मामले में www-data.

Msmtp (/etc/.msmtp_php मेरे मामले में) के लिए एक कॉन्फ़िगरेशन फ़ाइल है जिसे www-डेटा उपयोगकर्ता द्वारा पढ़ने योग्य होने की आवश्यकता है।

सीएलआई काम कर रहा था और अपाचे पीएचपी नहीं था, इसका कारण यह है कि मैं सीएलआई को रूट के तहत चला रहा था, जिसके पास फाइल के लिए सही अनुमति थी, लेकिन अपाचे 2 www-डेटा के तहत चल रहा है, जिसमें वे अनुमतियां नहीं थीं।

So the solution is: chown the /etc/.msmtp_php file to www-data:www-data and chmod the same file to 0600, otherwise, msmtp will complain about loose permissions.

एक तरह से आप इसे निष्पादन () फ़ंक्शन में उपयोग करके मेल भेज सकते हैं।

exec('usr/bin/mail <parameter>', $output); //$output for debugging

प्रतिक्रिया के लिए आउटपुट जांचें, लेकिन फिर भी आपको PHP mail()फ़ंक्शन का उपयोग करने के लिए अपनी सेटिंग्स को हल करना होगा।

सबसे पहले: जांचें कि क्या आप वास्तव में उस php.iniफ़ाइल का उपयोग कर रहे हैं जिस पर आपको विश्वास है।

उदाहरण के लिए, अपाचे सक्षम होने पर php.iniप्रत्येक उपयोगकर्ता के लिए अलग-अलग स्थान का उपयोग कर सकता mod_suphpहै। suPHP के साथ, स्थान suPHP_ConfigPathनिर्देश के साथ सेट किया गया है mods-enabled/suphp.confऔर यह PHPIniDirवैश्विक कॉन्फ़िगरेशन के लिए अलग सेट होने पर भी PHP के संकलित डिफ़ॉल्ट पथ पर डिफ़ॉल्ट है। ( PHP: कॉन्फ़िगरेशन फ़ाइल उस ऑर्डर के बारे में अधिक जानकारी देती है जहाँ php.iniखोजा जाता है।)

  1. आप उसी निर्देशिका में php.iniउपयोग करके स्थान प्राप्त कर सकते हैं <?php phpinfo(); ?>
  2. आप mail()फ़ंक्शन द्वारा उपयोग किए जाने वाले वर्तमान एसएमटीपी सर्वर को सीधे प्राप्त कर सकते हैं ini_get():

    <?php echo ini_get('SMTP') . ":" . ini_get('smtp_port'); ?>

यदि SMTP सर्वर वही है जो उसे होना चाहिए, यदि मेल सफलतापूर्वक वितरण के लिए स्वीकार किया गया था और अन्यथा mail()फ़ंक्शन वापस आ जाना चाहिए दोनों ही मामलों में, यदि फ़ंक्शन SMTP सर्वर को कनेक्ट करने में सक्षम था, तो कनेक्शन के बारे में अधिक जानकारी SMTP सर्वर लॉग फ़ाइल में पाई जा सकती है TRUEFALSE

यदि एसएमटीपी से कनेक्ट किए बिना mail()लौटता है FALSE, तो जांचें कि क्या आपके पास सुरक्षित_मोड चालू है और mail()अतिरिक्त_पैरामीटर सेट हैंचैंज से (PHP संस्करण 4.2.3):

The additional_parameters parameter is disabled in safe_mode and the mail() function will expose a warning message and return FALSE when used.