【问题标题】:Java Google App Engine won't send email via Mailgun SMTPJava Google App Engine 不会通过 Mailgun SMTP 发送电子邮件
【发布时间】:2020-02-26 09:32:59
【问题描述】:

我已完成教程并在端口 2525 上为入口和出口设置 GCP 防火墙。在我的机器上本地运行代码成功发送电子邮件但是,将项目部署到 App Engine Standard(Java 运行时)确实不抛出错误但也不发送电子邮件。

我还有一个 GCP VM 实例也可以发送电子邮件。有谁知道是什么原因造成的?

依赖关系: Dependencies

    String email = "target@email.com";
    String API_KEY = "KEY";

    HttpResponse<JsonNode> req = Unirest.post("https://api.mailgun.net/v3/" + "my.custom.domain" + "/messages")
            .basicAuth("api", API_KEY)
            .field("from","Admin <admin@my.custom.domain>")
            .field("to", email)
            .field("subject","Welcome!")
            .field("text", "testing")
            .asJson();
    req.getBody();

抛出: Exception in thread "main" java.lang.ExceptionInInitializerError at tech.incineratez.email.Main.main(Main.java:14) Caused by: kong.unirest.UnirestException: It looks like you are using an older version of Apache Http Client. For security and performance reasons Unirest requires the most recent version. Please upgrade. at kong.unirest.Config.setDefaults(Config.java:109) at kong.unirest.Config.<init>(Config.java:85) at kong.unirest.Unirest.<clinit>(Unirest.java:30) ... 1 more Caused by: java.lang.BootstrapMethodError: java.lang.IllegalAccessError: no such constructor: kong.unirest.apache.ApacheAsyncClient.<init> (Config)void/newInvokeSpecial at kong.unirest.Config.setDefaults(Config.java:106) ... 3 more Caused by: java.lang.IllegalAccessError: no such constructor: kong.unirest.apache.ApacheAsyncClient.<init>(Config)void/newInvokeSpecial at java.lang.invoke.MethodHandleNatives.linkMethodHandleConstant(MethodHandleNatives.java:483) ... 4 more Caused by: java.lang.NoClassDefFoundError: org/apache/http/nio/reactor/ConnectingIOReactor at java.lang.invoke.MethodHandleNatives.resolve(Native Method) at java.lang.invoke.MemberName$Factory.resolve(MemberName.java:975) at java.lang.invoke.MemberName$Factory.resolveOrFail(MemberName.java:1000) at java.lang.invoke.MethodHandles$Lookup.resolveOrFail(MethodHandles.java:1394) at java.lang.invoke.MethodHandles$Lookup.linkMethodHandleConstant(MethodHandles.java:1750) at java.lang.invoke.MethodHandleNatives.linkMethodHandleConstant(MethodHandleNatives.java:477) ... 4 more Caused by: java.lang.ClassNotFoundException: org.apache.http.nio.reactor.ConnectingIOReactor at java.net.URLClassLoader.findClass(URLClassLoader.java:382) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 10 more

如果在我的计算机上而不是在 Google Cloud Platform 上单独运行,则工作代码:

                Properties props = System.getProperties();
                props.put("mail.smtps.host", "smtp.mailgun.org");
                props.put("mail.smtps.auth", "true");
                props.put("mail.smtps.port", "2525");

                Session session = Session.getInstance(props, null);
                Message msg = new MimeMessage(session);
                msg.setFrom(new InternetAddress("admin@my.custom.domain"));

                InternetAddress[] addrs = InternetAddress.parse(email, false);
                msg.setRecipients(Message.RecipientType.TO, addrs);

                msg.setSubject("Welcome!");
                msg.setText("Test");
                msg.setSentDate(new Date());

                SMTPTransport t = (SMTPTransport) session.getTransport("smtps");
                t.connect("smtp.mailgun.org", "postmaster@my.custom.domain", "KEY");
                t.sendMessage(msg, msg.getAllRecipients());

                System.out.println("Email sent" + t.getLastServerResponse());

                t.close();

依赖:Dependencies2

上面的代码在谷歌云平台上运行时什么都不做。

【问题讨论】:

  • 您应该使用 Mailgun 的 REST API 而不是尝试通过 SMTP 发送
  • 我开始尝试使用他们的 API,结果导致数小时的调试错误并获得他们的依赖项所需的依赖项,但最终没有用。
  • 好的,他们的 REST API确实工作,所以如果你打算使用 Mailgun,那么值得弄清楚。
  • 我刚刚尝试使用他们的 API,确保所有依赖项都是最新的,但它向我抛出了:Caused by: kong.unirest.UnirestException: It looks like you are using an older version of Apache Http Client. For security and performance reasons Unirest requires the most recent version. Please upgrade. at kong.unirest.Config.setDefaults(Config.java:109) 和更多错误

标签: java google-app-engine google-cloud-platform smtp mailgun


