email · 7 دقائق قراءة

لماذا يصل مرفق حجمه 4MB بحجم 5.4MB

لم يُضَف إلى ملفك شيء. أُعيدت كتابته نصًّا ليستطيع السفر، وكتابة البايتات نصًّا تكلّف الثلث.

حُدّد نقل البريد لنصّ US-ASCII بسبع بتات: محارف قابلة للطباعة، وأسطر قصيرة، وبلا ضمان أن البِت الثامن من البايت سينجو من الرحلة. بعض المحوّلات كانت تنزعه، وبعضها يستعمله لغرضه. أما الصورة، التي تأخذ بايتاتها كل قيمة ممكنة، فلم يكن لها أن تمرّ من هناك.

حلّت MIME هذا في 1992 دون تغيير خادم بريد واحد: أبقت القناة نصّية وأعادت كتابة كل ما عداها ليناسبها. ذلك القرار هو سبب عمل المرفقات، وهو سبب كونها في الرسالة أكبر منها على قرصك.

كيف تبدو رسالة فيها مرفق

ملف نصّي واحد. في أعلاه الترويسات، ومنها Content-Type: multipart/mixed; boundary="--=_a9f3". الحدّ الفاصل نصّ مخترَع لا يظهر في أي جزء من المحتوى، وكل جزء يبدأ بسطر فيه. ويُعلَّم الأخير بشرطتين في آخره، وبهذا يعرف القارئ أن الرسالة انتهت.

ثم يحمل كل جزء ترويساته القليلة الخاصّة — Content-Type، وغالبًا Content-Disposition يعطي اسم الملف، وContent-Transfer-Encoding يقول كيف أُعيدت كتابة الجزء.

الأجزاء تتداخل. multipart/alternative يحمل الرسالة نفسها مرّتين، نصًّا صِرفًا وHTML، ويختار البرنامج واحدة. وmultipart/related يحمل جزء HTML مع الصور التي يشير إليها. فرسالة تسويقية عادية فيها شعار وملف PDF عمقها ثلاث طبقات: mixed يحوي related يحوي alternative يحوي نسختَي النصّ الذي كتبته أنت.

base64، والـ33.3% بالضبط

يستعمل base64 أربعة وستّين محرفًا تصمد أمام كل شيء — A–Z وa–z و0–9 و+ و/. أربع وستّون قيمة تعني ستّ بتات لكل محرف.

فيأخذ ثلاث بايتات، وهي 24 بِتًّا، ويقطّعها أربع مجموعات من ستّ. ثلاث بايتات تدخل وأربعة محارف تخرج. هذه هي الآلية كلّها، والزيادة ثلث بالضبط — 33.3% لا تقريبًا.

ثم تُلَفّ الأسطر عند 76 محرفًا، لأن نقل البريد يكره الأسطر الطويلة، وكل لفّة تكلّف بايتًا أو اثنين فوق ذلك.

هذا يعطي الرقم الذي في العنوان. ملف حجمه 4 MB يصير 5.33 MB من base64؛ وتأخذه فواصل الأسطر إلى نحو 5.4؛ ثم تجلس فوقه الترويسات والحدود الفاصلة وما كتبته في المتن.

quoted-printable، ولماذا تكلّف العربية أكثر من صورة

base64 غير مقروء، وهذا هدر لجزء كلّه نصّ عادي تقريبًا. فوُجد ترميز ثانٍ لتلك الحالة.

يترك quoted-printable المحارف الآمنة كما هي، ويكتب ما عداها = يتبعه رقمان ستّ عشريّان. فتمرّ الفقرة الإنجليزية بلا مساس تقريبًا. هذا هو التصميم، وهو يعمل.

المشكلة أنه يتقاضى ثلاثة محارف عن كل بايت، لا عن كل حرف. الحرف العربي أو اليوناني بايتان في UTF-8، فيكلّف ستّة محارف؛ والحرف اللاتيني المشكول بايتان ويكلّف ستّة؛ والرمز التعبيري أربع بايتات ويكلّف اثني عشر.

فقد يخرج متن نصّي بالعربية بثلاثة أضعاف حجمه الأصلي، بينما لا تكبر صورة JPEG بجانبه في الرسالة نفسها إلا بالثلث. هذا عكس ما يتوقّعه الناس، ولهذا يختار البرنامج المرسِل نصًّا غير لاتيني base64 لجزء النصّ كذلك — فالثلث أرخص من ثلاثة أضعاف.

تفصيلان يستحقّان أن تعرفهما حين تنظر في رسالة خامّ. السطر المنتهي بـ= وحدها فاصل سطر ليّن: لفّ المرمِّز سطرًا طويلًا، وتلك العلامة تعني أنه يكمل. و=3D علامة يساوٍ حقيقية، هُرّبت لئلّا تُقرأ بداية رمز.

القيم الأخرى

7bit هي الافتراضية وتعني أن الجزء لم يحتج إلى شيء. و8bit وbinary تعنيان أنه تُرك كما هو رغم احتوائه بايتات لا يحملها النقل القديم. الخوادم الحديثة تدعم الامتداد الذي يسمح بذلك في معظمها، لكن الرسالة قد تعبر محطّة لا تدعمه، فيضطرّ شيء إلى إعادة ترميزها في الطريق. لهذا تظلّ البرامج ترمّز.

لماذا ليست 25 MB هي 25 MB

حدّ المرفقات عند المزوّد حدّ على الرسالة وهي تسافر، والرسالة وهي تسافر هي المرمَّزة.

