اذهب إلى المحتوى

السؤال

نشر

 

أواجه مشكلات في فهم كيفية إرسال مرفق بالبريد الإلكتروني attachment باستخدام Python. لقد نجحت في إرسال رسائل بريد إلكتروني بسيطة باستخدام smtplib. هل يمكن لشخص ما أن يشرح كيفية إرسال مرفق في رسالة بريد إلكتروني. وجدت بعض الشروحات الأخرى على الإنترنت ولكن لم أفهم بعد كيف يتم الأمر في بايثون.

وهل يوجد حد أقصى لحجم الملفات المرفقة في البريد الإلكتروني؟

Recommended Posts

  • 0
نشر

يمكنك إرسال mail بالإضافة لل attachment عن طريق

  • إنشاء MIME 
  • ثم إضافة البيانات  مثل from , to , Date و subject 
  • بعد ذلك نضيف المرفقات ولكن بعد قرائتها ثم عمل encode لها ل  base64  
  • ثم نرسل ال mail 
import smtplib
from pathlib import Path
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email.utils import COMMASPACE, formatdate
from email import encoders


def send_mail(send_from, send_to, subject, message, files=[],
              server="localhost", port=587, username='', password='',
              use_tls=True):
   
    msg = MIMEMultipart()
    msg['From'] = send_from
    msg['To'] = COMMASPACE.join(send_to)
    msg['Date'] = formatdate(localtime=True)
    msg['Subject'] = subject

    msg.attach(MIMEText(message))

    for path in files:
        part = MIMEBase('application', "octet-stream")
        with open(path, 'rb') as file:
            part.set_payload(file.read())
        encoders.encode_base64(part)
        part.add_header('Content-Disposition',
                        'attachment; filename="{}"'.format(Path(path).name))
        msg.attach(part)

    smtp = smtplib.SMTP(server, port)
    if use_tls:
        smtp.starttls()
    smtp.login(username, password)
    smtp.sendmail(send_from, send_to, msg.as_string())
    smtp.quit()

 

  • 0
نشر

لكي تستطيع إرسال ملفات ثنائية binary الى خادم email صُمم للعمل مع بيانات نصية ، فيجب عليك تكويد encode الملفات قبل الإرسال.

عادةً يتم عمل ذلك بإستخدام base64 حيث يقوم بتشفير البيانات الثنائية الى حروف ASCII قابلة للطباعة

هذا الكود في الأسفل يوضح كيفية إرسال بريد إلكتروني مع ملف pdf كمرفق

import email, smtplib, ssl

from email import encoders
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

subject = "An email with attachment from Python"
body = "This is an email with attachment sent from Python"
sender_email = "my@gmail.com"
receiver_email = "your@gmail.com"
password = input("Type your password and press enter:")

# إنشاء رسالة متعددة الأجزاء وتعيين الرأس
message = MIMEMultipart()
message["From"] = sender_email
message["To"] = receiver_email
message["Subject"] = subject
message["Bcc"] = receiver_email  

# إضافة جسم الى الرسالة الالكترونية
message.attach(MIMEText(body, "plain"))

filename = "document.pdf"  # في نفس مسار ملف الكود

# فتح الملف في الوضع الثنائي
with open(filename, "rb") as attachment:
    # إضافة نوع الملف كمجرى ثماني
    part = MIMEBase("application", "octet-stream")
    part.set_payload(attachment.read())
 
# تشفير الملف الى حروف ASCII
encoders.encode_base64(part)

# إضافة الرأس الى جزء المُرفق
part.add_header(
    "Content-Disposition",
    f"attachment; filename= {filename}",
)

# إضافة المُرفق الى الرسالة وتحويل الرسالة الى سلسلة نصية
message.attach(part)
text = message.as_string()

# تسجيل الدخول الى الخادم وإرسال الرسالة الإلكترونيى
context = ssl.create_default_context()
with smtplib.SMTP_SSL("smtp.gmail.com", 465, context=context) as server:
    server.login(sender_email, password)
    server.sendmail(sender_email, receiver_email, text)

 

  • 2
