Spaces:
Running
Running
import imaplib | |
import email | |
import os | |
from dotenv import load_dotenv | |
from pathlib import Path | |
# تحميل المتغيرات من ملف .env | |
load_dotenv() | |
EMAIL = os.getenv("NOURA_EMAIL") | |
PASSWORD = os.getenv("NOURA_PASSWORD") | |
# مجلد حفظ المرفقات | |
ATTACHMENTS_DIR = Path("attachments") | |
ATTACHMENTS_DIR.mkdir(exist_ok=True) | |
class EmailChecker: | |
def __init__(self, server="imap.gmail.com", mailbox="inbox"): | |
self.server = server | |
self.mailbox = mailbox | |
self.connection = None | |
def connect(self): | |
try: | |
self.connection = imaplib.IMAP4_SSL(self.server) | |
self.connection.login(EMAIL, PASSWORD) | |
self.connection.select(self.mailbox) | |
except Exception as e: | |
raise ConnectionError(f"فشل الاتصال بالبريد: {e}") | |
def get_email_content(self, msg): | |
content = "" | |
for part in msg.walk(): | |
if part.get_content_type() == "text/plain" and not part.get("Content-Disposition"): | |
try: | |
content += part.get_payload(decode=True).decode(errors="ignore") | |
except: | |
continue | |
return content.strip() if content else "لا يوجد محتوى نصي متاح." | |
def save_attachments(self, msg): | |
saved_files = [] | |
for part in msg.walk(): | |
if part.get_content_disposition() == "attachment": | |
filename = part.get_filename() | |
if filename: | |
filepath = ATTACHMENTS_DIR / filename | |
with open(filepath, "wb") as f: | |
f.write(part.get_payload(decode=True)) | |
saved_files.append(str(filepath)) | |
return saved_files | |
def get_latest_email_info(self): | |
try: | |
status, messages = self.connection.search(None, "ALL") | |
ids = messages[0].split() | |
if not ids: | |
return {"status": "لا توجد رسائل"} | |
latest_id = ids[-1] | |
status, data = self.connection.fetch(latest_id, "(RFC822)") | |
msg = email.message_from_bytes(data[0][1]) | |
subject = msg["subject"] or "بدون عنوان" | |
content = self.get_email_content(msg) | |
attachments = self.save_attachments(msg) | |
return { | |
"status": "نجح", | |
"subject": subject, | |
"content": content, | |
"attachments": attachments if attachments else ["لا توجد مرفقات"] | |
} | |
except Exception as e: | |
return {"status": f"خطأ في جلب الرسائل: {e}"} | |
def close(self): | |
if self.connection: | |
try: | |
self.connection.logout() | |
except: | |
pass | |