Root cause: parsedate_to_datetime preserves local timezone (e.g., +0800) but strftime strips it, producing local time string (17:00) compared against UTC cursor (09:00). Local > UTC → same email never filtered. Fix: convert received_dt to UTC via astimezone(timezone.utc) before formatting to ISO string for comparison. Verified: job log changed from sent=1 (every run) to sent=0 (no new mail). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>