Initial commit - workspace setup
- AGENTS.md, SOUL.md, USER.md, IDENTITY.md - ANAF monitor (declarații fiscale) - Kanban board + Notes UI - Email tools - Memory system
This commit is contained in:
101
tools/email_check.py
Normal file
101
tools/email_check.py
Normal file
@@ -0,0 +1,101 @@
|
||||
#!/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))
|
||||
Reference in New Issue
Block a user