سكريبت Python لإرسال رسائل البريد الإلكتروني لعدة أشخاص Python Send Email
يمكن استخدام Python في العديد من المهام المتعلقة بالبريد الإلكتروني، ومن بينها إرسال الرسائل باستخدام بروتوكول SMTP وقراءة عناوين المستلمين من ملفات مثل CSV.
في هذا المقال سنتعرف على طريقة عمل سكريبت Python يقوم بقراءة مجموعة من عناوين البريد الإلكتروني من ملف CSV ثم إرسال رسالة بريد إلكتروني إليها، مع توضيح أهم أجزاء الكود والأخطاء التي يمكن أن تواجهك أثناء استخدامه.
كما سنتعرف على بعض الجوانب الأمنية والعملية المهمة عند التعامل مع بيانات تسجيل الدخول وإرسال عدد كبير من رسائل البريد الإلكتروني.
نظرة سريعة على كود إرسال البريد الإلكتروني باستخدام Python
بشكل مبسط، يعتمد السكريبت على مجموعة من المكتبات الموجودة في Python لتنفيذ عملية إرسال البريد الإلكتروني.
يقوم الكود بالخطوات التالية:
- استدعاء مكتبة smtplib للاتصال بخادم البريد الإلكتروني.
- استخدام مكتبة csv لقراءة عناوين البريد من ملف.
- استخدام EmailMessage لإنشاء رسالة البريد الإلكتروني.
- طلب البريد الإلكتروني وكلمة المرور من المستخدم.
- طلب عنوان الرسالة ومحتواها.
- إنشاء اتصال مع خادم SMTP.
- قراءة عناوين البريد الموجودة داخل ملف CSV.
- إرسال الرسالة إلى كل عنوان.
وهذه الطريقة تعتبر مثالًا جيدًا لفهم كيفية التعامل مع SMTP وملفات CSV وإنشاء رسائل البريد الإلكتروني باستخدام Python.
المكتبات المستخدمة في الكود
يستخدم السكريبت عددًا من المكتبات الأساسية لتنفيذ عملية إرسال البريد الإلكتروني.
import smtplib
import csv
from email.message import EmailMessageمكتبة smtplib مسؤولة عن إنشاء الاتصال مع خادم SMTP وإرسال رسائل البريد الإلكتروني.
أما مكتبة csv فتستخدم لقراءة عناوين البريد الإلكتروني الموجودة داخل ملف CSV.
بينما تستخدم EmailMessage لإنشاء الرسالة وتحديد عنوانها والمرسل والمستلم والمحتوى.
إدخال بيانات البريد الإلكتروني
في البداية يطلب البرنامج من المستخدم إدخال البريد الإلكتروني وكلمة المرور بالإضافة إلى عنوان الرسالة ومحتواها.
youremail = input("Enter your email to login :")
yourpassword = input("Enter your password to login :")
subject = input("Enter the subject :")
body = input("Enter the message :")يتم استخدام البريد الإلكتروني وكلمة المرور لتسجيل الدخول إلى خادم البريد، بينما يتم استخدام subject وbody لإنشاء محتوى الرسالة.
الاتصال بخادم SMTP
بعد إدخال بيانات المستخدم يقوم البرنامج بإنشاء اتصال مع خادم SMTP الخاص بمزود البريد الإلكتروني.
server = smtplib.SMTP_SSL("smtp.gmail.com", 465)يستخدم المثال السابق خادم Gmail مع الاتصال المشفر SSL على المنفذ 465.
بعد إنشاء الاتصال يحاول البرنامج تسجيل الدخول باستخدام بيانات الحساب:
server.login(youremail, yourpassword)ولكن يجب الانتباه إلى أن استخدام كلمة مرور الحساب مباشرة قد لا يعمل مع العديد من خدمات البريد الحديثة، كما أنه ليس الخيار الأفضل من الناحية الأمنية.
قراءة عناوين البريد من ملف CSV
بعد الاتصال بخادم البريد يقوم البرنامج بفتح ملف emails.csv لقراءة عناوين البريد الإلكتروني الموجودة بداخله.
with open("emails.csv", newline="") as csvfile:
spamreader = csv.reader(csvfile)يمكن أن يحتوي الملف على مجموعة من عناوين البريد الإلكتروني، بحيث يتم قراءة كل عنوان ثم استخدامه كمستلم للرسالة.
ويفضل أن يكون ملف CSV منظمًا بشكل واضح، مثل:
user1@example.com
user2@example.com
user3@example.comإرسال الرسالة إلى المستلمين
بعد قراءة عناوين البريد يبدأ البرنامج في المرور عليها واحدًا تلو الآخر وإنشاء رسالة لكل مستلم.
count = 0
for email in spamreader:
count += 1
print("send email --> " + str(count))
msg = EmailMessage()
msg["Subject"] = subject
msg["From"] = youremail
msg["To"] = email[0]
msg.set_content(body)
server.send_message(msg)يقوم المتغير count بحساب عدد الرسائل Python Send Email التي تم التعامل معها، بينما يتم إنشاء كائن جديد من EmailMessage لكل رسالة.
بعد ذلك يتم تحديد عنوان الرسالة والمرسل والمستلم، ثم إضافة محتوى الرسالة باستخدام:
msg.set_content(body)وأخيرًا يتم إرسال الرسالة من خلال:
server.send_message(msg)إغلاق اتصال SMTP
بعد الانتهاء من إرسال جميع الرسائل يجب إغلاق الاتصال مع خادم البريد.
server.quit()ويمكن بعد ذلك طباعة رسالة توضح انتهاء عملية الإرسال.
print("Emails sent successfully")الكود الكامل لإرسال البريد الإلكتروني
بعد جمع الأجزاء السابقة يمكن كتابة المثال التعليمي بالشكل التالي:
import smtplib
import csv
from email.message import EmailMessage
youremail = input("Enter your email to login :")
yourpassword = input("Enter your password to login :")
subject = input("Enter the subject :")
body = input("Enter the message :")
server = smtplib.SMTP_SSL("smtp.gmail.com", 465)
server.login(youremail, yourpassword)
with open("emails.csv", newline="") as csvfile:
reader = csv.reader(csvfile)
count = 0
for email in reader:
count += 1
print("send email --> " + str(count))
msg = EmailMessage()
msg["Subject"] = subject
msg["From"] = youremail
msg["To"] = email[0]
msg.set_content(body)
server.send_message(msg)
server.quit()
print("Emails sent successfully")مشاكل في الكود يجب الانتباه إليها
رغم أن المثال السابق مفيد لفهم طريقة عمل Python Send Email، إلا أن هناك بعض المشاكل التي يجب الانتباه إليها قبل استخدامه في مشروع حقيقي.
مشكلة المسافات البادئة Indentation
لغة Python تعتمد بشكل أساسي على المسافات البادئة لتحديد أجزاء الكود، ولذلك فإن وضع الأسطر في أماكن غير صحيحة قد يؤدي إلى ظهور أخطاء أثناء تشغيل البرنامج.
يجب التأكد من أن الأسطر الموجودة داخل for وwith تحتوي على المسافات البادئة الصحيحة.
مشكلة قراءة ملف CSV
إذا كان ملف CSV يحتوي على عناوين بريد مفصولة بفواصل أو يحتوي على أكثر من عمود، فيجب التعامل مع البيانات بالشكل المناسب.
على سبيل المثال، إذا كان الملف يحتوي على:
name,email
Ahmed,ahmed@example.com
Ali,ali@example.comفيمكن قراءة عمود البريد الإلكتروني بدلًا من التعامل مع الصف كاملًا.
for row in reader:
email = row[1]
print(email)حماية كلمة المرور
من الأخطاء المهمة في المثال استخدام input() لإدخال كلمة المرور.
yourpassword = input("Enter your password to login :")هذه الطريقة ليست الأفضل للتعامل مع كلمات المرور، خصوصًا عند استخدام السكريبت في بيئة عمل أو مشروع حقيقي.
من الأفضل استخدام وسائل أكثر أمانًا مثل Environment Variables أو آليات المصادقة التي يوفرها مزود البريد الإلكتروني.
كما أن بعض مزودي البريد الإلكتروني قد يتطلبون استخدام OAuth2 أو App Password بدلًا من كلمة مرور الحساب الأساسية.
معالجة أخطاء إرسال البريد
الكود الأساسي لا يحتوي على معالجة للأخطاء، ولذلك قد يتوقف البرنامج بالكامل في حالة حدوث مشكلة أثناء الاتصال أو تسجيل الدخول أو إرسال إحدى الرسائل.
يمكن استخدام try وexcept للتعامل مع الأخطاء بدلًا من إيقاف البرنامج مباشرة.
try:
server.send_message(msg)
print("Email sent successfully")
except Exception as error:
print("Error:", error)وبذلك يمكن معرفة الرسائل التي فشلت عملية إرسالها والاستمرار في التعامل مع باقي البيانات حسب تصميم البرنامج.
حدود إرسال البريد الإلكتروني
عند إرسال عدد كبير من الرسائل بشكل متتابع قد يفرض مزود البريد الإلكتروني قيودًا على الحساب، وقد يتم رفض بعض الرسائل Python Send Email أو تقييد عملية الإرسال.
لذلك لا يفضل استخدام حساب بريد شخصي لإرسال حملات بريدية كبيرة، كما يجب الالتزام بحدود وسياسات مزود البريد المستخدم.
استخدام السكريبت بطريقة آمنة ومسؤولة
يجب استخدام هذا النوع من السكريبتات فقط لإرسال الرسائل إلى أشخاص لديهم سبب مشروع لاستلامها، وتجنب إرسال الرسائل Python Send Email بشكل عشوائي أو إلى قوائم بريدية لم توافق على استقبالها.
في حالة استخدام البريد الإلكتروني للتسويق، يجب توفير وسيلة واضحة لإلغاء الاشتراك والالتزام بالقوانين والسياسات المتعلقة بالبريد الإلكتروني والخصوصية في البلد الذي تستهدفه.
بدائل احترافية لإرسال البريد الإلكتروني
إذا كان الهدف هو إرسال عدد كبير من الرسائل أو بناء نظام بريد إلكتروني داخل تطبيق، فمن الأفضل استخدام خدمات متخصصة بدلًا من الاعتماد على حساب بريد شخصي واتصال SMTP مباشر.
هناك العديد من الخدمات التي توفر API مخصصة لإرسال البريد الإلكتروني، بالإضافة إلى تقارير التسليم وإدارة القوائم ومتابعة الرسائل المرتجعة.
ومن أمثلة هذه الخدمات:
- SendGrid
- Mailgun
- Amazon SES
وتعتبر هذه الخدمات أكثر مناسبة للمشاريع التي تحتاج إلى إرسال عدد كبير من الرسائل Python Send Email بشكل منظم.
الخلاصة
يعتبر إرسال البريد الإلكتروني باستخدام Python مثالًا جيدًا لفهم كيفية التعامل مع SMTP وملفات CSV وإنشاء الرسائل باستخدام EmailMessage.
ومن خلال السكريبت السابق يمكنك قراءة عناوين البريد من ملف CSV وإنشاء رسالة وإرسالها إلى كل مستلم بشكل منفصل.
مزيد من المقالات : شرح Pull to Refresh في Kotlin Compose وكيف تعمل خاصية السحب للتحديث داخليًا
ولكن عند استخدام الكود في مشروع حقيقي يجب الاهتمام بحماية بيانات تسجيل الدخول، ومعالجة الأخطاء، والالتزام بحدود مزود البريد الإلكتروني، بالإضافة إلى إرسال الرسائل بطريقة قانونية ومسؤولة.
شرح مكتبة Safe Image لفلترة الصور الحساسة بالذكاء الاصطناعي






