2012-01-03 14 views
8

(चूंकि यह मेरा पहला SO सवाल है, मुझे बस कहना है कि मुझे उम्मीद है कि यह ज़ेंड-विशिष्ट भी नहीं है। जहां तक ​​मैं यह कह सकता हूं कि यह नहीं होना चाहिए एक समस्या। हालांकि मैं इसे ज़ेंड-विशिष्ट फोरम में पोस्ट कर सकता था, मुझे लगता है कि मुझे कम से कम एक अच्छा जवाब मिलने की संभावना है, खासकर जब उत्तर में एमआईएम-संबंधित मुद्दों को शामिल किया जा सकता है जो ज़ेंड फ्रेमवर्क को पार करते हैं। मैं मूल रूप से यह समझने की कोशिश कर रहा हूं कि मुझे जिस मुद्दे का सामना करना पड़ रहा है उसे ज़ेडएफ बग माना जाना चाहिए, या अगर मैं कुछ गलत समझ रहा हूं या इसका दुरुपयोग कर रहा हूं।)समझ में नहीं आ रहा है कि Zend_Mail :: addHeader() स्ट्रिप्स न्यूलाइन

मैं एक एमआईएमई संदेश बनाने के लिए ज़ेंड_Mail का उपयोग कर रहा हूं एक ईमेल वितरण सेवा, SendGrid के माध्यम से भेजा गया। उनका मंच आपको अपने एसएमटीपी सर्वर के माध्यम से ईमेल भेजने की इजाजत देता है, लेकिन जब आप एक विशेष हेडर (एक्स-एसएमटीपीएपीआई) का उपयोग करते हैं तो अतिरिक्त सुविधाएं देता है जिसका मूल्य मालिकाना पैरामीटर की JSON-encoded स्ट्रिंग है, जो काफी लंबा हो सकता है।

आखिरकार, जो हेडर मैं पास कर रहा था वह बहुत लंबा हो गया (मुझे लगता है> 1000 वर्ण), और मुझे त्रुटियां मिलीं। मैं उलझन में था क्योंकि मुझे पता था कि यह Zend_Mail :: addHeader() के मान को पार करने से पहले PHP के मूल वर्डवाप() फ़ंक्शन के माध्यम से पारित हो रहा था, इसलिए मैंने सोचा कि रेखा की लंबाई कभी भी समस्या नहीं होनी चाहिए।

यह पता चला है कि addHeader() न्यूलाइनों को जानबूझकर स्ट्रिप करता है, और टिप्पणियों के माध्यम से कोई विशेष स्पष्टीकरण नहीं देता है।

// In Zend_Mail::addHeader() 
$value = $this->_filterOther($value); 


// In Zend_Mail::_filterOther() 
$rule = array("\r" => '', 
       "\n" => '', 
       "\t" => '', 
); 
return strtr($data, $rule); 

ठीक है, यह पहली बार में उचित लग रहा था - शायद जेडएफ स्वरूपण और लाइन रैपिंग का पूरा नियंत्रण चाहता है। अगली विधि :: addHeader() Zend_Mail में कहा जाता

$value = $this->_encodeHeader($value); 

इस विधि मूल्य encodes है (या तो उद्धृत-मुद्रण योग्य या उचित रूप में बेस 64) उचित लंबाई के लाइनों में है और यह हिस्सा है, लेकिन केवल अगर यह होता है "गैर-प्रिंट करने योग्य वर्ण", जैसा कि Zend_Mime :: द्वारा निर्धारित किया गया है ($ मूल्य)।

उस विधि को देखते हुए, न्यूलाइन (\ n) वास्तव में गैर-प्रिंट करने योग्य पात्र माना जाता है! इसलिए अगर उन्हें पिछले विधि कॉल में स्ट्रिंग से बाहर नहीं किया गया था, तो लंबे हेडर को क्यूपी के रूप में एन्कोड किया जाएगा और 72-चार लाइनों में घुमाया जाएगा, और सब कुछ ठीक काम करेगा। असल में, मैंने एक परीक्षण किया जहां मैंने _filterOther() को कॉल करने पर टिप्पणी की, और लंबा हेडर एन्कोड हो जाता है और बिना किसी समस्या के चला जाता है। लेकिन अब मैंने जेडएफ को एक लापरवाही हैक बनाया है, जिसे मैंने हटाई गई रेखा के पीछे वास्तव में समझने के बिना किया है, इसलिए यह दीर्घकालिक समाधान नहीं हो सकता है।

मेरा मध्यम अवधि का समाधान ज़ेंड_Mail का विस्तार करने और एक नई विधि, addHeaderForceEncode() बनाने के लिए किया गया है, जो हमेशा शीर्षलेख के मान को एन्कोड करेगा, और इस प्रकार इसे हमेशा छोटी रेखाओं में घुमाएगा। लेकिन मैं अभी भी संतुष्ट नहीं हूं क्योंकि मुझे समझ में नहीं आता कि क्यों _filterOther() कॉल पहली जगह में जरूरी था - शायद मुझे इसके आसपास काम नहीं करना चाहिए।

