Ir a la documentación
SDK

Programar y cancelar

`scheduledAt`, `emails.reschedule` y `emails.cancel`.

Enviar más tarde

schedule.ts
await openemail.emails.send({ ...message, scheduledAt: 'PT1H' })await openemail.emails.send({ ...message, scheduledAt: new Date('2027-01-01T09:00:00Z') })await openemail.emails.send({ ...message, scheduledAt: '2027-01-01T09:00:00.000Z' })

Un Date, un instante ISO-8601 o una duración como PT1H / P2D. Hasta un año por delante, nunca en el pasado.

Mover y detener

reschedule.ts
const queued = await openemail.emails.send({ ...message, scheduledAt: 'PT1H' }) await openemail.emails.reschedule(queued.id, new Date(Date.now() + 86_400_000))await openemail.emails.cancel(queued.id)

Solo se pueden detener los mensajes en queued y scheduled; cualquier cosa más avanzada es un conflict_error, porque parte del mensaje ya está en el buzón de alguien. Cancelar un mensaje ya cancelado tiene éxito y no cambia nada.

Una ventana de deshacer en su lugar

undo-window.ts
await openemail.emails.send({ ...message, cancellableForSeconds: 30 })

Un mensaje programado ya se puede cancelar hasta que sale, así que no se pueden combinar ambos y el servidor lo rechaza. Usa este para una ventana de deshacer el envío en un mensaje inmediato.

Parámetros: programación

scheduledAtDate | string
Cuándo enviar, en `emails.send`: un `Date`, un instante ISO-8601 o una duración como `PT1H` o `P2D`, que el cliente convierte a una cadena para la red. Al menos un segundo en el futuro y como máximo 365 días por delante; superar cualquiera de los dos límites es un `validation_error` en `scheduledAt`. No se acepta lenguaje natural, porque interpretar mal «el próximo martes» envía un mensaje a una hora que ya no se puede retirar.
cancellableForSecondsnumber
Una ventana de deshacer el envío en un envío INMEDIATO: un integer de 0 a 900, con 0 por defecto. Cualquier valor superior a 0 se rechaza junto con `scheduledAt`, que ya se puede cancelar hasta que sale, y un mensaje retenido de este modo queda en `queued` y no en `scheduled`. Es el mismo mecanismo de aplazamiento con un retraso corto.
idstringobligatorio
El id `msg_…`, y el primer argumento tanto de `emails.cancel` como de `emails.reschedule`. Ambos necesitan `emails:send` en lugar de un scope propio, y ambos se resuelven dentro del espacio de trabajo de la propia clave, así que un id que pertenece a otro es un `not_found_error` exactamente igual que un id que nunca existió.
reschedule.scheduledAtDate | stringobligatorio
La nueva hora, como segundo argumento de `emails.reschedule`, analizada con las mismas reglas y contra la misma ventana de un año, y lo único que cambiará el `PATCH /emails/{id}` subyacente. Una duración es relativa al momento en que la lee el SERVIDOR, así que una reprogramación reintentada cae algo más tarde de lo que habría caído la primera: más tarde, nunca antes.

Respuesta: EmailResource

object'email'
Siempre `email`. Ambas llamadas responden con el mensaje completo en lugar de con un acuse de recibo, así que no hay que volver a pedir nada para ver qué cambió; `emails.send` devuelve esta misma forma más `replayed`.
idstring
El identificador `msg_…`. Estable durante toda la vida del mensaje y el id que aceptan todas las demás llamadas sobre él.
statusEmailStatus
`cancelled` tras una cancelación y `scheduled` tras una reprogramación, incluso para un mensaje que solo estaba en `queued` detrás de una ventana de deshacer, que una reprogramación convierte en una programación real. Solo se pueden mover o detener los mensajes en `queued` y `scheduled`; cualquier cosa más avanzada es un `conflict_error` con el código `email_not_cancellable`, porque parte del mensaje ya está en el buzón de alguien.
scheduledAtstring | null
El instante ISO en que está previsto despachar el mensaje. Se establece tanto para una ventana de deshacer como para un envío con `scheduledAt`, ya que ambos son un mismo mecanismo, y es null en un envío inmediato normal.
cancellableUntilstring | null
Cuándo deja de funcionar la cancelación, que es el mismo instante que `scheduledAt` en ambas rutas aplazadas. Null en un envío inmediato, que ya ha salido cuando la llamada retorna.
sentAtstring | null
Cuándo salió realmente el mensaje. Null mientras espera, y null para siempre en uno cancelado.
messageIdstring | null
El Message-ID de RFC 5322, null hasta que existe el MIME, así que siempre null en un mensaje sobre el que pueden actuar estas dos llamadas. No es algo con lo que dirigirse a la API, ni tampoco aquello con lo que vuelve un rebote posterior: el servicio de envío reescribe la cabecera a la salida.
threadIdstring | null
El hilo al que pertenece este mensaje, tomado de la solicitud y reescrito con lo que informe el transporte una vez enviado. Null cuando no es una respuesta.
transportEmailTransport | (string & {}) | null
Cómo salieron los bytes, y null hasta el despacho, así que null en todo mensaje que puedan devolver una cancelación o una reprogramación. Un envío en modo de prueba registra `test`, y la unión se mantiene abierta para que un transporte que este SDK aún no nombra no sea un cambio incompatible.
attemptsnumber
Cuántas veces el despacho ha reclamado esta fila. Lo incrementa la reclamación y no un envío correcto, y es 0 para todo lo que sigue esperando.
lastErrorstring | null
El último fallo registrado contra el mensaje, null mientras no haya fallado nada. Un envío aplazado cuyo trabajo no se pudo encolar se escribe aquí como `Could not schedule: …` y pasa a `failed`, que es la única forma en que un mensaje programado deja de poder cancelarse sin que nadie lo pida.
fromstring
La dirección con la que se autorizó que saliera el mensaje, almacenada escueta y en minúsculas. No siempre es la dirección que se pidió (una clave restringida que no nombra ningún `from` se resuelve a la primera dirección que puede usar), y aquí se descarta cualquier nombre visible, porque el filtro `from` de `emails.list` compara por igualdad.