763e06c127
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
3.9 KiB
3.9 KiB
name, kind, lang, domain, version, purity, signature, description, tags, params, output, uses_functions, uses_types, returns, returns_optional, error_type, imports, tested, tests, test_file_path, file_path
| name | kind | lang | domain | version | purity | signature | description | tags | params | output | uses_functions | uses_types | returns | returns_optional | error_type | imports | tested | tests | test_file_path | file_path | ||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| imap_search | function | py | infra | 1.0.0 | impure | def imap_search(conn, criteria: str = 'UNSEEN', mailbox: str = '') -> dict | Busca mensajes en un buzon IMAP por criterio y devuelve sus UIDs. Sobre una conexion imaplib viva (de imap_connect), opcionalmente hace select(mailbox) y luego conn.uid('SEARCH', None, criteria). Usa SIEMPRE UIDs (estables mientras no cambie UIDVALIDITY), no numeros de secuencia (que se renumeran al borrar). criteria es una expresion IMAP cruda RFC 3501 (UNSEEN, ALL, FROM x, SUBJECT y, SINCE 01-Jan-2026, combinaciones). Devuelve {status:'ok', uids:[int], count} o {status:'error', error}. Nunca lanza. |
|
|
dict de estado. En exito {status:'ok', uids: list[int], count: int}: uids son UIDs (no numeros de secuencia), ordenados como los devuelve el servidor; lista vacia si nada casa (sigue siendo status ok). En fallo (conn None, criteria vacio o mal formado, buzon inexistente) {status:'error', error: str}. | false | error_py_core | false | python/functions/infra/imap_search.py |
Ejemplo
import sys, os
sys.path.insert(0, os.path.join("python", "functions"))
from infra import imap_connect, imap_search, imap_fetch_message
c = imap_connect("imap.gmail.com", 993, "gutierenmanuel15@gmail.com", "abcd efgh ijkl mnop")
conn = c["conn"]
# No leidos del INBOX (buzon ya seleccionado por imap_connect)
res = imap_search(conn, criteria="UNSEEN")
print(res["status"], res["count"]) # "ok" 7
print(res["uids"]) # [1422, 1425, 1431, ...]
# Buscar en otra carpeta sin reconectar
sent = imap_search(conn, criteria="SINCE 01-Jun-2026", mailbox="[Gmail]/Sent Mail")
# Fetch del primer UID encontrado
if res["uids"]:
msg = imap_fetch_message(conn, res["uids"][0])
print(msg["message"]["subject"])
conn.logout()
Cuando usarla
Usala tras imap_connect cuando necesites localizar mensajes por criterio
(no leidos, de un remitente, por asunto, por fecha) antes de leerlos con
imap_fetch_message. Es el paso intermedio del flujo lectura: connect -> search
-> fetch. Para barrer una carpeta distinta del INBOX pasa mailbox y evita
una reconexion.
Gotchas
- Funcion impura: hace red sobre el
connvivo. Nunca lanza: compruebastatus. Elconnlo proveeimap_connect(no resuelve credenciales). - Devuelve UIDs, NO numeros de secuencia. Importante: guarda y reutiliza los
UIDs; los seq cambian cuando se borran mensajes, los UIDs no (salvo cambio de
UIDVALIDITY del buzon, raro).
imap_fetch_messagetambien espera UID. - El
criteriaes sintaxis IMAP cruda, sin validar: un criterio mal formado hace que el servidor responda no-OK y devuelvestatus:'error'. Las fechas van en formato IMAPDD-Mon-YYYY(ej.01-Jan-2026), no ISO. SEARCHpor defecto opera sobre US-ASCII; para acentos enSUBJECT/FROMalgunos servidores requierenCHARSET UTF-8(este wrapper pasaNonecomo charset, que cubre el caso comun). Si necesitas charset, busca por cabeceras ASCII o filtra el resultado en cliente.- Una busqueda sin coincidencias devuelve
status:'ok'conuids:[]ycount:0— distingue "sin resultados" mirandocount, nostatus. - Cierra con
conn.logout()al terminar (responsabilidad del caller).