بدون معرفة مسبقة كبيرة بـ MIME، حاولت تعلم كيفية كتابة سكريبت Python لإرسال بريد إلكتروني مع مرفق ملف. بعد التحقق المتقاطع من وثائق Python، وأسئلة Stack Overflow، والبحث العام على الويب، اخترت الكود التالي[1] واختبرته للتأكد من أنه يعمل.
pythonimport smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
fromaddr = "YOUR EMAIL"
toaddr = "EMAIL ADDRESS YOU SEND TO"
msg = MIMEMultipart()
msg['From'] = fromaddr
msg['To'] = toaddr
msg['Subject'] = "SUBJECT OF THE EMAIL"
body = "TEXT YOU WANT TO SEND"
msg.attach(MIMEText(body, 'plain'))
filename = "NAME OF THE FILE WITH ITS EXTENSION"
attachment = open("PATH OF THE FILE", "rb")
part = MIMEBase('application', 'octet-stream')
part.set_payload((attachment).read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', "attachment; filename= %s" % filename)
msg.attach(part)
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login(fromaddr, "YOUR PASSWORD")
text = msg.as_string()
server.sendmail(fromaddr, toaddr, text)
server.quit()
- لدي فكرة تقريبية عن كيفية عمل هذا السكريبت الآن، ووضعت الخطوات التالية. يرجى إعلامي عما إذا كانت خطواتي دقيقة أم لا.
scssmsg.as_string()
|
+------------MIMEMultipart
| |---content-type
| +---header---+---content disposition
+----.attach()-----+----MIMEBase----|
| +---payload (to be encoded in Base64)
+----MIMEText
-
كيف يمكنني معرفة متى يتعين استخدام MIMEMultipart و MIMEText و MIMEBase؟ يبدو أن هذا سؤال معقد، لذلك ربما يمكنكم تقديم بعض القواعد العامة لي؟
مقالات ذات صلة -
لقد قرأت أن MIME لديها هيكل شبيه بالشجرة[2]، هل هذا يعني أن MIMEMultipart دائمًا في القمة؟
-
في الكود البرمجي الأول، قام MIMEMultipart بترميز [‘From’] و [‘To’] و [‘Subject’]، لكن في وثائق Python، يمكن أيضًا استخدام MIMEText لترميز [‘From’] و [‘To’] و [‘Subject’]. كيف أقرر أيهما يجب استخدامه؟
-
ما هو بالضبط “payload”؟ هل هو محتوى ما يجب نقله؟ إذا كان الأمر كذلك، فما هو نوع المحتوى الذي يتضمنه هذا (لاحظت أن النص الرئيسي والمرفق يتم التعامل معهما على أنها payloads)? اعتقدت أن هذا سؤال سهل ولكني فقط لم أتمكن من العثور على إجابة مرضية وموثوقة وبسيطة.
-
هل من الصحيح أنه على الرغم من أن MIME يمكنه إرفاق تنسيقات ملف أسهل بكثير من مجرد بعض النصوص، في النهاية تُحوَّل جميع عمليات الترميز ومعلومات الرأس والأحمال إلى سلاسل نصية حتى يمكن تمريرها إلى .sendmail()؟
[2] http://blog.magiksys.net/generate-and-send-mail-with-python-tutorial
المزيد من المعلومات
بالطبع، إليك المزيد من المعلومات:
-
كيفية استخدام MIMEMultipart و MIMEText و MIMEBase:
- MIMEMultipart: تُستخدم لإنشاء جسم رسالة متعددة الأجزاء، حيث يمكن إرفاق العديد من الأجزاء مثل النصوص والملفات.
- MIMEText: تُستخدم لإنشاء جسم رسالة نصية بسيطة، مثل جسم البريد الإلكتروني الذي يحتوي على نص.
- MIMEBase: تُستخدم لإنشاء جسم رسالة قاعدة MIME عامة، والتي يمكن استخدامها لإرفاق ملفات أو بيانات غير نصية.
-
بالنسبة للهيكل الشبيه بالشجرة لـ MIME، فعادةً يتم وضع MIMEMultipart في القمة لأنه يمكن أن يحتوي على أجزاء متعددة، بما في ذلك نصوص MIME وملفات MIME.
-
في الكود المعروض، يتم استخدام MIMEMultipart لتشكيل الرسالة الأساسية وإضافة التوجيهات والموضوع. يمكن استخدام MIMEText بدلاً من MIMEMultipart إذا كنت ترغب فقط في إرسال نص بسيط دون مرفقات. عمومًا، يُفضل استخدام MIMEMultipart إذا كنت تخطط لإرفاق مرفقات.
-
“Payload” هو المحتوى الفعلي للرسالة، بما في ذلك النصوص والملفات. يمكن أن تكون هذه البيانات مشفرة أو غير مشفرة وتكون جزءًا من جسم الرسالة.
-
بالنعمة، في نهاية المطاف، يتم تحويل جميع الأجزاء من جسم الرسالة إلى سلسلة نصية واحدة باستخدام الوظيفة
as_string()
، التي تمكنك من تمرير الرسالة إلى وظيفة.sendmail()
لإرسالها عبر البروتوكول SMTP.
هذه المعلومات يمكن أن تساعدك في فهم كيفية استخدام MIMEMultipart و MIMEText و MIMEBase بشكل أفضل عند إنشاء سكريبتات Python لإرسال البريد الإلكتروني مع مرفقات.