Event Tech : Groovy, Mailgun & “Fiancé”

Il s'agit d'un billet technique écrit par notre cofondateur et ingénieur en chef, Andrew Garcia. Vous avez une idée pour un article technique ? Envoyez-nous un courriel à l'adresse suivante : [email protected]

Event Tech & Goodshuffle Pro

Chez Goodshuffle, nous avons construit toute notre plateforme en utilisant Grails (actuellement 3.3.1). De temps en temps, nous rencontrons des problèmes intéressants qui, nous l'espérons, pourront aider d'autres personnes à gagner du temps en les décrivant ici. À vrai dire, nous aurions dû commencer la partie technique de notre blog il y a longtemps ; le chemin a été long.

Mailgun & HttpBuilder

Comme je l'ai dit, nous utilisons Grails depuis un certain temps (il s'agit d'un ensemble cohérent autour de Spring, Hibernate, utilisant Groovy avec Java et fonctionnant sur la JVM). Nous avons rencontré un problème en utilisant HttpBuilder pour faire des appels API à Mailgun. Notre fonction était structurée pour passer et encoder des pièces jointes, ce qui nous a obligés à utiliser MultipartEntityBuilder pour spécifier les ‘parties’. Et, pour une raison quelconque, il a fallu beaucoup plus de temps qu'il n'aurait dû pour comprendre comment définir correctement l'encodage UTF-8.

Notre plateforme est conçue pour le secteur de la location d'événements, c'était donc un problème important. Une grande partie de la communication se fait entre les sociétés de location et les futurs mariés. Le mot “fiancé” est donc fréquemment utilisé, comme vous pouvez l'imaginer. Nous devions faire en sorte que les caractères spéciaux s'affichent correctement dans les messages envoyés par courrier électronique.

J'ai lu la documentation, j'ai vu que Mailgun utilisait l'encodage quoted-printable et j'ai disparu dans ce qui m'a semblé être un trou noir de confusion inutile. J'ai essayé de définir l'en-tête content-type dans un milliard d'endroits jusqu'à ce que je trouve/réalise où il était réellement nécessaire.

Quoi qu'il en soit, si vous avez tapé sur Google “UTF-8 encoding Mailgun, Httpbuilder” et que vous cherchez du code pour le faire, le voici. Assurez-vous de définir le charset lors de l'appel au constructeur 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("adding mime attachment name=" + attachment.name + ", fileSize=" + ((byte[]) attachment.contents).length) multipartRequestEntity.addPart('attachment', new ByteArrayBody((byte[]) attachment.contents, attachment.name))) } multipartRequest.entity = multipartRequestEntity.build() response.success = { resp, json -> log.info("Successfully sent e-mail to Mailgun for processing. resp.message=" + json.message + ", messageID=" + json.id + ", to_email=" + destinationEmail + ", conversationHash=" + conversationHash) } response.failure = { resp, jsonMap -> throw new RuntimeException("Error occurred while sending transactional e-mail to mailgun. title=" + title + ", source_email=" + sourceEmail + ", destinationEmail=" + destinationEmail) } return true } 
Image de l'auteur
Andrew Garcia

Andrew Garcia est un développeur chevronné et un expert en informatique. Il s'est consacré à la création et au développement de Goodshuffle Pro, un logiciel d'inventaire de location pour les entreprises d'événementiel.