我已按照教程进行操作,并为端口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上运行时根本没有任何作用。
答案 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)
注意:其中一些步骤对您来说似乎很明显,但是我已经以此方式进行了解释,以便其他人也可以遵循。