- AGENTS.md, SOUL.md, USER.md, IDENTITY.md - ANAF monitor (declarații fiscale) - Kanban board + Notes UI - Email tools - Memory system
102 lines
2.9 KiB
Python
102 lines
2.9 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
IMAP inbox checker for moltbot@romfast.ro
|
|
Returns unread emails as JSON
|
|
"""
|
|
|
|
import imaplib
|
|
import email
|
|
from email.header import decode_header
|
|
import json
|
|
import sys
|
|
from datetime import datetime
|
|
|
|
# IMAP Configuration
|
|
IMAP_SERVER = "mail.romfast.ro"
|
|
IMAP_PORT = 993
|
|
IMAP_USER = "moltbot@romfast.ro"
|
|
IMAP_PASS = "parola281234"
|
|
|
|
def decode_mime_header(header):
|
|
"""Decode MIME encoded header"""
|
|
if not header:
|
|
return ""
|
|
decoded = decode_header(header)
|
|
result = []
|
|
for part, encoding in decoded:
|
|
if isinstance(part, bytes):
|
|
result.append(part.decode(encoding or 'utf-8', errors='replace'))
|
|
else:
|
|
result.append(part)
|
|
return ''.join(result)
|
|
|
|
def get_email_body(msg):
|
|
"""Extract email body text"""
|
|
body = ""
|
|
if msg.is_multipart():
|
|
for part in msg.walk():
|
|
content_type = part.get_content_type()
|
|
if content_type == "text/plain":
|
|
try:
|
|
body = part.get_payload(decode=True).decode('utf-8', errors='replace')
|
|
break
|
|
except:
|
|
pass
|
|
else:
|
|
try:
|
|
body = msg.get_payload(decode=True).decode('utf-8', errors='replace')
|
|
except:
|
|
pass
|
|
return body[:2000] # Limit body length
|
|
|
|
def check_inbox(unread_only=True, limit=10):
|
|
"""Check inbox and return emails"""
|
|
try:
|
|
# Connect to IMAP
|
|
mail = imaplib.IMAP4_SSL(IMAP_SERVER, IMAP_PORT)
|
|
mail.login(IMAP_USER, IMAP_PASS)
|
|
mail.select("INBOX")
|
|
|
|
# Search for emails
|
|
criteria = "UNSEEN" if unread_only else "ALL"
|
|
status, messages = mail.search(None, criteria)
|
|
|
|
if status != "OK":
|
|
return {"ok": False, "error": "Search failed"}
|
|
|
|
email_ids = messages[0].split()
|
|
email_ids = email_ids[-limit:] # Get last N
|
|
|
|
emails = []
|
|
for eid in reversed(email_ids): # Newest first
|
|
status, msg_data = mail.fetch(eid, "(RFC822)")
|
|
if status != "OK":
|
|
continue
|
|
|
|
raw_email = msg_data[0][1]
|
|
msg = email.message_from_bytes(raw_email)
|
|
|
|
emails.append({
|
|
"id": eid.decode(),
|
|
"from": decode_mime_header(msg["From"]),
|
|
"subject": decode_mime_header(msg["Subject"]),
|
|
"date": msg["Date"],
|
|
"body_preview": get_email_body(msg)[:500]
|
|
})
|
|
|
|
mail.logout()
|
|
|
|
return {
|
|
"ok": True,
|
|
"unread_count": len(emails),
|
|
"emails": emails
|
|
}
|
|
|
|
except Exception as e:
|
|
return {"ok": False, "error": str(e)}
|
|
|
|
if __name__ == "__main__":
|
|
unread = "--all" not in sys.argv
|
|
result = check_inbox(unread_only=unread)
|
|
print(json.dumps(result, indent=2, ensure_ascii=False))
|