TInstinct
source/classes/tinstinct.prg
Prototipo de transporte por correo para que una aplicación hable con el Instinct de su propio usuario. No es una API oficial. Necesita un receptor configurado por separado; enviar correo no autoriza acciones.
Configuración
cFrom: Remitente de la aplicación.cToken: Secreto compartido acordado por un medio seguro; no lo escribas en el código.cTo: Dirección del asistente del usuario. Pregúntale cuál es su dirección; no hay destino por defecto.
Solo admite un relay local (127.0.0.1 o localhost). El salto externo debe usar TLS y validar certificados. Los puertos por defecto son SMTP 25 y POP 110; pueden cambiarse con nSmtpPort y nPopPort. Configura cPopUser/cPopPassword para un buzón dedicado de respuestas.
Ejemplos
oInstinct := TInstinct():New( cFrom, cToken, cTo )
if oInstinct:Send( "Hello Instinct" )
cAnswer := oInstinct:Answer( 10 )
endif
// Register once, then call Pump() from the application's timer:
oInstinct:OnAnswer( {| cText, cId | MsgInfo( cText, cId ) } )
oInstinct:Pump()
Answer() espera y bloquea. OnAnswer() registra el bloque; Pump() sondea una vez desde un timer, pero la conexión puede ocupar hasta nTimeout. No crea un hilo en segundo plano.
samples/instinct/tinstinct.prg: INSTINCT_FROM, INSTINCT_TOKEN, INSTINCT_TO, INSTINCT_POP_USER, INSTINCT_POP_PASSWORD.
Estado y límites
cError: último error.cLog: registro de actividad.SaveLog( cFile ): guarda el registro.Send( cText, cId ): .T. significa aceptación del relay, no entrega. No reintentes a ciegas tras un timeout final.ParseReply( cRaw, cExpectedId ): valida MIME simple text/plain, JSON completo y tipos id/text. El análisis no autentica al remitente.PollOnce( nLimit ): respuestas nuevas, hasta 20 mensajes por defecto (1..100). El estado UIDL se guarda encUidlFile; no se borra correo. Archiva el correo tratado en el buzón dedicado.nMaxBytes: 1048576.nTimeout: 5000 ms.Answer( nSeconds, cId ): 1..3600 segundos, por defecto 30.
El límite cuenta mensajes no tratados, no las primeras posiciones del buzón: los UIDL ya vistos se saltan y las llamadas siguientes avanzan al resto. Answer() conserva respuestas de otros IDs en aPending para otro Answer() o Pump(). Esa cola vive en la instancia; usa una sola instancia por buzón y consúmela antes de cerrarla. El buzón conserva los correos: archiva los tratados para evitar sondeos largos.