سؤال

لدي العديد من رسائل البريد الإلكتروني الواردة من مصادر مختلفة.لديهم جميعا مرفقات ، والعديد منهم لديهم أسماء مرفقات باللغة الصينية ، لذلك هذه يتم تحويل الأسماء إلى base64 بواسطة عملاء البريد الإلكتروني الخاصة بهم.

عندما أتلقى رسائل البريد الإلكتروني هذه، أرغب في فك تشفير الاسم.ولكن هناك أسماء أخرى هي ليس قاعدة 64.كيف يمكنني التمييز بين ما إذا كانت السلسلة هي base64 أم لا، باستخدام دالة jython لغة برمجة؟

أي.

المرفق الأول:

------=_NextPart_000_0091_01C940CC.EF5AC860
Content-Type: application/vnd.ms-excel;
 name="Copy of Book1.xls"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="Copy of Book1.xls"

المرفق الثاني:

------=_NextPart_000_0091_01C940CC.EF5AC860
Content-Type: application/vnd.ms-excel;
 name="=?gb2312?B?uLGxvmhlbrixsb5nLnhscw==?="
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="=?gb2312?B?uLGxvmhlbrixsb5nLnhscw==?="  

يرجى ملاحظة كلا "ترميز نقل المحتوى"لديك base64

هل كانت مفيدة؟

المحلول

يرجى ملاحظة كليهما Content-Transfer-Encoding لديك قاعدة 64

غير مناسب في هذه الحالة، Content-Transfer-Encoding ينطبق فقط على حمولة الجسم، وليس على الرؤوس.

=?gb2312?B?uLGxvmhlbrixsb5nLnhscw==?=

هذا هو RFC2047-ذرة رأس مشفرة.وظيفة stdlib لفك تشفيرها email.header.decode_header.لا يزال الأمر يحتاج إلى القليل من المعالجة اللاحقة لتفسير نتائج هذه الوظيفة على الرغم من:

import email.header
x= '=?gb2312?B?uLGxvmhlbrixsb5nLnhscw==?='
try:
    name= u''.join([
        unicode(b, e or 'ascii') for b, e in email.header.decode_header(x)
    ])
except email.Errors.HeaderParseError:
    pass # leave name as it was

لكن...

Content-Type: application/vnd.ms-excel;
 name="=?gb2312?B?uLGxvmhlbrixsb5nLnhscw==?="

وهذا ببساطة خطأ.ما الارسال خلق ذلك؟لا يمكن أن يحدث ترميز RFC2047 إلا في الذرات، والسلسلة المقتبسة ليست ذرة.RFC2047 §5 ينفي هذا صراحةً:

  • يجب ألا تظهر "الكلمة المشفرة" ضمن "سلسلة مقتبسة".

الطريقة المقبولة لترميز رؤوس المعلمات عند وجود سلسلة طويلة أو أحرف Unicode هي RFC2231, ، وهي حقيبة جديدة تمامًا من الأذى.ولكن يجب أن تستخدم مكتبة قياسية لتحليل البريد يمكنها التعامل مع ذلك نيابةً عنك.

لذلك، يمكنك الكشف عن '=?' في معلمات اسم الملف إذا كنت تريد ذلك، وحاول فك تشفيره عبر RFC2047.ومع ذلك، فإن الشيء الصحيح الذي يجب فعله بالمعنى الدقيق للكلمة هو أن تأخذ مرسل البريد في كلمته وتستدعي الملف حقًا =?gb2312?B?uLGxvmhlbrixsb5nLnhscw==?=!

نصائح أخرى

تخبرك قيمة الرأس بما يلي:

=?gb2312?B?uLGxvmhlbrixsb5nLnhscw==?=

"=?"     introduces an encoded value
"gb2312" denotes the character encoding of the original value
"B"      denotes that B-encoding (equal to Base64) was used (the alternative 
         is "Q", which refers to something close to quoted-printable)
"?"      functions as a separator
"uLG..." is the actual value, encoded using the encoding specified before
"?="     ends the encoded value

حتى الانقسام على "؟" في الواقع تحصل على هذا (تدوين JSON)

["=", "gb2312", "B", "uLGxvmhlbrixsb5nLnhscw==", "="]

في المصفوفة الناتجة، إذا كان "B" في الموضع 2، فستواجه سلسلة مشفرة ذات قاعدة 64 في الموضع 3.بمجرد فك تشفيرها، تأكد من الانتباه إلى التشفير الموجود في الموضع 1، ربما يكون من الأفضل تحويل كل شيء إلى UTF-8 باستخدام هذه المعلومات.

@gnud ، @edg - ما لم أسيء الفهم ، فهو يسأل عن اسم الملف وليس محتوى الملف @setori - يخبرك ترميز Content-Trasfer-Encoding بكيفية ترميز محتوى الملف ، وليس "اسم الملف".

أنا لست خبيرًا، لكن هذا الجزء هنا في اسم الملف يخبره عن الشخصيات التالية:

=?gb2312?ب?

أنا أبحث عن الوثائق في RFCs ...آه!ها هو: http://tools.ietf.org/html/rfc2047

يقول RFC:

بشكل عام، "الكلمة المشفرة" عبارة عن سلسلة من أحرف ASCII القابلة للطباعة والتي تبدأ بـ "=؟"، وتنتهي بـ "؟"، وتتضمن حرفين "؟" بينهما.

شيء آخر يجب النظر إليه هو الكود الموجود في SharpMimeTools، وهو محلل MIME (في C#) الذي أستخدمه في تتبع الأخطاء برنامج، BugTracker.NET

هناك طريقة أفضل من طريقة Bobince للتعامل مع مخرجات decode_header.لقد وجدته هنا: http://mail.python.org/pipermail/email-sig/2007-March/000332.html

name = unicode(email.header.make_header(email.header.decode_header(x)))

حسنًا، قم بتحليل رأس البريد الإلكتروني في القاموس.ثم تتحقق مما إذا تم تعيين ترميز نقل المحتوى، وما إذا كان = "base64" أو "base-64".

سؤال:"""أحتاج أيضًا إلى معرفة نوع الملف، على سبيل المثال .xls أو .doc، لذلك أحتاج إلى فك تشفير اسم الملف من أجل معالجة المرفق بشكل صحيح، ولكن كما هو مذكور أعلاه، يبدو أن gb2312 غير مدعوم في jython، أعرف أي دوار؟"""

بيانات:

Content-Type: application/vnd.ms-excel;
 name="=?gb2312?B?uLGxvmhlbrixsb5nLnhscw==?="

الملاحظات:

(1) يشير السطر الأول إلى Microsoft Excel، لذلك .xls تبدو أفضل من .doc

(2)

>>> import base64
>>> base64.b64decode("uLGxvmhlbrixsb5nLnhscw==")
'\xb8\xb1\xb1\xbehen\xb8\xb1\xb1\xbeg.xls'
>>>

(أ) يبدو أن الامتداد .xls - لا حاجة ل gb2312 برنامج الترميز
(ب) إذا كنت تريد اسم ملف آمن لنظام الملفات، فيمكنك استخدام المتغير "-_" لـ base64 أو يمكنك ترميزه بنسبة مئوية
(ج) لما يستحق، اسم الملف هو XYhenXYg.xls حيث X وY عبارة عن حرفين صينيين يعنيان معًا "نسخة" والباقي عبارة عن أحرف ASCII حرفية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top