Mailgun API:使用 Spring 的 RestTemplate 发送内联图像
Mailgun API: Sending Inline Image with Spring's RestTemplate
目标是发送带有内联图像的电子邮件。一切正常,除了图像没有出现在电子邮件中。
我的方法基于 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 <YOU@YOUR_DOMAIN_NAME>");
form.field("to", "baz@example.com");
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);
}
但是,我需要使用 Spring 的 RestTemplate。
这是我目前得到的:
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);
剩下的部分就是将*.png
文件放入地图中。不知道该怎么做。已尝试通过 ServletContextResource#getInputStream 读取其所有字节,但没有成功:图像未出现在生成的电子邮件中。
我是不是漏掉了什么?
事实证明这是一个所有设置都正确的案例,但只有一个小细节导致它无法正常工作。
map.add("inline", new ServletContextResource(this.servletContext,
"/resources/images/email-banner.png"));
对于 Mailgun,您需要使用映射键 "inline"。此外,ServletContextResource
有一个方法 getFilename()
,用于解析图像标签。因此,图片标签应具有以下内容 ID:
<img src="cid:email-banner.png"/>
目标是发送带有内联图像的电子邮件。一切正常,除了图像没有出现在电子邮件中。
我的方法基于 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 <YOU@YOUR_DOMAIN_NAME>");
form.field("to", "baz@example.com");
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);
}
但是,我需要使用 Spring 的 RestTemplate。
这是我目前得到的:
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);
剩下的部分就是将*.png
文件放入地图中。不知道该怎么做。已尝试通过 ServletContextResource#getInputStream 读取其所有字节,但没有成功:图像未出现在生成的电子邮件中。
我是不是漏掉了什么?
事实证明这是一个所有设置都正确的案例,但只有一个小细节导致它无法正常工作。
map.add("inline", new ServletContextResource(this.servletContext,
"/resources/images/email-banner.png"));
对于 Mailgun,您需要使用映射键 "inline"。此外,ServletContextResource
有一个方法 getFilename()
,用于解析图像标签。因此,图片标签应具有以下内容 ID:
<img src="cid:email-banner.png"/>