दिलचस्प पोस्ट
डुप्लिकेट के साथ रैंडम संख्या जनरेटर डेल्फी क्या "कीवर्ड" के साथ एक खराब अभ्यास है? HTML में Base64 छवियों को कैसे प्रदर्शित किया जाए? इस क्वेरी के साथ पेजिंग (वगल / ले) कार्यक्षमता को लागू करें sqlite3-ruby उबंटू पर अधिष्ठापन त्रुटि घोंसले के शिकार को कम करने के लिए "यदि" कथन का उल्टा करें एंड्रॉइड एमुलेटर: नेटवर्क यातायात की निगरानी कैसे करें? पायथन में सिंटैक्स त्रुटि विसंगति? सी # में ओवरलोडिंग असाइनमेंट ऑपरेटर html 5 के लिए mp4 फाइल तैयार करना ओएस एक्स टर्मिनल यूटीएफ -8 के मुद्दे फेसबुक शेयर के लिए 'ओग' (ओपन ग्राफ़) मेटा टैग का उपयोग कैसे करें EntityFramework – समग्र कुंजी की क्वेरी शामिल है 2-एसएम के लिए रैखिक समय एल्गोरिदम क्या जावास्क्रिप्ट में गतिशील स्कॉपिंग को हासिल करने के लिए संभव है?

PHP मेल के साथ त्रुटि (): अतिरिक्त_हेडर में पाए गए एकाधिक या खराब न्यूलाइन

अचानक स्क्रिप्ट पर किए गए कोई भी बदलाव किए बिना उपरोक्त त्रुटि प्राप्त करना शुरू हो गया है।

मेजबान 1 और 1 है (मुझे पता है …)

स्क्रिप्ट अभी भी एक अलग सर्वर पर ठीक काम करता है, और इसलिए मेरा संदेह यह है कि इसमें कुछ सर्वर कॉन्फ़िग बदलाव होना चाहिए जो इसका कारण हो, यद्यपि मेजबान अज्ञानता का दलील करते हैं

Google में सब से ऊपर की त्रुटि पर कोई जानकारी नहीं है जो मुझे मिल सकती है – क्या किसी के पास कोई विचार है? सर्वर अपाचे चल रहा है यदि वह मदद करता है

वेब के समाधान से एकत्रित समाधान "PHP मेल के साथ त्रुटि (): अतिरिक्त_हेडर में पाए गए एकाधिक या खराब न्यूलाइन"

सिर्फ इसी तरह की समस्या थी
यह नीले रंग से बाहर आया कोई PHP कोड बदला नहीं था।

क्या बदला गया था: PHP 5.5.25-1 से 5.5.26 उन्नयन किया गया था।

PHP mail() फ़ंक्शन में एक सुरक्षा जोखिम तय किया गया है और अतिरिक्त_हैंडरों में अतिरिक्त नई लाइनों की अनुमति नहीं है। क्योंकि अतिरिक्त न्यूलाइन का अर्थ है: अब ईमेल संदेश शुरू होता है (और हम निश्चित रूप से किसी नए संदेश को किसी बुरे संदेश के बाद हेडर के माध्यम से कुछ न्यूलाइंस इंजेक्ट नहीं करना चाहते हैं)

क्या पहले ठीक काम किया है, उदाहरण के लिए हेडर के बाद अतिरिक्त न्यूलाइंस होने या additional_headers संदेश को additional_headers करने के लिए भी पूरा करते हुए, अब और नहीं कार्य करेगा।

समाधान :

  • अपने हेडर को स्वच्छ बनाना additional_headers तर्क में कोई भी नई पंक्तियां नहीं हैं ये "एकाधिक या विकृत नई लाइनें" के रूप में गणना करते हैं: \r\r, \r\0, \r\n\r\n, \n\n, \n\0
  • केवल हेडर के लिए additional_headers उपयोग करें ई-मेल संदेश (मल्टीपार्ट या नहीं, बिना अटैचमेंट्स के इर के साथ) आदि message तर्क में है, हेडर में नहीं।

