2016-02-27 8 views
5

Das Ziel ist es, eine E-Mail mit Inline-Bild zu senden. Alles funktioniert gut, außer das Bild erscheint nicht in der E-Mail.Mailgun API: Senden von Inline-Bildern mit Spring's RestTemplate

Mein Ansatz basiert auf diesem Jersey-Beispiel von 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); 
} 

Allerdings muss ich Spring's RestTemplate verwenden. Diese

ist das, was ich bisher habe:

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); 

Der verbleibende Teil ist die *.png Datei in die Karte zu setzen. Ich bin mir nicht sicher, wie ich das machen soll. Habe versucht, alle seine Bytes über ServletContextResource # getInputStream zu lesen, aber ohne Erfolg: Bild erscheint nicht in der resultierenden E-Mail.

Fehle ich hier etwas?

Antwort

3

Dies stellte sich als ein Fall heraus, in dem alles korrekt eingerichtet war, aber nur ein kleines Detail verhinderte, dass es funktionierte.

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

Für Mailgun müssen Sie die Karte-key "inline" verwenden. Außerdem hat das ServletContextResource eine Methode getFilename(), die zum Auflösen gegen das Image-Tag verwendet wird. Daher sollte das Bild-Tag die folgende Inhalts-ID haben:

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