نشر (معدل)

بالنسبة للحجم نعم هناك قيود على gmail حيث لا يمكن أن تكون المرفقات أكبر من 25 ميجابايت. يمكنك القيام بماتطلبه من خلال الكود التالي باستخدام مكتبة django:

#لمرفقات البريد الإلكتروني
from django.core.mail import EmailMessage
    def attachment_email(request):
            email = EmailMessage(
            'Hello', #subject:  موضوع البريد الإلكتروني
            'Body goes here', #body: النص الأساسي
            'MyEmail@MyEmail.com', #from: عنوان المرسل
            ['SendTo@SendTo.com'], #to: قائمة أو مجموعة من عناوين المستلمين
            ['bcc@example.com'], #bcc: قائمة أو مجموعة من العناوين المستخدمة في عنوان "Bcc" عند إرسال البريد الإلكتروني
            reply_to=['other@example.com'],
            headers={'Message-ID': 'foo'},
            )
            email.attach_file('/my/path/file')
            email.send()

تتم تهيئة الصف EmailMessage بالمعلمات التالية subject و body و from_email و to و bcc و connection و attachments و headers و cc و reply_to . جميع المعلمات اختيارية ويمكن ضبطها في أي وقت قبل استدعاء التابع send().
headers: قاموس من الرؤوس الإضافية لوضعها على الرسالة. المفاتيح هي اسم الرأس ، والقيم هي قيم الرأس. الأمر متروك للمتصل للتأكد من أن أسماء الرأس والقيم بالتنسيق الصحيح لرسالة بريد إلكتروني. السمة المقابلة هي extra_headers. أما reply_to: قائمة أو مجموعة من عناوين المستلمين المستخدمة في عنوان "اreply-to" عند إرسال البريد الإلكتروني.
أيضاُ يمكنك أن تمرر له الوسيط attachments وهو قائمة المرفقات المراد وضعها مع الرسالة. هذا الكلاس لديه التابع attach_file() الذي ينشئ مرفقًا جديدًا باستخدام ملف من نظام الملفات الخاص بك. استدعها بمسار الملف المراد إرفاقه ، واختيارياً ، نوع MIME المراد استخدامه للمرفق. إذا تم حذف نوع MIME ، فسيتم تخمينه من اسم الملف. وأيضاً التابع send لإرسال الرسالة. وتدعم هذه المكتبة العديد من العمليات الأخرى أيضاً لذا يمكنك الذهاب إلى توثيق المكتبة والإطلاع عليها، سيكون ذلك مفيداً لك.
يمكنك أيضاً القيام بذلك كالتالي:

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
from os.path import basename
def send_mail(send_from: str, subject: str, text: str, 
send_to: list, files= None):
    send_to= default_address if not send_to else send_to
    msg = MIMEMultipart()
    msg['From'] = send_from
    msg['To'] = ', '.join(send_to)  
    msg['Subject'] = subject
    msg.attach(MIMEText(text))
    for f in files or []:
        with open(f, "rb") as fil: 
            ext = f.split('.')[-1:]
            attachedfile = MIMEApplication(fil.read(), _subtype = ext)
            attachedfile.add_header(
                'content-disposition', 'attachment', filename=basename(f) )
        msg.attach(attachedfile)
    smtp = smtplib.SMTP(host="smtp.gmail.com", port= 587) 
    smtp.starttls()
    smtp.login(username,password)
    smtp.sendmail(send_from, send_to, msg.as_string())
    smtp.close()

ولاستخدامه:

username = 'my-address@gmail.com' # اسم المستخدم
password = 'top-secret' # كلمة المرور
default_address = ['my-address2@gmail.com']  # العنوان الافتراضي
# إرسال الإيميل
send_mail(send_from= username,
subject="test",
text="text",
send_to= None, # المرسل إليه
files=Path # مسار ملفاتك
)

للاستخدام مع أي مزود بريد إلكتروني آخر ، ما عليك سوى تغيير تكوينات SMTP.

تم التعديل في بواسطة Ali Haidar Ahmad

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...