PHP सुरक्षा बग रिपोर्ट: https://bugs.php.net/bug.php?id=68776
सी कोड विभेद कैसे तय होता है: http://git.php.net/?p=php-src.git;a=blobdiff;f=ext/standard/mail.c;h=448013a472a3466245e64b1cb37a9d1b0f7c007e;hp=1ebc8fecb7ef4c266a341cdc701f0686d6482242;hb= 9d168b863e007c4e15ebe4d2eecabdf8b0582e30; HPB = eee8b6c33fc968ef8c496db8fb54e8c9d9d5a8f9

उपरोक्त उत्तरों में से कोई भी मेरे लिए इस समस्या का समाधान नहीं करता। इसलिए, मैंने अपनी खोज "अटैचमेंट और एचटीएमएल संदेश मुद्दों के साथ मेल" करने के लिए विस्तारित की। कुछ विभिन्न पदों से जानकारी एकत्र करते हुए, मैं इस के साथ आया था यह दोनों HTML ईमेल और अनुलग्नक के लिए अनुमति देता है।

मेरा मूल शीर्षक कोड:

 $header = "From: ".$from_name." <".$from_mail.">\r\n"; $header .= "Reply-To: ".$replyto."\r\n"; $header .= "MIME-Version: 1.0\r\n"; $header .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n"; $header .= "--".$uid."\r\n"; $header .= "Content-Type: text/html; charset=ISO-8859-1\r\n"; $header .= "Content-Transfer-Encoding: 8bit\r\n"; $header .= $body."\r\n"; $header .= "--".$uid."\r\n"; $header .= "Content-Type: application/pdf; name=\"".$filename."\"\r\n"; $header .= "Content-Transfer-Encoding: base64\r\n"; $header .= "Content-Disposition: attachment; filename=\"".$filename."\"\r\n"; $header .= $content."\r\n"; $header .= "--".$uid."--"; if (mail($mail_to, $subject, "", $header)) { return "mail_success"; } else { return "mail_error"; } 

मेरा नया कोड (पूर्ण): ध्यान दें कि $ body HTML है जो एक अलग फ़ंक्शन द्वारा इकट्ठा किया जा रहा है।

 $file = $path.$filename; $file_size = filesize($file); $handle = fopen($file, "r"); $content = fread($handle, $file_size); fclose($handle); $content = chunk_split(base64_encode($content)); $uid = md5(uniqid(time())); $name = basename($file); $eol = PHP_EOL; // Basic headers $header = "From: ".$from_name." <".$from_mail.">".$eol; $header .= "Reply-To: ".$replyto.$eol; $header .= "MIME-Version: 1.0\r\n"; $header .= "Content-Type: multipart/mixed; boundary=\"".$uid."\""; // Put everything else in $message $message = "--".$uid.$eol; $message .= "Content-Type: text/html; charset=ISO-8859-1".$eol; $message .= "Content-Transfer-Encoding: 8bit".$eol.$eol; $message .= $body.$eol; $message .= "--".$uid.$eol; $message .= "Content-Type: application/pdf; name=\"".$filename."\"".$eol; $message .= "Content-Transfer-Encoding: base64".$eol; $message .= "Content-Disposition: attachment; filename=\"".$filename."\"".$eol; $message .= $content.$eol; $message .= "--".$uid."--"; if (mail($mail_to, $subject, $message, $header)) { return "mail_success"; } else { return "mail_error"; } 

यहां दो महत्वपूर्ण परिवर्तन हैं (1) हेडर्स से सभी संदेश को $ संदेश में हटा दिया। (2) सभी "\ r \ n" सामान को हटा दिया और $eol = PHP_EOL; जोड़ा गया $eol = PHP_EOL; कोड के लिए

साथ में, इन परिवर्तनों ने मुझे एक बार फिर अनुलग्नकों के साथ HTML ईमेल भेज दिया।

