إرسال الإيميلات تلقائياً ببايثون: دليل شامل لأتمتة البريد الإلكتروني
هل سبق وتمنيت أن ترسل عشرات الإيميلات بضغطة زر واحدة بدلاً من كتابة كل واحد يدوياً؟ سواء كنت تريد إرسال تقارير يومية، تنبيهات تلقائية، أو رسائل تسويقية لقائمة عملاء — بايثون تمنحك القدرة على أتمتة البريد الإلكتروني بالكامل باستخدام مكتبة smtplib المدمجة.
في هذا الدليل الشامل، ستتعلم كيفية إرسال الإيميلات تلقائياً ببايثون خطوة بخطوة، من إعداد الاتصال بخادم البريد إلى إرسال رسائل HTML مع مرفقات. هذا المقال جزء من سلسلة أتمتة المهام بلغة بايثون التي تغطي كل ما تحتاجه للبدء.
لماذا تستخدم بايثون لأتمتة البريد الإلكتروني؟
أتمتة الإيميلات ببايثون ليست مجرد توفير وقت — إنها تفتح آفاقاً واسعة:
- إرسال تقارير يومية أو أسبوعية تلقائياً لفريق العمل
- تنبيهات فورية عند حدوث أخطاء في السيرفر أو تغييرات في البيانات
- رسائل ترحيب وتأكيد للمستخدمين الجدد في تطبيقك
- إشعارات مخصصة بناءً على شروط محددة في قاعدة البيانات
- حملات بريدية لقوائم العملاء مع تخصيص المحتوى لكل مستلم
المتطلبات الأساسية
قبل البدء، تأكد من توفر التالي:
- بايثون 3.6 أو أحدث مثبت على جهازك
- حساب بريد إلكتروني (Gmail أو Outlook أو أي خادم SMTP)
- معرفة أساسية بلغة بايثون (المتغيرات، الدوال، الاستيراد)
إذا كنت مبتدئاً، ننصحك بقراءة الدليل الشامل لأتمتة المهام ببايثون أولاً.
فهم بروتوكول SMTP
بروتوكول SMTP (Simple Mail Transfer Protocol) هو المعيار المستخدم لإرسال البريد الإلكتروني عبر الإنترنت. عندما ترسل إيميلاً، يتصل برنامجك بخادم SMTP الذي يتولى توصيل الرسالة للمستلم.
أشهر خوادم SMTP:
| الخدمة | خادم SMTP | المنفذ (TLS) |
|---|---|---|
| Gmail | smtp.gmail.com | 587 |
| Outlook | smtp.office365.com | 587 |
| Yahoo | smtp.mail.yahoo.com | 587 |
الخطوة 1: إرسال إيميل بسيط بالنص العادي
لنبدأ بأبسط مثال — إرسال رسالة نصية باستخدام smtplib:
import smtplib
from email.mime.text import MIMEText
# إعدادات البريد
smtp_server = "smtp.gmail.com"
port = 587
sender_email = "your_email@gmail.com"
password = "your_app_password" # استخدم App Password
receiver_email = "recipient@example.com"
# إنشاء الرسالة
msg = MIMEText("مرحباً! هذه رسالة تجريبية من بايثون.", "plain", "utf-8")
msg["Subject"] = "رسالة تجريبية من بايثون"
msg["From"] = sender_email
msg["To"] = receiver_email
# الاتصال والإرسال
with smtplib.SMTP(smtp_server, port) as server:
server.starttls() # تفعيل التشفير
server.login(sender_email, password)
server.sendmail(sender_email, receiver_email, msg.as_string())
print("تم إرسال الإيميل بنجاح!")
شرح الكود خطوة بخطوة
MIMEText— ينشئ رسالة بريدية بصيغة نصية مع دعم الترميز UTF-8 للعربيةsmtplib.SMTP()— يفتح اتصالاً مع خادم البريدstarttls()— يفعّل تشفير TLS لحماية بياناتكlogin()— يسجل الدخول بحسابكsendmail()— يرسل الرسالة فعلياً
الخطوة 2: إرسال إيميل بصيغة HTML
الرسائل النصية محدودة في التنسيق. لإرسال رسائل احترافية بألوان وتنسيقات، استخدم HTML:
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import smtplib
def send_html_email(receiver, subject, html_body):
sender = "your_email@gmail.com"
password = "your_app_password"
msg = MIMEMultipart("alternative")
msg["Subject"] = subject
msg["From"] = sender
msg["To"] = receiver
# نسخة نصية احتياطية
text_part = MIMEText("متصفحك لا يدعم HTML", "plain", "utf-8")
html_part = MIMEText(html_body, "html", "utf-8")
msg.attach(text_part)
msg.attach(html_part)
with smtplib.SMTP("smtp.gmail.com", 587) as server:
server.starttls()
server.login(sender, password)
server.sendmail(sender, receiver, msg.as_string())
# استخدام الدالة
html_content = """
<html>
<body style="font-family: Arial; direction: rtl;">
<h2 style="color: #2c3e50;">تقرير يومي</h2>
<p>مرحباً، هذا تقريرك اليومي:</p>
<ul>
<li>المبيعات: 150 طلب</li>
<li>الإيرادات: 5,000 ريال</li>
</ul>
</body>
</html>
"""
send_html_email("boss@company.com", "التقرير اليومي", html_content)
الخطوة 3: إرسال إيميل مع مرفقات
في كثير من الأحيان تحتاج لإرفاق ملفات مثل تقارير PDF أو جداول Excel. إليك الطريقة:
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
import os
def send_email_with_attachment(receiver, subject, body, file_path):
sender = "your_email@gmail.com"
password = "your_app_password"
msg = MIMEMultipart()
msg["Subject"] = subject
msg["From"] = sender
msg["To"] = receiver
msg.attach(MIMEText(body, "plain", "utf-8"))
# إضافة المرفق
filename = os.path.basename(file_path)
with open(file_path, "rb") as f:
attachment = MIMEBase("application", "octet-stream")
attachment.set_payload(f.read())
encoders.encode_base64(attachment)
attachment.add_header(
"Content-Disposition",
f"attachment; filename={filename}"
)
msg.attach(attachment)
with smtplib.SMTP("smtp.gmail.com", 587) as server:
server.starttls()
server.login(sender, password)
server.sendmail(sender, receiver, msg.as_string())
print(f"تم إرسال {filename} بنجاح!")
# مثال الاستخدام
send_email_with_attachment(
"manager@company.com",
"التقرير الشهري",
"مرفق التقرير الشهري لشهر مارس",
"/path/to/report.pdf"
)
الخطوة 4: إرسال إيميلات جماعية من ملف CSV
الإرسال الجماعي المخصص هو أحد أقوى استخدامات أتمتة البريد. يمكنك قراءة بيانات المستلمين من ملف CSV وتخصيص كل رسالة:
import csv
import smtplib
from email.mime.text import MIMEText
import time
def send_bulk_emails(csv_file):
sender = "your_email@gmail.com"
password = "your_app_password"
with open(csv_file, "r", encoding="utf-8") as f:
reader = csv.DictReader(f)
recipients = list(reader)
print(f"جاري إرسال {len(recipients)} رسالة...")
with smtplib.SMTP("smtp.gmail.com", 587) as server:
server.starttls()
server.login(sender, password)
for i, person in enumerate(recipients, 1):
name = person["name"]
email = person["email"]
body = f"مرحباً {name},\n\n"
body += "نشكرك على اشتراكك في نشرتنا البريدية.\n"
body += "تابعنا للحصول على أحدث المقالات."
msg = MIMEText(body, "plain", "utf-8")
msg["Subject"] = f"مرحباً {name} في مجتمعنا!"
msg["From"] = sender
msg["To"] = email
server.sendmail(sender, email, msg.as_string())
print(f"[{i}/{len(recipients)}] تم الإرسال إلى {name}")
time.sleep(2) # تأخير لتجنب الحظر
# الاستخدام
send_bulk_emails("subscribers.csv")
ملف CSV يجب أن يكون بالشكل التالي:
name,email
أحمد,ahmed@example.com
سارة,sara@example.com
محمد,mohammed@example.com
time.sleep(2) بين كل إرسال لتجنب أن يحظر خادم البريد حسابك بسبب الإرسال السريع. Gmail يسمح بحوالي 500 رسالة يومياً للحسابات العادية.الخطوة 5: معالجة الأخطاء والمحاولات المتكررة
في بيئة الإنتاج، يجب التعامل مع الأخطاء المحتملة مثل انقطاع الاتصال أو رفض الخادم:
import smtplib
import time
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
def send_with_retry(receiver, subject, body, max_retries=3):
sender = "your_email@gmail.com"
password = "your_app_password"
for attempt in range(1, max_retries + 1):
try:
msg = MIMEText(body, "plain", "utf-8")
msg["Subject"] = subject
msg["From"] = sender
msg["To"] = receiver
with smtplib.SMTP("smtp.gmail.com", 587) as server:
server.starttls()
server.login(sender, password)
server.sendmail(sender, receiver, msg.as_string())
logger.info(f"تم الإرسال بنجاح إلى {receiver}")
return True
except smtplib.SMTPAuthenticationError:
logger.error("خطأ في المصادقة! تحقق من كلمة المرور.")
return False
except smtplib.SMTPException as e:
logger.warning(f"المحاولة {attempt}/{max_retries} فشلت: {e}")
if attempt < max_retries:
time.sleep(5 * attempt) # انتظار تصاعدي
logger.error(f"فشل الإرسال بعد {max_retries} محاولات")
return False
الخطوة 6: تخزين بيانات الاعتماد بأمان
لا تكتب كلمات المرور أبداً في الكود المصدري. استخدم متغيرات البيئة أو ملف .env:
# تثبيت المكتبة
# pip install python-dotenv
import os
from dotenv import load_dotenv
load_dotenv() # تحميل من ملف .env
EMAIL = os.getenv("EMAIL_ADDRESS")
PASSWORD = os.getenv("EMAIL_PASSWORD")
SMTP_SERVER = os.getenv("SMTP_SERVER", "smtp.gmail.com")
SMTP_PORT = int(os.getenv("SMTP_PORT", "587"))
وأنشئ ملف .env في مجلد المشروع:
EMAIL_ADDRESS=your_email@gmail.com
EMAIL_PASSWORD=your_app_password
SMTP_SERVER=smtp.gmail.com
SMTP_PORT=587
وأضف .env إلى ملف .gitignore حتى لا يُرفع لمستودع الكود.
مشروع تطبيقي: نظام تنبيهات بريدية متكامل
لنبني مشروعاً عملياً يجمع كل ما تعلمناه — نظام يراقب ملفاً ويرسل إشعاراً عند تعديله:
import smtplib
import os
import time
from email.mime.text import MIMEText
from datetime import datetime
class EmailNotifier:
def __init__(self, sender, password):
self.sender = sender
self.password = password
self.smtp_server = "smtp.gmail.com"
self.port = 587
def send_alert(self, receiver, subject, message):
msg = MIMEText(message, "plain", "utf-8")
msg["Subject"] = subject
msg["From"] = self.sender
msg["To"] = receiver
try:
with smtplib.SMTP(self.smtp_server, self.port) as server:
server.starttls()
server.login(self.sender, self.password)
server.sendmail(self.sender, receiver, msg.as_string())
return True
except Exception as e:
print(f"خطأ: {e}")
return False
def monitor_file(self, file_path, receiver, check_interval=60):
"""مراقبة ملف وإرسال تنبيه عند التعديل"""
last_modified = os.path.getmtime(file_path)
print(f"بدء مراقبة: {file_path}")
while True:
time.sleep(check_interval)
current_modified = os.path.getmtime(file_path)
if current_modified != last_modified:
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M")
alert_msg = f"تم تعديل الملف {file_path}\n"
alert_msg += f"الوقت: {timestamp}"
self.send_alert(
receiver,
f"تنبيه: تعديل في {os.path.basename(file_path)}",
alert_msg
)
last_modified = current_modified
print(f"تم إرسال تنبيه في {timestamp}")
# الاستخدام
notifier = EmailNotifier("your_email@gmail.com", "your_app_password")
notifier.monitor_file(
"/path/to/important_file.log",
"admin@company.com",
check_interval=30 # فحص كل 30 ثانية
)
أخطاء شائعة وحلولها
| الخطأ | السبب | الحل |
|---|---|---|
| SMTPAuthenticationError | كلمة مرور خاطئة أو حساب محظور | استخدم App Password وفعّل المصادقة الثنائية |
| SMTPConnectError | لا يمكن الاتصال بالخادم | تحقق من عنوان الخادم والمنفذ وجدار الحماية |
| SMTPRecipientsRefused | عنوان المستلم غير صالح | تحقق من صحة عنوان البريد الإلكتروني |
| UnicodeEncodeError | مشكلة في ترميز النص العربي | استخدم utf-8 في MIMEText |
نصائح متقدمة لأتمتة البريد
- استخدم قوالب Jinja2 لإنشاء رسائل HTML ديناميكية ومعقدة
- أضف التسجيل (logging) لتتبع كل رسالة مرسلة ومعرفة الأخطاء
- جدولة الإرسال باستخدام مكتبة schedule أو cron
- استخدم IMAP لقراءة الردود تلقائياً وبناء نظام متكامل
- اختبر محلياً باستخدام خادم SMTP تجريبي قبل الإرسال الفعلي
الخلاصة
تعلمنا في هذا المقال كيفية إرسال الإيميلات تلقائياً ببايثون باستخدام smtplib، بدءاً من الرسائل النصية البسيطة وصولاً لنظام تنبيهات متكامل. أتمتة البريد الإلكتروني تختصر عليك ساعات من العمل اليدوي وتضمن دقة واتساق رسائلك.
لاستكمال رحلتك في أتمتة بايثون:
تعليقات
إرسال تعليق