Esta es una publicación sobre tecnología para eventos escrita por nuestro cofundador e ingeniero jefe, Andrew García. ¿Tienes alguna idea para una publicación sobre tecnología? Envíanos un correo electrónico a: [email protected]
Tecnología para eventos y Goodshuffle Pro
En Goodshuffle hemos desarrollado toda nuestra plataforma utilizando Grails (actualmente la versión 3.3.1). De vez en cuando nos encontramos con problemas interesantes y esperamos que, al compartirlos aquí, podamos ayudar a otros a ahorrar un montón de tiempo. A decir verdad, deberíamos haber empezado la sección técnica de nuestro blog hace mucho tiempo; ha sido un largo camino.
Mailgun y HttpBuilder
Como dije, llevamos un tiempo trabajando con Grails (es un paquete bien organizado que combina Spring e Hibernate, y utiliza Groovy junto con Java, y que se ejecuta en la JVM). Nos encontramos con un problema al usar HttpBuilder para hacer llamadas de API a Mailgun. Nuestra función estaba estructurada para pasar y codificar archivos adjuntos, lo que nos obligó a usar MultipartEntityBuilder para especificar las ‘partes’. Y, por alguna razón, nos tomó mucho más tiempo del que debería haber tomado averiguar cómo configurar correctamente la codificación UTF-8.
Nuestra plataforma está diseñada para el sector del alquiler de material para eventos, por lo que esto suponía un gran problema. Gran parte de la comunicación se produce entre las empresas de alquiler y los novios. Por lo tanto, como te puedes imaginar, la palabra “prometido” se utiliza con frecuencia. Necesitábamos que los caracteres especiales se mostraran correctamente en los mensajes que llegaban por correo electrónico.
Leí la documentación, vi que Mailgun usaba la codificación «quoted-printable» y me sumergí en lo que me pareció un innecesario agujero negro de confusión. Intenté configurar el encabezado «Content-Type» en un sinfín de lugares hasta que descubrí y me di cuenta de dónde era realmente necesario.
En fin, si has buscado en Google “codificación UTF-8 Mailgun, Httpbuilder” y estás buscando código sobre cómo hacerlo, aquí lo tienes. Asegúrate de configurar el juego de caracteres en la llamada al constructor de StringBody.
HTTPBuilder http = new HTTPBuilder("https://api.mailgun.net")http.request(Method.POST) { multipartRequest ->
uri.path = "/v3/" + mailGunDomain + "/messages"
headers["Authorization"] = "Basic " + ("api:" + System.env.MAILGUN_SECRET_API_KEY).bytes.encodeBase64().toString() MultipartEntityBuilder multipartRequestEntity = MultipartEntityBuilder.create() multipartRequestEntity.addPart('from', new StringBody(sourceEmailAddress)) multipartRequestEntity.addPart('to', new StringBody(destinationEmail)) multipartRequestEntity.addPart('h:Reply-To', new StringBody(replyToEmail)) multipartRequestEntity.addPart('subject', new StringBody(title)) multipartRequestEntity.addPart('html', new StringBody(content, org.apache.http.entity.ContentType.TEXT_HTML.withCharset('UTF-8'))) attachments?.each { Map attachment -> log.info("agregando archivo adjunto MIME nombre=" + attachment.name + ", tamaño del archivo=" + ((byte[]) attachment.contents).length) multipartRequestEntity.addPart('attachment', new ByteArrayBody((byte[]) attachment.contents, attachment.name)) } multipartRequest.entity = multipartRequestEntity.build() response.success = { resp, json -> log.info("Correo electrónico enviado correctamente a Mailgun para su procesamiento. resp.message=" + json.message + ", messageID=" + json.id + ", to_email=" + destinationEmail + ", conversationHash=" + conversationHash) } response.failure = { resp, jsonMap -> throw new RuntimeException("Se produjo un error al enviar el correo electrónico transaccional a Mailgun. title=" + title + ", source_email=" + sourceEmail + ", destinationEmail=" + destinationEmail) } return true }