एक ही समस्या थी: शीर्षलेख से मीम सीमा और संदेश निकाल दिया गया और सभी काम किया।

  $header = "From: ".$from_name." <".$from_mail.">\n"; $header .= "Reply-To: ".$replyto."\n"; $header .= "MIME-Version: 1.0\n"; $header .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"\n\n"; $emessage= "--".$uid."\n"; $emessage.= "Content-type:text/plain; charset=iso-8859-1\n"; $emessage.= "Content-Transfer-Encoding: 7bit\n\n"; $emessage .= $message."\n\n"; $emessage.= "--".$uid."\n"; $emessage .= "Content-Type: application/octet-stream; name=\"".$filename."\"\n"; // use different content types here $emessage .= "Content-Transfer-Encoding: base64\n"; $emessage .= "Content-Disposition: attachment; filename=\"".$filename."\"\n\n"; $emessage .= $content."\n\n"; $emessage .= "--".$uid."--"; mail($mailto,$subject,$emessage,$header); 

उपरोक्त में से कोई भी मेरे लिए निश्चित नहीं है – मुख्य मुद्दा यह है कि आपको हेडर में हेडर की परिभाषाओं के अलावा कुछ भी नहीं रखना चाहिए। पुरानी लिपियों ने वहां कुछ भी फेंक दिया। तो किसी भी पाठ या अनुलग्नक को संदेश शरीर में हेडर में भर दिया गया था। समझ में आता है..

यह एक स्पष्टीकरण है
(मुझे लगता है कि फ्रैंक के ऊपर प्लस डेविसका की "दोहरी नई लाइनें" के समान ही समाधान नहीं है – लेकिन आपको अटैचमेंट के लिए नई लाइनें दोगुनी होनी चाहिए )

एक और परिदृश्य जो एक ही नई त्रुटि लाती है अगर आप "मेल" कमांड में कोई हेडर नहीं भेज रहे हैं यह सिर्फ एक डिफ़ॉल्ट उपयोग करने के लिए उपयोग किया जाता था, और अब भ्रामक त्रुटि देता है: "अतिरिक्त_हेडर में पाए गए एकाधिक या गलत रूपरेखा न्यूलाइन"

इसे जोड़कर तय किया जा सकता है:

 $header = "From: ".$from_name." <".$from_mail.">\n"; $header .= "Reply-To: ".$replyto."\n"; $header .= "MIME-Version: 1.0\n"; ... mail($mailto,$subject,$emessage,$header); 

मेरे PHP संस्करण – 5.4.43, शायद निश्चित बग # 68776 है

