डेवलपर टूल · Base64 एनकोडर और डिकोडर
ईमेल अटैचमेंट Base64 क्यों हैं: MIME, 7-बिट ट्रांसपोर्ट और 76-कॉलम लाइनें
· पेजभूमि
Base64 एन्कोडिंग
ईमेल 7-बिट ASCII टेक्स्ट के लिए बनाया गया था, और अनुलग्नकों को इसके माध्यम से फिट होना था। यह पोस्ट बताती है कि MIME ने Base64 को कैसे अपनाया, लाइनों को 76 वर्णों में क्यों लपेटा गया है और आकार और डिबगिंग के लिए इसका क्या अर्थ है।
जो अटैचमेंट आया वह एक पुराने रिले के माध्यम से दूषित हो गया - 8-बिट समस्या जिसे हल करने के लिए MIME का आविष्कार किया गया था
ईमेल को 1970 और 1980 के दशक में केवल 7-बिट ASCII टेक्स्ट के लिए डिज़ाइन किया गया था। SMTP, वह प्रोटोकॉल जो ईमेल ले जाता है, अपेक्षा करता है कि प्रत्येक पंक्ति अधिकतम 998 वर्ण 7-बिट ASCII (अक्षर 0-127) हो। PDF जैसी बाइनरी फ़ाइल या SMTP के माध्यम से सीधे एक छवि भेजना विफल हो जाएगा: बाइट्स 128-255 पुराने मेल सर्वर और रिले द्वारा दूषित या अस्वीकार कर दिए जाएंगे। अनुलग्नकों को एन्कोडिंग की आवश्यकता है. MIME (बहुउद्देशीय इंटरनेट मेल एक्सटेंशन, RFC 2045) ने Base64 सहित कंटेंट-ट्रांसफर-एनकोडिंग हेडर मानों को परिभाषित करके इसे हल किया, जो किसी भी बाइट अनुक्रम को 7-बिट ASCII टेक्स्ट के रूप में दर्शाता है।
MIME कई सामग्री-स्थानांतरण-एनकोडिंग विकल्प प्रदान करता है: 7bit (कोई एन्कोडिंग नहीं, केवल सुरक्षित ASCII के लिए), 8bit (उन सर्वरों के लिए जो 8-बिट बाइट्स का समर्थन करते हैं, सार्वभौमिक नहीं), उद्धृत-मुद्रण योग्य (केवल गैर-सुरक्षित बाइट्स को एन्कोड करता है, ASCII को ध्यान में रखते हुए) पठनीय), और Base64 (संगतता को अधिकतम करते हुए, सब कुछ एन्कोड करता है)। Base64 को बाइनरी अटैचमेंट के लिए चुना गया था क्योंकि यह सरल, मानकीकृत है, और किसी भी मेल सिस्टम पर सुरक्षा की गारंटी देता है, चाहे कितना भी पुराना या सख्ती से 7-बिट-केवल हो। ट्रेड-ऑफ का आकार है: Base64 मूल बाइट्स से लगभग एक तिहाई बड़ा है।
परिवहन समस्या Base64 हल करता है - मुद्रण योग्य वर्णों के साथ मनमाने ढंग से बाइट्स का प्रतिनिधित्व करता है
एक 3 KB PDF मोटे तौर पर Base64 टेक्स्ट का 4 KB बन जाता है। 76-वर्ण रेखा सीमा RFC 2045 से आती है।
SMTP 998 वर्ण तक की लाइनों की अनुमति देता है, लेकिन पुराने मेल सिस्टम और कुछ स्पैम फ़िल्टर लंबी लाइनों को अस्वीकार कर देते हैं। RFC 2045 निर्दिष्ट करता है कि MIME Base64 लाइनें 76 वर्ण (साथ ही CRLF लाइन का अंत) से अधिक नहीं होनी चाहिए, इसलिए मेल सर्वर कभी भी ट्रांसपोर्ट को नहीं तोड़ेगा। सीमा जादुई नहीं है; यह पठनीयता (76 अक्षर अधिकांश 1980 के टर्मिनलों में फिट बैठता है), पुराने सिस्टम के साथ संगतता और स्पैम या वायरस पैटर्न के रूप में पहचान से बचने के बीच एक ऐतिहासिक समझौता है।
इस टूल में दिखाई देने वाले आउटपुट विकल्प - कैनोनिकल पैडिंग और वैकल्पिक 76-कैरेक्टर रैपिंग
आधुनिक मेल सिस्टम आमतौर पर लंबी लाइनों का समर्थन करते हैं, लेकिन 76-वर्ण लाइनों पर एन्कोडिंग यह सुनिश्चित करती है कि अटैचमेंट सबसे पुराने रिसीवर तक भी पहुंचे। RFC 2045 परिभाषित MIME Base64 के बाद, RFC 4288 (मीडिया प्रकार) और RFC 2183 (सामग्री-विस्थापन) ने अनुलग्नकों को लेबल करने के लिए मानकीकृत तरीके जोड़े। PDF अनुलग्नक वाले एक संदेश में एक सामग्री-स्थानांतरण-एन्कोडिंग: Base64 हेडर, एक सामग्री-प्रकार: एप्लिकेशन/pdf हेडर, और 76-वर्ण रेखाओं के साथ Base64 के रूप में एन्कोड किए गए PDF बाइट्स शामिल हैं। एक मेल रीडर लाइन ब्रेक (CRLF अक्षर) को हटाकर और फिर मूल बाइट्स को पुनर्प्राप्त करने के लिए Base64 को डिकोड करके लाइनों को डीकोड करता है।
MIME Base64 अनुलग्नक को डिकोड करने के लिए रिक्त स्थान को अनदेखा करना आवश्यक है। RFC कहता है: डिकोडर्स को डिकोडिंग के दौरान लाइन ब्रेक (CR और LF अक्षर) को छोड़ना होगा। यही कारण है कि व्हाइटस्पेस स्वीकार करने वाला Base64 डिकोडर व्यावहारिक है; अधिकांश वास्तविक MIME मेल में लाइन ब्रेक होंगे। कुछ डिकोडर सख्त हैं और व्हाइटस्पेस को अस्वीकार करते हैं (JWT जैसे संदर्भों के लिए उपयुक्त, जहां लाइन ब्रेक मौजूद नहीं होना चाहिए), जबकि अन्य उदार हैं और व्हाइटस्पेस को छोड़ देते हैं (MIME के लिए उपयुक्त)।
व्यवहार में 76-वर्ण विकल्प - कैसे एनकोडर सम्मिलित करता है और डिकोडर लाइन ब्रेक को अनदेखा करता है
Base64 एनकोडर और डिकोडर टूल दोनों को संभाल सकता है: यह मल्टी-लाइन चिपकाए गए अटैचमेंट को स्वीकार करता है और डिकोड के दौरान लाइन ब्रेक को अनदेखा करता है। आकार प्रभाव पूर्वानुमानित है. RFC 2045 Base64 रैपिंग आउटपुट के प्रति 76 वर्णों में एक CRLF (2 bytes) जोड़ता है। 10 KB फ़ाइल के लिए, Base64 लगभग 13.3 KB है, साथ ही प्रत्येक 76 अक्षर CRLF है: कुल मिलाकर लगभग 13.5 KB। ओवरहेड लगभग एक तिहाई अधिक बाइट्स है।
ईमेल आकार सीमाएँ आमतौर पर एन्कोडेड आकार के लिए बताई जाती हैं, मूल फ़ाइल आकार के लिए नहीं; 25 MB सीमा वाले मेल सर्वर का अर्थ एन्कोडेड संदेश का 25 MB है, अनुलग्नकों का 25 MB नहीं। मूल फ़ाइल आकार की गणना के लिए 1.33 (या अधिक सटीक रूप से, 4 को 3 से विभाजित करना) की आवश्यकता होती है। उद्धृत-प्रिंट करने योग्य एन्कोडिंग एक विकल्प है जो प्रिंट करने योग्य ASCII को अपरिवर्तित रखता है और केवल बाइट्स 128-255 और कुछ विशेष वर्णों को एन्कोड करता है।
व्यावहारिक उदाहरण: एक कच्चे संदेश स्रोत को पढ़ना - Base64 भाग को ढूंढना और एक छोटे पाठ अनुलग्नक को डिकोड करना
यदि आप कच्चा संदेश स्रोत खोलते हैं तो अधिकतर ASCII वाली टेक्स्ट फ़ाइल पढ़ने योग्य रहती है। Base64 हर चीज़ को अस्पष्ट कर देता है, यहाँ तक कि सादे ASCII टेक्स्ट को भी। बाइनरी फ़ाइलों के लिए उद्धृत-प्रिंट करने योग्य का उपयोग शायद ही कभी किया जाता है (यह PDF के लिए बहुत अक्षम होगा) लेकिन कभी-कभी पाठ के लिए इसका उपयोग किया जाता है। एक मेल रीडर अनुलग्नक प्रकार के आधार पर एन्कोडिंग चुनता है; ब्राउज़र आमतौर पर उपयोगकर्ता से यह नहीं पूछता कि कौन CAन्कोडिंग लागू करनी है।
किसी ईमेल संदेश का Base64 मुख्य भाग केवल बाइट्स ही होता है, कोई अलग फ़ाइल नहीं। जब आप किसी मेल रीडर में कोई अनुलग्नक देखते हैं, तो रीडर पहले ही Base64 को डिकोड कर चुका होता है और मूल फ़ाइल दिखा रहा होता है।
व्यवहार में आकार की लागत - लगभग एक तिहाई अधिक बाइट्स, और एन्कोडेड आकार के लिए मेल आकार सीमाएं क्यों बताई गई हैं
यदि आप कच्चा संदेश स्रोत (अधिकांश मेल क्लाइंट में एक विकल्प) देखते हैं, तो आपको MIME हेडर और Base64-एन्कोडेड बॉडी दिखाई देगी। Base64 एनकोडर और डिकोडर टूल आपको संदेश स्रोत के एक टुकड़े को मैन्युअल रूप से डीकोड करने में मदद कर सकता है; Base64 भाग की प्रतिलिपि बनाएँ, लाइन ब्रेक हटाएँ, और इसे टूल में पेस्ट करें।
MIME संदेश में एकाधिक अनुलग्नक एक मल्टीपार्ट सीमा का उपयोग करते हैं। प्रत्येक भाग के अपने हेडर (सामग्री-प्रकार, सामग्री-स्थानांतरण-एन्कोडिंग) और मुख्य भाग होते हैं। संदेश का सादा-पाठ वैकल्पिक संस्करण एक भाग के रूप में प्रकट होता है, और प्रत्येक अनुलग्नक दूसरे भाग के रूप में प्रकट होता है। सीमा रेखा भागों को अलग करती है; इसे किसी भी भाग की सामग्री में प्रकट न होने के लिए चुना गया है। एक मेल रीडर सीमाओं को पार्स करके और प्रत्येक भाग को उसके कंटेंट-ट्रांसफर-एन्कोडिंग हेडर के अनुसार डिकोड करके संदेश का पुनर्निर्माण करता है।
इसमें क्या शामिल नहीं है - एन्कोडेड-वर्ड हेडर, S/MIME और गहराई में 8BITMIME एक्सटेंशन
RFC 2045 Base64 एन्कोडिंग आज सार्वभौमिक नहीं है। कुछ मेल सिस्टम 8-बिट ट्रांसपोर्ट का समर्थन करते हैं और अब उन्हें Base64 की आवश्यकता नहीं है। कुछ सिस्टम अलग-अलग एन्कोडिंग नामों का उपयोग करते हैं या कस्टम हेडर जोड़ते हैं। लेकिन 76-वर्ण रेखाओं वाला Base64 अनुलग्नकों के लिए सबसे अनुकूल विकल्प बना हुआ है, जिन्हें किसी भी मेल सिस्टम, कहीं भी पहुंचना चाहिए। जब आप किसी मेल क्लाइंट का उपयोग करके फ़ाइल संलग्न करते हैं, तो क्लाइंट आमतौर पर बाइनरी फ़ाइलों के लिए स्वचालित रूप से Base64 चुनता है, लाइन रैपिंग को संभालता है, और MIME हेडर जोड़ता है।
जब कोई अनुलग्नक दूषित लगता है या जब आप किसी संदेश स्रोत के साथ मैन्युअल रूप से काम कर रहे होते हैं, तो तंत्र को समझने से आपको डीबग करने में मदद मिलती है। किसी आउटगोइंग ईमेल संदेश को बनाने या पार्स करने के लिए MIME संरचना को समझने की आवश्यकता होती है। एक लाइब्रेरी को एन्कोडिंग, लाइन रैपिंग और हेडर को संभालना चाहिए; आप आमतौर पर MIME को मैन्युअल रूप से नहीं बनाते हैं। लेकिन यदि आप एक कच्चे संदेश स्रोत को पार्स कर रहे हैं (डिलीवरी समस्या को डीबग कर रहे हैं, या प्रोग्रामेटिक रूप से अटैचमेंट निकाल रहे हैं), तो यह जानते हुए कि कंटेंट-ट्रांसफर-एनकोडिंग: Base64 का मतलब है कि निम्नलिखित बॉडी 76-कैरेक्टर-रैप्ड Base64 है, जिससे आप सही डिकोडर लागू कर सकते हैं।
टेकअवे: Base64 ईमेल की अनुकूलता परत है - कैसे Base64 एनकोडर और डिकोडर आपको स्थानीय रूप से एक कच्चे संदेश से एक छोटा पाठ भाग पढ़ने की सुविधा देता है
Base64 स्वयं मानक RFC 4648 है; रैपिंग और MIME हेडर ईमेल के लिए विशिष्ट हैं। ईमेल अटैचमेंट Base64 हैं क्योंकि ईमेल सादे टेक्स्ट के लिए बनाया गया था और Base64 केवल टेक्स्ट प्रोटोकॉल के माध्यम से बाइनरी डेटा भेजने के लिए सबसे सरल, सबसे सार्वभौमिक संगतता परत है। 76-वर्ण रेखा सीमा 1980 के दशक के टर्मिनलों और धीमे नेटवर्क की एक ऐतिहासिक कलाकृति है, लेकिन यह अनुकूलता के लिए मानक के रूप में बनी हुई है।
इस इतिहास को समझने से पता चलता है कि MIME क्यों मौजूद है, कई एन्कोडिंग विकल्प क्यों हैं, और Base64 अटैचमेंट के लिए डिफ़ॉल्ट क्यों बना हुआ है, भले ही आधुनिक मेल सिस्टम सीधे बाइनरी का समर्थन कर सकते हैं। Base64 एनकोडर और डिकोडर आपको एन्कोडिंग को सत्यापित या डीबग करने के लिए MIME निकायों के साथ मैन्युअल रूप से काम करने देता है।