क्या कोई मुझे बता सकता है कि यह व्यवहार न्यूलाइन को अलग करने का क्यों अस्तित्व में है? ऐसा लगता है कि अनिवार्य रूप से उन परिस्थितियों का कारण बनता है जहां एक शीर्षलेख बहुत लंबा हो सकता है यदि इसमें न्यूलाइन के अलावा कोई भी "गैर-प्रिंट करने योग्य वर्ण" नहीं है।

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


अद्यतन: मामले में किसी को भी जेडएफ मुद्दा मैं इस बारे में खोला पालन करने के लिए, चाहता है यहाँ यह है: Zend_Mail::addHeader() UNfolds long headers, then throws exception

+1

स्टैक ओवरव्लो सब कुछ जवाब दे सकता है;) +1 यहां आपके पहले प्रश्न के लिए। – Flavius

+0

मुझे स्वागत महसूस करने के लिए धन्यवाद। – LinusR

उत्तर

6

आप शायद कुछ चीजें में चला रहे हैं। प्रति RFC 2821, एसएमटीपी में पाठ लाइनों 1000 से अधिक वर्ण नहीं कर सकते हैं:

पाठ लाइन

है 1000 अक्षरों (गिनती अग्रणी पारदर्शिता के लिए दोहराया गया डॉट नहीं सहित एक पाठ लाइन की अधिकतम कुल लंबाई)। यह संख्या SMTP सेवा एक्सटेंशन के उपयोग से बढ़ाया जा सकता है।

एक शीर्षलेख में न्यूलाइन नहीं हो सकती है, इसलिए शायद यही कारण है कि ज़ेंड उन्हें अलग कर रहा है। लंबे शीर्षकों के लिए, लाइन ब्रेक (एसएमटीपी में सीआरएलएफ) डालने और उन्हें "लपेटने" के लिए एक टैब डालना आम है। RFC 822 से

अंश:

प्रत्येक हेडर फ़ील्ड एक क्षेत्र का नाम और एक क्षेत्र शरीर शामिल हैं, ASCII वर्ण की एक एकल, तार्किक पंक्ति के रूप में देखी जा सकती है। सुविधा के लिए, इस वैचारिक इकाई के फ़ील्ड-बॉडी हिस्से को एकाधिक-रेखा प्रतिनिधित्व में विभाजित किया जा सकता है; यह "फोल्डिंग" कहा जाता है। सामान्य नियम यह है कि जहां भी रैखिक-सफेद-स्थान (केवल एलडब्लूएसपी-वर्ण नहीं), एक सीआरएलएफ हो सकता है, इसके बाद तुरंत एक एलडब्लूएसपी-चार डाला जा सकता है।

मैं कहूँगा कि _encodeHeader() समारोह संभवतः लाइन की लंबाई पर गौर करना चाहिए, और यदि शीर्ष लेख कुछ जादू मूल्य से अधिक लंबी है, "रैप और टैब" के लिए यह कई पंक्तियों अवधि है।

+2

मैंने भी जांच की है और ऐसा नहीं लगता है कि ज़ेंड_Mail हेडर फोल्डिंग का समर्थन करता है, न ही यह आपको "कच्चे हेडर" को जोड़ने का एक तरीका देता है जो यह संसाधित नहीं करता है। ऐसा प्रतीत होता है कि यह संशोधन 'Zend_Mail_Transport_Abstract' की' _prepareHeaders' विधि 'में सबसे अच्छा होगा। यदि आप 'addHeader' में तीसरा पैरामीटर '$ append' पास करते हैं, तो यह संलग्न डेटा को फोल्ड करेगा, लेकिन लाइन के अंत में एक कॉमा भी जोड़ता है जो मुझे लगता है कि आपका JSON तोड़ देगा। यह एक [मुद्दा] (http://framework.zend.com/issues/secure/Dashboard.jspa) बनाने के योग्य हो सकता है। – drew010

+0

@ टॉमोग्लिक मुझे समझ में नहीं आता कि आपने क्यों कहा "हेडर में न्यूलाइन नहीं हो सकती है, इसलिए शायद यही कारण है कि ज़ेंड उन्हें अलग कर रहा है", क्योंकि सीआरएलएफ के हिस्से के रूप में नई लाइनें फोल्डिंग के लिए जरूरी हैं (जैसा कि आपने आरएफसी 822 के माध्यम से भी बताया है) । लेकिन सामान्य रूप से मैं इसे स्वीकार करता हूं कि addHeader() या _encodeHeader() से कुछ जागरूकता गायब है? – LinusR

+0

@LinusR: मुझे लगता है कि ज़ेंड एक गुना हेडर की उम्मीद नहीं कर रहा है, और यही कारण है कि यह न्यूलाइन को अलग कर रहा है। मेरी राय में, ज़ेंड को या तो एक फोल्ड हेडर स्वीकार करना चाहिए (जहां प्रत्येक सीआरएलएफ का पीछा व्हाइटस्पेस होता है, कोई नंगे सीआर या एलएफ) या लंबे हेडर को फोल्ड करने का प्रयास करें। – tomlogic