Python: البريد الإلكتروني. message_from_string مع بيانات كبيرة في هيئة البريد الإلكتروني

StackOverflow https://stackoverflow.com/questions/3543118

  •  30-09-2019
  •  | 
  •  

سؤال

لقد كنت ألعب مع وحدة Python's Imaplib والبريد الإلكتروني مؤخرًا. حاولت إرسال واستلام رسائل بريد إلكتروني كبيرة (مع معظم البيانات في نص البريد الإلكتروني بدلاً من المرفقات) باستخدام وحدات IMAPLIB/البريد الإلكتروني.

ومع ذلك ، فقد لاحظت مشكلة عندما أقوم بتنزيل رسائل بريد إلكتروني كبيرة (بحجم أكبر من 8 ميغابايت أو نحو ذلك) من خادم البريد الإلكتروني وتنسيقها باستخدام طريقة "eMail.message_from_string ()". يبدو أن الوقت الذي تستغرقه هذه الطريقة يستغرق وقتًا طويلاً حقًا (حوالي 300-310 ثانية للبريد الإلكتروني 16 ميجابايت). ملحوظة: إرسال مثل هذا البريد الإلكتروني الكبير لا يستغرق الكثير من الوقت ، حوالي 40 ثانية تقريبًا. مرة أخرى ، جميع البيانات موجودة في نص البريد الإلكتروني - وليس في المرفقات. إذا قمت بتنزيل نفس البريد الإلكتروني مع جميع البيانات مثل المرفقات, ، تنتهي العملية بأكملها في 30-40 ثانية. هذا ما أفعله:

buf = []
t, d = mailacct.search(None, 'SUBJECT', subj)
for num in d:
    t, msg = mailacct.fetch(num, '(RFC822)')

    for resp in msg:
        if isinstance(resp, tuple):
            buf.append(email.message_from_string(resp[1])

لقد قمت بتوقيت كل جزء من الكود بشكل منفصل. MailAcct.Search و MailAcct.fetch ينتهيان في حوالي 30-40 ثانية للبريد الإلكتروني 16 ميجابايت. يستغرق السطر مع البريد الإلكتروني.

أنا بيثون نوب. إذن هل أفعل شيئًا غير فعال حقًا في الكود أعلاه؟ أو هل تكمن المشكلة في طريقة البريد الإلكتروني. message_from_string () ، وربما تنفيذ غير فعال؟ أو هل يمكن أن تكون أجسام البريد الإلكتروني لا تهدف أبدًا إلى احتواء كميات كبيرة من البيانات ، وبالتالي الأداء الضعيف؟

* تعديل *: معلومات إضافية: لقد استخدمت imaplib.imap4_ssl لإنشاء اتصالات IMAP. لقد استخدمت imaplib.append () لتحميل الرسائل إلى حساب البريد الإلكتروني أولاً. لقد استخدمت بيانات ثنائية تم إنشاؤها عشوائيًا للحمولة النافعة.

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

المحلول

حسنًا ، لقد قمت ببعض الحفر بمفردي عن طريق فحص الكود المصدري لوحدة البريد الإلكتروني. وظيفة التحليل (parse ()) في البريد الإلكتروني/parser.py هي الوظيفة التي تعالج بالفعل رسالة البريد الإلكتروني عند استدعاء البريد الإلكتروني. message_from_string (). يبدو أنه تحليل الأوتار في كتل من 8192 بايت وهذا هو السبب في أن الأمر يستغرق وقتًا طويلاً للبيانات الكبيرة. لقد غيرت الرمز بحيث تقرأ المعالجة ومعالجتها في وقت واحد وكان هناك تحسن هائل في الوقت المستغرق لمعالجة رسالة البريد الإلكتروني الكبيرة.

أفترض أنه تم تعيينه في البداية لمعالجة السلاسل في كتل 8192 للتعامل مع سلاسل كبيرة حقًا؟ هل هناك طريقة أفضل للقيام بذلك بدلاً من تغيير رمز مصدر وحدة البريد الإلكتروني؟

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