2015-05-21 11 views
30

मैं PHP 5.6 पर PHPMailer का उपयोग कर रहा हूं, PHP 5.6 में प्रमाणित चारों ओर बढ़ी हुई सुरक्षा निश्चित रूप से मजेदार है।PHPMailer PHP उत्पन्न करता है चेतावनी: stream_socket_enable_crypto(): पीयर प्रमाणपत्र अपेक्षित मिलान नहीं किया

मैं dreamhost पर होस्ट किए गए डोमेन को एक टेस्ट संदेश भेजने की कोशिश कर रहा हूं, PHPMailer से वापस आने वाली त्रुटि है: SMTP होस्ट से कनेक्ट नहीं हो सका।

यह त्रुटि सही नहीं है, हालांकि, लॉगिंग सक्षम है और वास्तव में यह वास्तव में चल रहा है।

Connection: opening to mx1.sub4.homie.mail.dreamhost.com:25, timeout=30, options=array () Connection: opened S: 220 homiemail-mx32.g.dreamhost.com ESMTP

C: EHLO s81a.ikbb.com

S: 250-homiemail-mx32.g.dreamhost.com 250-PIPELINING 250-SIZE 40960000 250-ETRN 250-STARTTLS 250-ENHANCEDSTATUSCODES 250 8BITMIME

C: STARTTLS

S: 220 2.0.0 Ready to start TLS

C: QUIT

S: SMTP ERROR: QUIT command failed: Connection: closed

मुझे समझ में नहीं आया कि क्यों PHPMailer छोड़ देता है, जब यह संदेश भेजना शुरू कर देता है तो एक QUIT कमांड जारी करता है।

पीएचपी चेतावनी:: stream_socket_enable_crypto(): पीर प्रमाण पत्र सीएन = *.mail.dreamhost.com' did not match expected CN= mx1.sub4.homie.mail.dreamhost.com '/home/ikbb/domains/dev.ikbb.com/ में मैं एक लॉग से एक और सुराग मिला public_html/include/phpmailer/5.2.10/class.smtp.php

यदि मैं प्रमाणित प्रमाणीकरण को रोकने के लिए कुछ कस्टम विकल्प का उपयोग करता हूं, तो मैं इसे जारी रखने के लिए इसे प्राप्त कर सकता हूं। यहाँ मैं क्या है:

 $mail->SMTPOptions = array (
     'ssl' => array(
      'verify_peer' => false, 
      'verify_peer_name' => false, 
      'allow_self_signed' => true)); 

अगर मैं वहाँ में SMTPOptions डाल और साथियों के सत्यापन छोड़, संदेश ठीक से चला जाता है - सब पर PHP में कोई चेतावनी के साथ।

मैं उस त्रुटि को कैसे जा सकता हूं, इसलिए मुझे पता है कि कोई समस्या है लेकिन अभी भी संदेश भेज रहा है?

+0

हाँ, यह बहुत नहीं है! यदि आप सत्यापन अक्षम करते हैं तो आपको चेतावनी नहीं मिलेगी क्योंकि stream_socket_enable_crypto त्रुटि कोड नहीं लौटाता है, केवल एक बूलियन। चेतावनी को फँसाने के लिए अस्थायी त्रुटि हैंडलर बनाना एक गन्दा कामकाज होगा। आप क्या कर सकते हैं सत्यापन (यानी डिफ़ॉल्ट) के साथ देने का प्रयास करें, और यदि यह विफल हो जाता है, तो छोड़ने से पहले सत्यापन के बिना पुनः प्रयास करें। – Synchro

+1

एसएमटीपी एक गड़बड़ है। आमतौर पर, आप जो भी कर सकते हैं वह अवसरवादी एन्क्रिप्शन है। * यदि * आप DNS एमएक्स रिकॉर्ड का पालन करते हैं, तो होस्टनाम संभवतः मेल खाता है क्योंकि आपको शायद किसी भिन्न डोमेन पर स्मार्ट होस्ट पर निर्देशित किया जा रहा है। यही है, 'example.com' के लिए मेल' spam-filer.com' पर निर्देशित है। इस मामले में, स्पैम फ़िल्टर एक स्मार्ट होस्ट है। – jww

उत्तर

52

मुझे एक ही समस्या थी और मुझे PHPMailer documentation में उत्तर मिला।

पीएचपी 5.6 प्रमाण पत्र सत्यापन विफलता

पूर्व संस्करणों से एक परिवर्तन में, PHP 5.6 SSL कनेक्शन पर प्रमाणपत्रों को सत्यापित करता है। जिस सर्वर से कनेक्ट कर रहे हैं की एसएसएल config सही नहीं है, तो आप इस तरह एक त्रुटि प्राप्त होगी:

Warning: stream_socket_enable_crypto(): SSL operation failed with code 1. 
OpenSSL Error messages: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed 

इस के लिए सही ठीक एक साथ अवैध, गलत ढंग से कॉन्फ़िगर या स्व-हस्ताक्षरित प्रमाणपत्र को बदलने के लिए है अच्छा था। असफल, आप SMTPOptions संपत्ति PHPMailer 5.2.10 में शुरू के माध्यम से असुरक्षित कनेक्शन अनुमति दे सकते हैं, (यह पिछले संस्करणों में एसएमटीपी वर्ग उपवर्गीकरण द्वारा ऐसा करने के लिए संभव है), हालांकि यह अनुशंसित नहीं है:

