🎯 أهداف الدرس:
- قراءة ملف Excel وعرضه داخل صفحة HTML بشكل منسق.
- إرسال رسالة تأكيد عبر البريد الإلكتروني بعد الاشتراك.
- تنظيم الكود في Flask بطريقة احترافية أكثر.
⚙️ الخطوة 1: تثبيت المتطلبات
قبل البدء، تأكد من تثبيت المكتبتين التاليتين:
pip install openpyxl flask-mail
🧠 الخطوة 2: إعداد ملف التطبيق app.py
from flask import Flask, render_template, request
from openpyxl import Workbook, load_workbook
from flask_mail import Mail, Message
import os
app = Flask(__name__)
# إعداد البريد الإلكتروني
app.config['MAIL_SERVER'] = 'smtp.gmail.com'
app.config['MAIL_PORT'] = 587
app.config['MAIL_USE_TLS'] = True
app.config['MAIL_USERNAME'] = 'YOUR_EMAIL@gmail.com' # ضع بريدك هنا
app.config['MAIL_PASSWORD'] = 'YOUR_APP_PASSWORD' # استخدم App Password من إعدادات جوجل
mail = Mail(app)
EXCEL_FILE = "subscribers.xlsx"
# إنشاء ملف Excel إن لم يكن موجودًا
def create_excel_file():
if not os.path.exists(EXCEL_FILE):
wb = Workbook()
ws = wb.active
ws.title = "Subscribers"
ws.append(["الاسم", "البريد الإلكتروني"])
wb.save(EXCEL_FILE)
create_excel_file()
@app.route('/')
def home():
return """
<h1>مرحبًا بك في موقع Flask التجريبي!</h1>
<p><a href='/subscribe'>الاشتراك في النشرة البريدية</a></p>
<p><a href='/subscribers'>عرض المشتركين</a></p>
"""
@app.route('/subscribe', methods=['GET', 'POST'])
def subscribe():
if request.method == 'POST':
name = request.form['name']
email = request.form['email']
# حفظ البيانات في Excel
wb = load_workbook(EXCEL_FILE)
ws = wb.active
ws.append([name, email])
wb.save(EXCEL_FILE)
# إرسال رسالة تأكيد للمشترك
try:
msg = Message("تأكيد الاشتراك في النشرة البريدية",
sender=app.config['MAIL_USERNAME'],
recipients=[email])
msg.body = f"مرحبًا {name}!\n\nشكرًا لاشتراكك في نشرتنا البريدية. سنبقيك على اطلاع بكل جديد."
mail.send(msg)
status = f"✅ تم إرسال رسالة تأكيد إلى {email}"
except Exception as e:
status = f"⚠️ حدث خطأ أثناء إرسال البريد: {e}"
return f"""
<h2>شكرًا لك {name} على الاشتراك!</h2>
<p>{status}</p>
<a href='/'>عودة إلى الصفحة الرئيسية</a>
"""
return render_template('subscribe.html')
# صفحة عرض المشتركين
@app.route('/subscribers')
def show_subscribers():
wb = load_workbook(EXCEL_FILE)
ws = wb.active
data = list(ws.values)
headers = data[0]
rows = data[1:]
return render_template('subscribers.html', headers=headers, rows=rows)
if __name__ == '__main__':
app.run(debug=True)
🧾 الخطوة 3: صفحة عرض المشتركين templates/subscribers.html
<!DOCTYPE html>
<html lang="ar">
<head>
<meta charset="UTF-8">
<title>قائمة المشتركين</title>
<style>
table {
border-collapse: collapse;
width: 60%;
margin: 30px auto;
text-align: center;
}
th, td {
border: 1px solid #666;
padding: 8px;
}
th {
background-color: #ddd;
}
h1 {
text-align: center;
}
</style>
</head>
<body>
<h1>قائمة المشتركين في النشرة البريدية</h1>
<table>
<tr>
{% for header in headers %}
<th>{{ header }}</th>
{% endfor %}
</tr>
{% for row in rows %}
<tr>
{% for cell in row %}
<td>{{ cell }}</td>
{% endfor %}
</tr>
{% endfor %}
</table>
</body>
</html>
✉️ ملاحظات حول البريد الإلكتروني:
- يجب تفعيل App Passwords في حساب Gmail حتى تتمكن من الإرسال بأمان.
اذهب إلى:
🔗 https://myaccount.google.com/apppasswords
ثم أنشئ كلمة مرور للتطبيق وضعها في:
app.config['MAIL_PASSWORD'] = 'كلمة_المرور_الخاصة_بالتطبيق'
- لا تستخدم كلمة مرور الحساب العادية مطلقًا ⚠️
✅ النتيجة النهائية:
-
عند التسجيل في
/subscribe
يتم حفظ بيانات المشترك في Excel. - تُرسل رسالة تأكيد إلى بريده الإلكتروني.
- يمكن عرض جميع المشتركين في
/subscribers
بجدول منسق.