एक ही त्रुटि के लिए googling [ http://fossies.org/diffs/php/5.4.42_vs_5.4.43/ext/standard/mail.c-diff.html%5D

=> मैं खाली स्ट्रिंग का उपयोग मेल () मापदंडों के रूप में नहीं कर सकता।

मेरा पुराना कोड:

 $headers = 'From: ' . $frm . "\r\n"; $headers .= 'To: ' . $contactEmail . "\r\n"; if ( $flag ) { $headers .= 'To: ' . $contactEmail2 . "\r\n"; } $headers .= 'Cc: ' . $contactEmailCc . "\r\n"; $headers .= 'Bcc: ' . $contactEmailBcc . "\r\n"; $headers .= 'Return-Path: ' . $frm . "\r\n"; $headers .= 'MIME-Version: 1.0' ."\r\n"; $headers .= 'Content-Type: text/HTML; charset=ISO-8859-1' . "\r\n"; $headers .= 'Content-Transfer-Encoding: 8bit'. "\n\r\n"; $headers .= $htmlText . "\r\n"; if (!mail('', $strSubject, '', $headers)) { // !!! note the empty parameters. 

मेरा नया कोड:

 $headers = 'From: ' . $frm . "\r\n"; // note: no "To: " !!! $headers .= 'Cc: ' . $contactEmailCc . "\r\n"; $headers .= 'Bcc: ' . $contactEmailBcc . "\r\n"; $headers .= 'Return-Path: ' . $frm . "\r\n"; $headers .= 'MIME-Version: 1.0' ."\r\n"; $headers .= 'Content-Type: text/HTML; charset=ISO-8859-1' . "\r\n"; $headers .= 'Content-Transfer-Encoding: 8bit'. "\n\r\n"; // note: no $htmlText !!! // note: new parameters: $mTo = $contactEmail; if ( $flag ) { $mTo .= ', ' . $contactEmail2; } $mMessage .= $htmlText . "\r\n"; if (!mail($mTo, $strSubject, $mMessage, $headers)) { 

यह आपकी समस्या का समाधान करेगा। मैंने फ्रैंक के कोड का एक छोटा सा बदल दिया है यह कोड अनुलग्नक और एचटीएमएल का समर्थन करेगा।

  <?php $filename = "certificate.jpg"; $path = "/home/omnibl/subdomains/test/certificate/certimage/"; $file = $path . $filename; $file_size = filesize($file); $handle = fopen($file, "r"); $content = fread($handle, $file_size); fclose($handle); $content = chunk_split(base64_encode($content)); $uid = md5(uniqid(time())); $name = basename($file); $eol = PHP_EOL; $subject = "Mail Out Certificate"; $message = '<h1>Hi im mashpy</h1>'; $from_name = "mail@example.com"; $from_mail = "mail@example.com"; $replyto = "mail@example.com"; $mailto = "mail@example.com"; $header = "From: " . $from_name . " <" . $from_mail . ">\n"; $header .= "Reply-To: " . $replyto . "\n"; $header .= "MIME-Version: 1.0\n"; $header .= "Content-Type: multipart/mixed; boundary=\"" . $uid . "\"\n\n"; $emessage = "--" . $uid . "\n"; $emessage .= "Content-type:text/html; charset=iso-8859-1\n"; $emessage .= "Content-Transfer-Encoding: 7bit\n\n"; $emessage .= $message . "\n\n"; $emessage .= "--" . $uid . "\n"; $emessage .= "Content-Type: application/octet-stream; name=\"" . $filename . "\"\n"; // use different content types here $emessage .= "Content-Transfer-Encoding: base64\n"; $emessage .= "Content-Disposition: attachment; filename=\"" . $filename . "\"\n\n"; $emessage .= $content . "\n\n"; $emessage .= "--" . $uid . "--"; mail($mailto, $subject, $emessage, $header); 

आप बग # 69874 में चल रहे हैं, यदि आप बेवकूफ (यानी हेडर को सैनिटेट करना भूल गए हैं ) के लिए खाली अतिरिक्त_हैंडर्स सेट नहीं कर सकते हैं ।

बग के लिए टेस्ट करें

 $ php -d display_errors=1 -d display_startup_errors=1 -d error_reporting=30719 -r 'mail("test@email.com","Subject Here", "Message Here",NULL);' Warning: mail(): Multiple or malformed newlines found in additional_header in Command line code on line 1 

वैकल्पिक रूप से यदि आप अपने PHP संस्करण (संकेत: php -v ) को जानते हैं तो आप बग संख्या (69874) के लिए चैंज को देख सकते हैं कि यह देखने के लिए कि आपके संस्करण के लिए फ़िक्स लागू किया गया है या नहीं।

इस तरह से मेल () को कॉल बदलने के लिए एक अल्पकालिक फिक्स है

  function fix_mail( $to , $subject , $message , $additional_headers =NULL, $additional_parameters=NULL ) { $to=filter_var($to, FILTER_SANITIZE_STRING, FILTER_FLAG_NO_ENCODE_QUOTES| FILTER_FLAG_STRIP_LOW| FILTER_FLAG_STRIP_HIGH); $subject=filter_var($subject, FILTER_SANITIZE_STRING, FILTER_FLAG_NO_ENCODE_QUOTES| FILTER_FLAG_STRIP_LOW| FILTER_FLAG_STRIP_HIGH); if (!$additional_headers) return mail( $to , $subject , $message ); if (!$additional_parameters) return mail( $to , $subject , $message , $additional_headers ); return mail( $to , $subject , $message , $additional_headers, $additional_parameters ); } 

यह काफी संभव है कि कोई आपके ईमेल का उपयोग करने के लिए आपके ईमेल का उपयोग करने का प्रयास कर रहा है।

http://resources.infosecinstitute.com/email-injection/

मैं सुझाव देता हूं कि आप प्रवेश लॉग आदि की जांच करें और असामान्य गतिविधि देखें। तथ्य यह है कि आपको त्रुटि संदेश मिल रहे हैं उम्मीद है कि आपकी स्क्रिप्ट के साथ समझौता नहीं किया गया है और यह इसके बजाय त्रुटि को बाहर कर रहा है। आपको यद्यपि सुनिश्चित करने की ज़रूरत है।