فاحسبها بالعكس. 25 ÷ 1.33 تساوي 18.75. اطرح منها فواصل الأسطر، وترويسات الأجزاء، والحدود الفاصلة، ونصّ الرسالة نفسه، فيكون السقف الحقيقي نحو 18 MB من الملف الفعلي. فإن أرفقت أربعة ملفّات بدل واحد نزل قليلًا، لأن لكل جزء نفقاته.

للخادم المستقبِل حدّه هو أيضًا، والأصغر منهما هو الذي يحكم. فقد تغادر الرسالة بنجاح وتُرفض في الطرف البعيد، وهذا ما يتبيّن عادةً في إشعارات فشل التسليم بسبب الحجم.

لماذا لا يضغطه البرنامج نيابةً عنك

الحلّ البديهي أن يضغط برنامجك المرفق ويفكّه برنامج المستلم. ليست في البريد آليّة متّفق عليها لذلك. التحويل الوحيد الذي تعرّفه الصيغة هو ترميز النقل، وكل قيمة يمكن أن يأخذها تترك الجزء بحجمه أو أكبر.

لا مكسب أصلًا في الحالات الشائعة. صورة JPEG، وملف MP4، وملف PDF، وكل ملفّات Office الحديثة مضغوطة أصلًا — فمستند Word ملف مضغوط بامتداد آخر — فضغطها يوفّر واحدًا أو اثنين في المئة ويكلّف المستلم خطوة.

أما حيث ينفع الضغط فعلًا، أي النصّ الصِّرف وCSV وXML والسجلّات، فيستحقّ أن تفعله بيدك. انتبه فقط إلى أن الملف المضغوط يُرمَّز بـbase64 كغيره، فيعود الثلث فوق ما وفّرته.

أن تراه بنفسك

افتح ملف .eml في محرّر نصوص وستقرأ البنية كلّها: الحدود الفاصلة، وترويسات الأجزاء، وجدار base64 الذي كان صورة.

للنسخة العملية، استخراج المرفقات يفكّ ترميز base64 ويعيد إليك الملفّات الأصلية بايتًا بايتًا — ولا شيء يُفتح أو يُرسم في الطريق. والعارض يعرض البنية نفسها قائمةً، واستخراج النصّ يُسقط الوسوم ومعها هروب quoted-printable.

باختصار

البريد يحمل نصًّا، فيُعاد كتابة الثنائي نصًّا. يحوّل base64 كل ثلاث بايتات إلى أربعة محارف — أكثر بـ33.3% بالضبط، زائد فاصل سطر كل 76 محرفًا — ولهذا يصل 4 MB بحجم 5.4 MB، ولهذا يكون حدّ 25 MB في الحقيقة نحو 18 MB من الملف. وquoted-printable أرخص للإنجليزية وأغلى بكثير لكل ما عداها. الملف الذي يحفظه المستلم مطابق للذي أرفقته، وهذا هو المقصود من الترتيب كلّه.

أسئلة

لماذا يكون المرفق في الرسالة أكبر من الملف الأصلي؟

لأنه يُعاد كتابته نصًّا قبل الإرسال. يمثّل base64 كل ثلاث بايتات بأربعة محارف، أي أكبر بـ33.3%، ويضيف فاصلُ سطر كل 76 محرفًا شيئًا فوق ذلك. فيصير ملف حجمه 4 MB نحو 5.4 MB داخل الرسالة. أما الملف الخارج في الطرف الآخر فهو الذي أرفقته بايتًا بايتًا.

ما ترويسة Content-Transfer-Encoding؟

ترويسة في كل جزء من الرسالة تقول كيف أُعيدت كتابة ذلك الجزء ليصمد في الطريق. قيمها 7bit و8bit وbinary وquoted-printable وbase64. تصف تحويلًا قابلًا للعكس لا تغييرًا في الصيغة، ويفكّه برنامج المستلم قبل أن يعرض عليك شيئًا.

لماذا يكبّر quoted-printable النصّ العربي إلى هذا الحدّ؟

لأنه يتقاضى ثلاثة محارف عن كل بايت ليس ASCII عاديًّا، ويحسبها بالبايت لا بالحرف. الحرف العربي بايتان في UTF-8، فيكلّف ستّة محارف؛ والرمز التعبيري أربع بايتات فيكلّف اثني عشر. فقد يتضاعف نصّ بلغة غير لاتينية ثلاث مرّات، وهذا أسوأ من الثلث الذي كان base64 سيكلّفه.

ما أكبر ملف أستطيع إرفاقه إن كان الحدّ 25MB؟

نحو 18 MB. الحدّ مفروض على الرسالة بعد الترميز، والترميز يزيد نحو الثلث: 25 مقسومة على 1.33 تساوي 18.75، ثم تنزلها فواصل الأسطر وترويسات الأجزاء وما كتبته في المتن إلى نحو 18. إرفاق عدّة ملفّات ينزلها قليلًا مرّة أخرى، لأن لكل جزء نفقاته.

لماذا لا يضغط برنامج البريد المرفق ببساطة؟

لأنه لا توجد طريقة متّفق عليها ليفكّه برنامج الطرف الآخر. التحويل الوحيد الذي تعرّفه الصيغة هو ترميز النقل، وكل قيمة من قيمه تترك الجزء بحجمه أو أكبر. الضغط باليد يعمل، لكن معظم الملفّات الكبيرة مضغوطة أصلًا، والملف المضغوط يُرمَّز بـbase64 بعدها على أي حال.

أدوات من هذا الدليل

المزيد من أدوات البريد — كلّها تعمل في متصفّحك، ولا واحدة منها ترفع ملفًّا.