Java Google App Engine不会通过Mailgun SMTP发送电子邮件

时间:2019-10-31 02:52:35

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

我已按照教程进行操作,并为端口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

上面的代码在Google Cloud Platform上运行时根本没有任何作用。

1 个答案:

答案 0 :(得分:0)

我猜您正在谈论this tutorial,以配置通过Compute Engine发送邮件(这说明了为什么它可以在您的VM实例上正常工作)。

该教程适用于Compute Engine,对于App Engine Standard应用程序,您可以选择使用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 

电子邮件API密钥将由第三方服务提供,例如,对于MailGun,其documentation指定以下内容:

  

注册帐户时,会获得一个API密钥。您   通过在以下网址中提供您的API密钥对Mailgun API进行身份验证   请求。您可以在“安全性”标签下的“   “控制面板”的“帐户”部分。

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

编辑:

在您的情况下,您可能正在使用其他依赖项(因此,依赖项错误)。创建代码时,您是否引用了App Engine Java 8文档示例或Mailgun示例?因为我注意到它们使用了不同的依赖关系,而且App Engine示例还使用了env变量(根据您共享的代码段代码,您并未使用)。

我的建议是遵循针对Google App Engine Standard Java 8给出的示例。

以下是我成功获取示例并在App Engine上运行的步骤:

1。。下载了sample code

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

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

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

5。。复制默认拥有的域(或已验证的域)的值。

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

7。。转到已下载的GCP示例,然后编辑文件“ / mailgun / src / main / webapp / WEB-INF / appengine-web.xml” 和这些值(域和键)。

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

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

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

注意:其中一些步骤对您来说似乎很明显,但是我已经以此方式进行了解释,以便其他人也可以遵循。