java - Mailgun Java API 发送 HTML 电子邮件
问题描述
我正在尝试
"html": "... entire contents of HTML page goes here ..."
使用 Unirest HTTP 与 MailGun API 通信来获取 Java。
到目前为止,我已经验证了我的域,通过 API 成功发送了一封电子邮件,并通过 Java 中的 API 成功发送了一封 HTML(基本)电子邮件。每当我尝试使用任何电子邮件模板时,我都无法发送电子邮件(通过 API,Java)。我试图使用这里推荐的电子邮件模板:https ://github.com/mailgun/transactional-email-templates/tree/master/templates 。
我发送电子邮件的代码与文档一致
public static JsonNode sendSimpleMessage() throws UnirestException {
HttpResponse<com.mashape.unirest.http.JsonNode> request = Unirest.post("https://api.mailgun.net/v3/sub.domain.com" + "/messages")
.basicAuth("api", API_KEY)
.queryString("from", "name <test@domain.com>")
.queryString("to", "myemail@gmail.com")
.queryString("subject", "Great")
.queryString("html", returnEmail())
.asJson();
return request.getBody();
}
public static String returnEmail() {
try {
return StreamUtils.copyToString(new ClassPathResource("email.html").getInputStream(), Charset.defaultCharset());
} catch (IOException e) {
e.printStackTrace();
}
return "<html><strong>not today</strong></html>";
}
email.html 包含来自上述电子邮件(https://github.com/mailgun/transactional-email-templates/tree/master/templates)或任何 HTML 电子邮件的示例,因为它们都不起作用。
我得到的错误是:
com.mashape.unirest.http.exceptions.UnirestException: java.lang.RuntimeException: java.lang.RuntimeException: org.json.JSONException: A JSONArray text must start with '[' at 1 [character 2 line 1].
堆栈跟踪:
com.mashape.unirest.http.exceptions.UnirestException: java.lang.RuntimeException: java.lang.RuntimeException: org.json.JSONException: A JSONArray text must start with '[' at 1 [character 2 line 1]
at com.mashape.unirest.http.HttpClientHelper.request(HttpClientHelper.java:143)
at com.mashape.unirest.request.BaseRequest.asJson(BaseRequest.java:68)
at com..application.ApplicationController.sendSimpleMessage(ApplicationController.java:78)
at com.application.ApplicationController.create(ApplicationController.java:61)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:105)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.RuntimeException: java.lang.RuntimeException: org.json.JSONException: A JSONArray text must start with '[' at 1 [character 2 line 1]
at com.mashape.unirest.http.HttpResponse.<init>(HttpResponse.java:106)
at com.mashape.unirest.http.HttpClientHelper.request(HttpClientHelper.java:139)
... 57 more
Caused by: java.lang.RuntimeException: org.json.JSONException: A JSONArray text must start with '[' at 1 [character 2 line 1]
at com.mashape.unirest.http.JsonNode.<init>(JsonNode.java:51)
at com.mashape.unirest.http.HttpResponse.<init>(HttpResponse.java:95)
... 58 more
Caused by: org.json.JSONException: A JSONArray text must start with '[' at 1 [character 2 line 1]
at org.json.JSONTokener.syntaxError(JSONTokener.java:433)
at org.json.JSONArray.<init>(JSONArray.java:105)
at org.json.JSONArray.<init>(JSONArray.java:144)
at com.mashape.unirest.http.JsonNode.<init>(JsonNode.java:48)
... 59 more
如果我只是将所有 HTML 粘贴为字符串而不是 returnEmail(),我也会得到同样的错误。如果我在发送前转义特殊字符和/或缩小 HTML,我也会收到相同的错误消息。
现在我假设 Unirest 是一个 http 库,它从 queryString 键和值构建 JSON。虽然它似乎可以与简单的 html 一起使用,例如“HTML 版本” ,但它肯定不喜欢任何冗长/“普通”的 html,例如电子邮件模板。
您能否建议任何使用 Java API 的 html 电子邮件的工作示例或有关如何发送 html 并拥有有效 json 的任何提示?
万分感谢
解决方案
从报告的错误消息中:
org.json.JSONException: A JSONArray text must start with '[' at 1 [character 2 line 1].
我不确定 Unirest 正在尝试做什么,但它似乎正在尝试将某些内容编码为 JSON。但是 Mailgun API 不需要 JSON 编码,你可以使用良好的旧application/x-www-form-urlencoded
编码。检查 Unirest 文档,看看您是否可以强制使用其他编码类型。
或者,您可以使用问题评论中所述的其他库(免责声明:我是开发人员)。OP 抱怨这里提到的复杂 html 不起作用。我的意思是内容帮助器机制,您可以在其中使用链式方法调用(DSL 样式)构建 HTML 内容。如果您已经拥有 HTML,则只需将其传递给html()
方法调用,如注释中所述。
你的代码看起来有点像这样:
// somewhere else
Configuration configuration = new Configuration()
.domain("sub.domain.com")
.apiKey(API_KEY)
.from("name", "test@domain.com");
public static void sendSimpleMessage() {
Mail.using(configuration)
.to("myemail@gmail.com")
.subject("Great")
.html(returnEmail())
.build()
.send();
}
推荐阅读
- javascript - React Navigation 如何传递到 Tab navigator form Login Screen?
- typescript - VSCode 只能附加到电子中的 devtools 背景页面
- python - 在python中使用特定顺序对元素进行排序
- php - 如何在 Symfony 中创建呼叫计数器?
- windows - 如何在 power shell start-process 命令的参数列表中引用变量?
- oracle12c - 无法增加 sga_max_size。此系统错误不支持 MEMORY_TARGET
- java - 如何检查 JSON 响应是否返回 [ ] 或使用 Java 的正文响应?
- c++ - 使用变量与使用数字
- azure - 状态码 404:您要查找的资源已被删除、名称已更改或暂时不可用
- mysql - 将 Mysql 查询转换为弹性搜索