在 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+)中。不过确实需要它。