我已经完成了教程,并为端口2525上的入口和出口设置了GCP防火墙。在我的机器上本地运行代码成功地发送了电子邮件,但是,将项目部署到App Engine Standard(Java运行时(不会引发错误,也不会发送电子邮件。
我还有一个GCPVM实例,它也可以发送电子邮件。有人知道是什么原因造成的吗?
依赖项:依赖
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
如果在我的电脑上单独运行,而不是在谷歌云平台上运行,则工作代码:
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();
依赖项:依赖项2
上面的代码在谷歌云平台上运行时根本没有任何作用。
我猜您正在谈论本教程,以配置通过计算引擎发送邮件(这解释了为什么它在您的VM实例上运行良好(。
本教程适用于计算引擎,在应用程序引擎标准应用程序的情况下,您可以选择使用Mail API,但由于Google不再接受该API的配额增加,因此建议使用第三方服务,如MailGun或SendGrid。
要将应用程序引擎标准应用程序(带有Java运行时(与这些第三方服务连接,您需要在"pom.xml"文件上指定"dependencies",并使用API密钥修改"App.yaml":
env_variables:
EMAIL_API_KEY: key-from-third-party
电子邮件API密钥将由第三方服务提供,例如,在MailGun的情况下,他们的文档指定了以下内容:
当您注册帐户时,您将获得一个API密钥。你通过在要求您可以在控制面板的"帐户"部分。
有关如何配置应用程序引擎标准应用程序以连接这些第三方服务的分步说明,请参阅本文档。
编辑:
在您的情况下,您可能正在使用另一个依赖项(因此,出现了依赖项错误(。当您创建代码时,您参考了App Engine Java 8文档示例还是Mailgun示例?因为我注意到它们使用不同的依赖项,而且AppEngine示例使用env变量(根据您共享的代码片段,您没有使用(。
我的建议是遵循为GoogleAppEngineStandardJava8提供的示例。
这些是我为在应用程序引擎上成功启动和运行样本而采取的步骤:
1.已下载示例代码。
2.在Mailgun上创建了一个帐户(简单帐户,不附带信用数据(。您需要通过指定的电子邮件验证您的帐户。
3.登录MailGun后,您将看到左侧的菜单,导航至发送>概述页面。
4.在右侧,您将看到一个"授权收件人"框,添加电子邮件或将接收电子邮件的人,他们也需要确认,因此尝试添加一封您可以访问的电子邮件,以便进行测试。注意:如果您尚未验证您的域,则需要执行此操作。
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)
注意:其中一些步骤对您来说可能很明显,但我已经这样解释了,这样其他人也可以遵循。