【解决方案1】:

我猜您正在谈论 this tutorial 来配置通过 Compute Engine 发送邮件(这解释了为什么它在您的 VM 实例上运行良好)。

该教程适用于 Compute Engine,对于 App Engine 标准应用程序,您可以选择使用 Mail API,但是,由于该 API 的 Google is no longer accepting quota increases,建议使用第三方服务,例如MailGun 或 SendGrid。

要将您的 App Engine 标准应用程序(带有 Java 运行时)与这些第三方服务连接,您需要在“pom.xml”文件中指定“依赖项”并使用 API 密钥修改“app.yaml” :

env_variables:
     EMAIL_API_KEY: key-from-third-party 

Email API Key 将由第三方服务提供,例如 MailGun,其documentation 指定以下内容:

当您注册一个帐户时,您会获得一个 API 密钥。你 通过在 要求。您可以在“安全”选项卡中管理您的 API 密钥 控制面板的帐户部分。

有关如何配置您的 App Engine 标准应用程序以连接这些第三方服务的分步说明,请参阅此documentation

编辑:

在您的情况下,您可能正在使用另一个依赖项(因此,依赖项错误)。创建代码时,您是否参考了 App Engine Java 8 文档示例或 Mailgun 示例?因为我注意到它们使用不同的依赖项,而且 App Engine 示例使用了 env 变量(根据您共享的 sn-p 代码,您没有使用)。

我的建议是遵循为Google App Engine Standard Java 8 提供的示例。

这些是我在 App Engine 上成功启动并运行示例所采取的步骤:

1. 下载了sample code

2.Mailgun 上创建了一个帐户(简单帐户,未附加信用数据)。您需要通过指定的电子邮件验证您的帐户。

3. 登录 MailGun 后,您将在左侧看到一个菜单,导航至发送 > 概述页面。

4. 在右侧您会看到一个“授权收件人”框,添加电子邮件或将接收电子邮件的人,他们也需要确认,因此请尝试添加您可以访问以进行测试的电子邮件。注意:如果您没有verified your domain,则需要这样做。

5.复制您的默认域值(或您已验证的域)。

6. 在同一个框中有一个带有“Api Keys”链接的菜单,点击它并复制“HTTP webhook 签名密钥”下的密钥(这也是您的私钥,所以要小心你把它放在哪里)。

7. 前往下载的 GCP 示例,并编辑文件 "/mailgun/src/main/webapp/WEB-INF/appengine-web.xml" strong> 使用这些值(域和键)。

8.如果您使用的是 Maven,请运行以下命令:

mvn appengine:run  (if you want to test locally)

mvn appengine:deploy (if you want to deploy to App Engine) 

注意:其中一些步骤对您来说可能看起来很明显,但我已经这样解释了,以便其他人也可以遵循它。

【讨论】:

  • 我没有使用任何构建自动化系统,因此所有依赖项都是通过 JAR 文件手动添加的。我现在使用的代码在我的计算机上运行的标准 CLI 应用程序中运行良好,它没有指定 API 密钥的需要。
  • 您能澄清一下您要完成的工作吗? (您要在哪里部署您的应用程序)。我了解到您正在尝试使用 Java 运行时部署 App Engine 标准应用程序(根据问题上的标签),但现在您提到了 CLI 应用程序。根据您计划在哪里部署应用程序,所需的配置会有所不同。
  • 它确实是带有 Java 运行时的 App Engine 标准应用程序。我所说的 CLI 应用程序的意思是表明,当我复制粘贴代码时,我尝试将电子邮件发送到普通命令行应用程序以测试代码,它可以工作,但不能在 App Engine 标准环境中工作。该应用程序部署在新加坡的服务器中。
  • 在这种情况下,根据 App Engine 标准文档,您需要提供一个邮件 API 密钥,您将在第三方邮件服务上获得该密钥。在 MailGun 的案例中,他们的文档指定:“当您注册一个帐户时,您将获得一个 API 密钥。您可以通过在请求中提供您的 API 密钥来对 Mailgun API 进行身份验证。您可以在“安全”选项卡在控制面板的帐户部分下。” (documentation.mailgun.com/en/latest/…) 我将编辑答案以添加额外的详细信息
  • 我知道 API 密钥并提供了它,但是当我尝试使用他们的 API 时,它会抛出一个错误,指出我的依赖项已过时 - 它们不是。 unirest/Config.java: `try { asyncBuilder = ApacheAsyncClient::new; clientBuilder = ApacheClient::new; }catch (BootstrapMethodError e){ throw new UnirestException("看起来您使用的是旧版本的 Apache Http Client。\n" + "出于安全和性能原因,Unirest 需要最新版本。请升级。", e) ; } } `
猜你喜欢
  • 2016-10-27
  • 2010-10-27
  • 1970-01-01
  • 2015-10-09
  • 2015-07-12
  • 2016-10-19
  • 2011-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多