在 AppEngine 上使用 MailGun Java
Using MailGun on AppEngine Java
我正在尝试获取在 AppEngine 上发送邮件所需的库。
文档 (https://cloud.google.com/appengine/docs/standard/java/mail/mailgun) 声明如果使用 Maven 则需要添加这些内容:
球衣核心
1.19.4
球衣客户端
1.19.4
球衣多部分
1.19.4
但是,添加它们会导致 Eclipse 中出现错误消息。
The type javax.ws.rs.ext.RuntimeDelegate$HeaderDelegate cannot be
resolved. It is indirectly referenced from required .class files
可以通过添加 javax.ws.rs-api-2.0.1 来解决,但是使用那个 jar 似乎有问题。
Appengine 抛出错误:
Caused by: java.lang.ExceptionInInitializerError
... 44 more
Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: org.glassfish.jersey.internal.RuntimeDelegateImpl
at com.sun.jersey.core.header.MediaTypes.<clinit>(MediaTypes.java:65)
... 62 more
Caused by: java.lang.ClassNotFoundException: org.glassfish.jersey.internal.RuntimeDelegateImpl
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at com.google.apphosting.runtime.ApplicationClassLoader.findClass(ApplicationClassLoader.java:45)
在这里的一个线程中,尽管据说可以通过删除 javax.ws.rs-api-2.0
来解决错误 org.glassfish.jersey.internal.RuntimeDelegateImpl NOT FOUND
其他建议包括使用 jersey2,但我认为这需要额外的配置,而 AppEngine 文档没有说明如何进行配置。
如何使用 Mailgun 在 Appengine 上发送邮件???
我使用 Jersey 2.27 (JAX-RS 2.1 / Jersey 2.26+) 解决了这个问题,可从 https://jersey.github.io/download.html
下载
我需要以下罐子:
hk2-api-2.5.0-b32.jar
hk2-locator-2.5.0-b42.jar
hk2-utils-2.5.0-b32.jar
javax.inject-1.jar
javax.inject-2.5.0-b42.jar
jersey-client.jar
jersey-common.jar
jersey-guava-2.26-b03.jar (from Jersey 2.25.1)
jersey-media-jaxb.jar
javax.ws.rs-api-2.1.jar
并修改 AppEngine 示例以使用 Jersey 2.26+,如下所示:
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Form;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature;
public static void sendSimpleMessage(String recipient) {
Client clientMail = ClientBuilder.newBuilder().build();
clientMail.register(HttpAuthenticationFeature.basic("api", MAILGUN_API_KEY));
WebTarget targetMail = clientMail.target("https://api.mailgun.net/v3/" + MAILGUN_DOMAIN_NAME + "/messages");
Form formData = new Form();
formData.param("from", "Mailgun Sandbox <"+DOMAIN_MAIL_ADDRESS+">");
formData.param("to", recipient);
formData.param("subject", "Simple Mailgun Example");
formData.param("text", "Plaintext content");
Response response = targetMail.request().post(Entity.entity(formData, MediaType.APPLICATION_FORM_URLENCODED_TYPE));
System.out.println("Mail sent : " + response);
}
MAILGUN_API_KEY 可从 MailGun 获得。 MAILGUN_DOMAIN_NAME 是我的自定义域,DOMAIN_MAIL_ADDRESS 是我希望发送的地址。
注意:我的类路径中也有 guava-gwt 和 gauva,所以也许是添加了 jersey-guava 才起作用。实际上,jersey-gauva 仅在 jaxrs-ri-2.25.1 中而不在 jaxrs-ri-2.27(JAX-RS 2.1 / Jersey 2.26+)中。不过确实需要它。
我正在尝试获取在 AppEngine 上发送邮件所需的库。
文档 (https://cloud.google.com/appengine/docs/standard/java/mail/mailgun) 声明如果使用 Maven 则需要添加这些内容:
球衣核心 1.19.4
球衣客户端 1.19.4
球衣多部分 1.19.4
但是,添加它们会导致 Eclipse 中出现错误消息。
The type javax.ws.rs.ext.RuntimeDelegate$HeaderDelegate cannot be resolved. It is indirectly referenced from required .class files
可以通过添加 javax.ws.rs-api-2.0.1 来解决,但是使用那个 jar 似乎有问题。
Appengine 抛出错误:
Caused by: java.lang.ExceptionInInitializerError
... 44 more
Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: org.glassfish.jersey.internal.RuntimeDelegateImpl
at com.sun.jersey.core.header.MediaTypes.<clinit>(MediaTypes.java:65)
... 62 more
Caused by: java.lang.ClassNotFoundException: org.glassfish.jersey.internal.RuntimeDelegateImpl
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at com.google.apphosting.runtime.ApplicationClassLoader.findClass(ApplicationClassLoader.java:45)
在这里的一个线程中,尽管据说可以通过删除 javax.ws.rs-api-2.0
来解决错误 org.glassfish.jersey.internal.RuntimeDelegateImpl NOT FOUND其他建议包括使用 jersey2,但我认为这需要额外的配置,而 AppEngine 文档没有说明如何进行配置。
如何使用 Mailgun 在 Appengine 上发送邮件???
我使用 Jersey 2.27 (JAX-RS 2.1 / Jersey 2.26+) 解决了这个问题,可从 https://jersey.github.io/download.html
下载我需要以下罐子:
hk2-api-2.5.0-b32.jar
hk2-locator-2.5.0-b42.jar
hk2-utils-2.5.0-b32.jar
javax.inject-1.jar
javax.inject-2.5.0-b42.jar
jersey-client.jar
jersey-common.jar
jersey-guava-2.26-b03.jar (from Jersey 2.25.1)
jersey-media-jaxb.jar
javax.ws.rs-api-2.1.jar
并修改 AppEngine 示例以使用 Jersey 2.26+,如下所示:
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Form;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature;
public static void sendSimpleMessage(String recipient) {
Client clientMail = ClientBuilder.newBuilder().build();
clientMail.register(HttpAuthenticationFeature.basic("api", MAILGUN_API_KEY));
WebTarget targetMail = clientMail.target("https://api.mailgun.net/v3/" + MAILGUN_DOMAIN_NAME + "/messages");
Form formData = new Form();
formData.param("from", "Mailgun Sandbox <"+DOMAIN_MAIL_ADDRESS+">");
formData.param("to", recipient);
formData.param("subject", "Simple Mailgun Example");
formData.param("text", "Plaintext content");
Response response = targetMail.request().post(Entity.entity(formData, MediaType.APPLICATION_FORM_URLENCODED_TYPE));
System.out.println("Mail sent : " + response);
}
MAILGUN_API_KEY 可从 MailGun 获得。 MAILGUN_DOMAIN_NAME 是我的自定义域,DOMAIN_MAIL_ADDRESS 是我希望发送的地址。
注意:我的类路径中也有 guava-gwt 和 gauva,所以也许是添加了 jersey-guava 才起作用。实际上,jersey-gauva 仅在 jaxrs-ri-2.25.1 中而不在 jaxrs-ri-2.27(JAX-RS 2.1 / Jersey 2.26+)中。不过确实需要它。