Extraction_validate / mailer /check_reply.py
Monike123's picture
Deploy DocVerify FastAPI backend (EasyOCR + Gemini 3 Flash)
0e39d80
Raw
History Blame Contribute Delete
1.99 kB
import imaplib
import email
from email.header import decode_header
from config import IMAP_HOST, IMAP_PASS, IMAP_USER, MOCK_REPLY
def check_reply_status(expected_from: str | None = None) -> str:
if MOCK_REPLY in ("confirmed", "denied", "no_reply"):
if MOCK_REPLY == "confirmed":
return "confirmed"
if MOCK_REPLY == "denied":
return "denied"
return "no_reply"
if not IMAP_HOST or not IMAP_USER:
return "no_reply"
try:
mail = imaplib.IMAP4_SSL(IMAP_HOST)
mail.login(IMAP_USER, IMAP_PASS)
mail.select("inbox")
_, messages = mail.search(None, "UNSEEN")
ids = messages[0].split()
for num in reversed(ids[-10:]):
_, data = mail.fetch(num, "(RFC822)")
msg = email.message_from_bytes(data[0][1])
subject = _decode(msg.get("Subject", ""))
body = _get_body(msg).lower()
if "yes" in body or "confirm" in subject.lower():
mail.logout()
return "confirmed"
if "no" in body or "deny" in subject.lower() or "not employed" in body:
mail.logout()
return "denied"
mail.logout()
except Exception:
pass
return "no_reply"
def _decode(value: str) -> str:
parts = decode_header(value)
out = []
for part, enc in parts:
if isinstance(part, bytes):
out.append(part.decode(enc or "utf-8", errors="ignore"))
else:
out.append(part)
return "".join(out)
def _get_body(msg) -> str:
if msg.is_multipart():
for part in msg.walk():
if part.get_content_type() == "text/plain":
payload = part.get_payload(decode=True)
if payload:
return payload.decode(errors="ignore")
else:
payload = msg.get_payload(decode=True)
if payload:
return payload.decode(errors="ignore")
return ""