2016-02-27 35 views
5

L'obiettivo è inviare un'e-mail con l'immagine incorporata. Tutto funziona bene, tranne che l'immagine non appare nell'e-mail.API Mailgun: invio dell'immagine in linea con RestTemplate di Spring

Il mio approccio si basa su questo esempio di Jersey di Mailgun's User Guide.

public static ClientResponse SendInlineImage() { 
    Client client = Client.create(); 
    client.addFilter(new HTTPBasicAuthFilter("api", 
        "YOUR_API_KEY")); 
    WebResource webResource = 
      client.resource("https://api.mailgun.net/v3/YOUR_DOMAIN_NAME" + 
          "/messages"); 
    FormDataMultiPart form = new FormDataMultiPart(); 
    form.field("from", "Excited User <[email protected]_DOMAIN_NAME>"); 
    form.field("to", "[email protected]"); 
    form.field("subject", "Hello"); 
    form.field("text", "Testing some Mailgun awesomness!"); 
    form.field("html", "<html>Inline image here: <img src=\"cid:test.jpg\"></html>"); 
    File jpgFile = new File("files/test.jpg"); 
    form.bodyPart(new FileDataBodyPart("inline",jpgFile, 
        MediaType.APPLICATION_OCTET_STREAM_TYPE)); 
    return webResource.type(MediaType.MULTIPART_FORM_DATA_TYPE). 
      post(ClientResponse.class, form); 
} 

Tuttavia, ho bisogno di utilizzare Spring's RestTemplate.

Questo è quello che ho finora:

RestTemplate template = new RestTemplate(); 

MultiValueMap<String, Object> map = new LinkedMultiValueMap<>(); 
// ... put all strings in map (from, to, subject, html) 

HttpHeaders headers = new HttpHeaders(); 
// ... put auth credentials on header, and content type multipart/form-data 

template.exchange(MAILGUN_API_BASE_URL + "/messages", HttpMethod.POST, 
     new HttpEntity<>(map, headers), String.class); 

La restante parte è quello di mettere il file *.png nella mappa. Non sei sicuro di come farlo. Ho provato a leggere tutti i suoi byte tramite ServletContextResource # getInputStream, ma senza successo: l'immagine non viene visualizzata nella e-mail risultante.

Mi manca qualcosa qui?

risposta

3

Questo si è rivelato essere un caso in cui tutto è stato impostato correttamente, ma solo un piccolo dettaglio gli ha impedito di funzionare.

map.add("inline", new ServletContextResource(this.servletContext, 
    "/resources/images/email-banner.png")); 

Per Mailgun è necessario utilizzare il tasto della mappa "in linea". Inoltre, lo ServletContextResource ha un metodo getFilename(), che viene utilizzato per risolvere il tag immagine. Pertanto, il tag immagine dovrebbe avere il seguente ID di contenuto:

<img src="cid:email-banner.png"/>