Utilidades y constantes
Lo que la gema define además del cliente.
Métodos de módulo
| Método | Qué es |
|---|---|
| OpenEmail.init, OpenEmail.client | Configura el cliente compartido una vez y luego accede a él desde cualquier sitio. Se construye solo a partir de OPENEMAIL_API_KEY si init nunca se ejecutó. |
| OpenEmail.emails, OpenEmail.threads y todos los demás espacios de nombres | Atajos a los espacios de nombres del cliente compartido. |
| OpenEmail.reset_client | Descarta el cliente compartido, para que la siguiente llamada construya uno nuevo, que es lo que necesita una prueba entre casos. |
| OpenEmail.create_client, OpenEmail::Client.new, OpenEmail.new | Un cliente aparte. create_client lee el entorno para todo lo que omitas, y Client.new (u OpenEmail.new) solo toma lo que le pasas. |
| OpenEmail.create_temp_mail | Un cliente de buzón desechable que no lleva ninguna clave de API. |
| OpenEmail.verify_webhook_signature | Comprueba la firma de una entrega en tiempo constante, con una ventana de repetición. Devuelve el evento analizado, y lanza OpenEmail::WebhookSignatureError ante cualquier fallo. |
| OpenEmail.to_base64 | Base64 para los bytes de un adjunto, a partir de una String binaria, un IO o un Pathname. |
| OpenEmail.api_key? | Si una String tiene la forma oe_live_ u oe_test_. Es una comprobación de forma, no una prueba de que la clave siga funcionando. |
| OpenEmail.access_token? | Si una String tiene la forma de un token de acceso OAuth: de 1 a 512 caracteres, sin empezar por oe_. |
| OpenEmail.sealed? | Si el cuerpo de un mensaje es texto cifrado. Es false para los dos formatos firmados, cuyos cuerpos llegaron en claro. |
| OpenEmail.resolve_language, OpenEmail.language_by_code, OpenEmail.rtl_language? | Las búsquedas que necesita un selector de idioma, sobre la tabla OpenEmail::LANGUAGES incluida. |
Constantes
Cada conjunto de valores que exporta el SDK de TypeScript es un Hash congelado en OpenEmail, con los mismos nombres como claves, así que OpenEmail::WEBHOOK_EVENTS[:EMAIL_DELIVERED] es "email.delivered". Usa .values donde necesites la lista, y .value? para comprobar un valor que vino de fuera.
events = OpenEmail::WEBHOOK_EVENTS.values scopes = [OpenEmail::API_SCOPES[:EMAILS_SEND], OpenEmail::API_SCOPES[:THREADS_READ]] puts events.size, scopes.join(","), OpenEmail::PAGE_LIMITS[:MAX_LIMIT]| Constante | Qué contiene |
|---|---|
| OpenEmail::VERSION | La versión de la gema. |
| OpenEmail::API_SCOPES | El vocabulario de ámbitos, para una pantalla de creación de claves. |
| OpenEmail::WEBHOOK_EVENTS, OpenEmail::WEBHOOK_SIGNATURE_HEADERS | Los eventos a los que se puede suscribir un endpoint, y los nombres de las cabeceras que lleva una entrega. |
| OpenEmail::ERROR_TYPES | El vocabulario de errores que toma ApiError#type. |
| OpenEmail::PAGE_LIMITS | El limit: máximo y el predeterminado en la mayoría de las listas paginadas: 100 y 25. Unas pocas listas admiten más, y la referencia de cada método lo indica. |
| OpenEmail::RULE_FIELDS, OpenEmail::RULE_OPERATORS, OpenEmail::RULE_ACTIONS | El vocabulario con el que se construyen las condiciones y las acciones de una regla. |
| OpenEmail::MESSAGE_ENCRYPTION_FORMATS | Los cinco sobres que puede nombrar la ingesta. Tres de ellos están sellados. |
| OpenEmail::CREDENTIAL_KINDS, OpenEmail::STEP_UP_METHODS, OpenEmail::STEP_UP_ERROR_CODES | Qué credencial describen me.get y me.ping, cómo se comprueba un código de verificación y los códigos con los que puede fallar una verificación. |
| OpenEmail::THREAD_SORTS, OpenEmail::PEOPLE_SORTS, OpenEmail::FILE_SORTS y los demás *_SORTS | Los órdenes en los que se puede ordenar una lista. |
| OpenEmail::FORM_STATUSES, OpenEmail::BROADCAST_STATUSES, OpenEmail::SUPPRESSION_REASONS y los demás conjuntos | Los valores que puede tomar un campo de un recurso. Cada conjunto se nombra según lo que contiene. |
Objetos
Una respuesta es el JSON analizado como un Hash con claves Symbol. La gema solo construye un objeto propio donde da forma a la respuesta, y cada uno es un Data inmutable.
| Clase | Lo que lleva |
|---|---|
| OpenEmail::Page | items, has_more? y next_cursor, de cada list paginado. |
| OpenEmail::PeoplePage | Lo mismo más seen, de contacts.list_people. |
| OpenEmail::TempMessagesPage | Lo mismo más expires_at, de temp_mail.list_messages. |
| OpenEmail::AddressBookPage, OpenEmail::AddressBook | unrestricted, addresses y domains, de addresses.list (con has_more? y next_cursor) y de addresses.list_all. |
| OpenEmail::BatchResult | items, sent y failed, de emails.send_batch. |
| OpenEmail::TemplateSends | items, total, page y page_size, de templates.list_sends. |
| OpenEmail::HttpRequest, OpenEmail::HttpResponse | Lo que recibe y devuelve un adapter:. Una solicitud imprime su cabecera Authorization como [redacted]. |
Todo error que la gema lanza a propósito hereda de OpenEmail::Error: ApiError y sus subclases, NetworkError y WebhookSignatureError. Un argumento incorrecto es en cambio un ArgumentError, porque es un error del código que llama y no algo que capturar.
Un endpoint que esto todavía no envuelve
Una versión de la gema nunca debería ser lo que te separa de un endpoint que ya funciona. client.raw.request recibe una ruta y opciones como argumentos nombrados y devuelve el cuerpo ya analizado, aplicando la credencial, la URL base, el tiempo de espera y la política de reintentos del cliente.
result = client.raw.request( "/something-new", method: :post, query: {dryRun: true}, body: {name: "Invoices"}, repeatable: true) p resultUn GET se reintenta como cualquier otra lectura. Cualquier otro método se envía una sola vez salvo que pases repeatable: true, que es tu afirmación de que puede enviarse dos veces. query: omite los valores nil o vacíos, y api_key: funciona igual que en todos los demás métodos.
Lo que deliberadamente no hace
- No valida ningún cuerpo de solicitud. El esquema del servidor es la única copia de las reglas, y una segunda copia aquí acabaría rechazando una dirección que un servidor más reciente acepta, en una versión que alguien fijó hace dos años.
- No tiene dependencias en tiempo de ejecución, ni siquiera una gema de JSON o de HTTP aparte de la biblioteca estándar.
- Solo cambia la forma de una respuesta de una manera: el array
datade una colección se saca de su sobre y se coloca en uno de los objetos de arriba. Cualquier otra respuesta vuelve tal como la envió la API, con las claves en camelCase de la API.
La comprobación de paridad de la gema mantiene esto honesto. Hace fallar la compilación cuando un método de TypeScript no tiene gemelo en Ruby, acepta opciones distintas o envía una solicitud distinta.