$mail->SMTPOptions = array(
    'ssl' => array(
     'verify_peer' => false, 
     'verify_peer_name' => false, 
     'allow_self_signed' => true 
    ) 
); 

आप कर सकते हैं अपने php.ini में वैश्विक स्तर पर इन सेटिंग्स को भी बदलें, लेकिन यह वास्तव में एक बुरा विचार है; PHP 5.6 ने इस बदलाव को बहुत अच्छे कारणों से बनाया है।

कभी-कभी यह व्यवहार काफी स्पष्ट नहीं है; कभी-कभी एन्क्रिप्शन विफलता क्लाइंट के रूप में दिखाई दे सकती है क्योंकि क्लाइंट STARTTLS करने का प्रयास करने के तुरंत बाद एक QUIT जारी कर रहा है। यदि आप ऐसा देखते हैं, तो आपको अपने प्रमाणपत्रों या सत्यापन सेटिंग्स की स्थिति जांचनी चाहिए।

+0

PHP संस्करण परिवर्तन पर अच्छी जानकारी। उबंटू 14.04 एलटीएस PHP 5.5 का उपयोग करता है, इसलिए यह अभी तक थोड़ा सा आ सकता है। – mikato

+0

thx आप अपना दिन बचाएं – cloverink

+1

अगर मैं प्रमाणपत्र को प्रतिस्थापित करना चाहता हूं, तो मुझे यह कैसे करना चाहिए? – user2335065

-2

आप शायद अपनी समस्या को हल कर सकते हैं। लेकिन चूंकि अन्य डेवलपर इस पर फंस जाएंगे, इसलिए मैं कुछ ऐसा करने का प्रस्ताव दूंगा जो मेरे लिए काम करता है। मुझे PHPMailer के बजाय Laravel 4.2 स्विफ्टमेलर के साथ एक ही समस्या थी, लेकिन एक ड्रीमहोस्ट वीपीएस खाते के साथ। मैं एसएमटीपी विकल्प verify_peer हैक करना नहीं चाहता था, ssl से null से allow_self_signed या एन्क्रिप्शन सेट करें। मैं नहीं चाहता था कि न तो मेरे स्टेजिंग वीपीएस के लिए प्रो सर्टिफिकेट खरीदना पड़े, और मैं अभी तक उत्पादन पर नहीं हूं।

मैं क्या करने की कोशिश की है कि mail.php से काम नहीं किया:

<?php 
return array(

'driver' => 'smtp', 

'host' => 'mail.mywebsite-staging.com', 

'port' => 25, 

'from' => array('address' => '[email protected]', 'name' => 'MyWebsite Staging'), 

'encryption' => 'tls', 

'username' => '[email protected]', 

'password' => 'myPASS', 

'sendmail' => '/usr/sbin/sendmail -bs', 

'pretend' => false 
); 
?> 

मैं इस Dreamhost Certificate Domain Mismatch Error प्रलेखन जो हम में से बताता है कि हमारे मेल सर्वर प्रमाणपत्र एक सब-डोमेन (2 उप स्तर) से इस्तीफा पाया dreamhost मेल (* .mail.dreamhost.com) जहां * एक समूह है जिसमें एकाधिक मेल खाते हैं।

आप में जाना है:

  • Dreamhost वेब कक्ष> समर्थन> डेटा-केन्द्रों

और आप, क्या समूह आपके मेल सर्वर के अंतर्गत आता है देखेंगे तो आपको पता चल जाएगा जो मेजबान mail.php में उपयोग करने के लिए।

  • homiemail-sub3 => sub3.mail.dreamhost.com
  • homiemail-sub4 => sub4.mail.dreamhost.com
  • homiemail-sub5 => sub5.mail.dreamhost.com
  • homiemail मास्टर => homie.mail.dreamhost.com

मेरा homiemail-sub4 था, तो मैं 'होस्ट' => 'sub4.mail.dreamhost.com' का उपयोग किया

फिर कोई प्रमाण पत्र समस्या नहीं है। यदि किसी अन्य प्रदाता से मेल सर्वर का उपयोग करना है तो इसे जांचने का प्रयास करें जंगली आपके मेल प्रमाण पत्र के लिए भी उपयोग किया जाता है।

+0

हां !!! यदि आप ड्रीमहोस्ट का उपयोग कर रहे हैं, तो निश्चित रूप से देखें कि केइटेल डीओबी ऊपर क्या कहता है। मेरे $ मेल को बदलना-> समस्या से तय 'sub5.mail.dreamhost.com' पर होस्ट करें। –

3

PHP 5.6 के लिए निम्नलिखित का उपयोग करें। "Tls: //" जोड़ना कुंजी है।

$mail->Host = gethostbyname('tls://smtp.gmail.com'); 

देखें: http://php.net/manual/en/context.ssl.php

+0

यह पूरी तरह से काम करता है, और अन्य प्रतिक्रियाओं की असुरक्षा के बिना। धन्यवाद! –

+2

यह वही है जैसा कि उपसर्ग का उपयोग नहीं कर रहा है और '$ mail-> SMTPSecure =' tls'' 'सेट कर रहा है, जो मूल प्रश्न है, और सुरक्षा में कोई फर्क नहीं पड़ता। – Synchro

+0

मुझे डोमेन के लिए क्या उपयोग करना चाहिए? – Swarne27

संबंधित मुद्दे