Java Google App Engine не будет отправлять электронную почту через Mailgun SMTP - PullRequest
0 голосов
/ 31 октября 2019

Я прошел учебные пособия и настроил брандмауэры GCP для входа и выхода на порт 2525. Запуск локально кода на моей машине успешно отправляет электронное письмо, однако развертывание проекта в App Engine Standard (среда выполнения Java) делаетне выдает ошибку, но также не отправляет электронное письмо.

У меня также есть экземпляр виртуальной машины GCP, который также может отправлять электронную почту. Кто-нибудь знает, что может быть причиной этого?

Зависимости: Зависимости

    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();

throws: 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:

                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

Приведенный выше код при запуске на облачной платформе Google вообще ничего не делает.

1 Ответ

0 голосов
/ 31 октября 2019

Я предполагаю, что вы говорите о этом учебном пособии , чтобы настроить отправку писем через Compute Engine (который объясняет, почему он хорошо работает на вашем экземпляре виртуальной машины).

Это руководство предназначено для Compute Engine. В случае стандартных приложений App Engine у ​​вас есть возможность использовать Mail API , поскольку Google больше не принимает увеличение квот для этого API рекомендуется использовать сторонние службы, такие как MailGun или SendGrid.

Чтобы подключить ваше стандартное приложение App Engine (со средой выполнения Java) к этим сторонним сервисам, вам нужно будет указать «зависимости» в вашем файле «pom.xml» и изменить ваш «app.yaml» с помощьюключ API:

env_variables:
     EMAIL_API_KEY: key-from-third-party 

Ключ API электронной почты будет предоставлен сторонней службой, например, в случае MailGun их документация определяет следующее:

Когда вы регистрируете учетную запись, вы получаете ключ API. Вы аутентифицируетесь в API Mailgun, предоставляя свой ключ API в запросе. Вы можете управлять своим ключом API на вкладке «Безопасность» в разделе «Учетная запись» панели управления.

Пошаговые инструкции по настройке стандартного приложения App Engine для подключения к этим третьимуслуги сторонних организаций, пожалуйста, обратитесь к этой документации .

РЕДАКТИРОВАТЬ:

Похоже, в вашем случае вы могли бы использовать другие зависимости (следовательно, ошибка зависимости). Когда вы создавали код, ссылались ли вы на образцы документации Java 8 App Engine или на образцы Mailgun? потому что я заметил, что они используют разные зависимости, а также пример App Engine использует переменные env (которые в соответствии с кодом сниппета, которым вы не пользуетесь).

Мой совет - следовать примеру, указанному для Google App Engine Стандарт Java 8 .

Вот шаги, которые я предпринял для успешного запуска и запуска образца в App Engine:

1. Загрузил образец код .

2. Создан аккаунт на Mailgun (простой аккаунт, кредитные данные не прилагаются). Вам нужно будет подтвердить свою учетную запись по указанному адресу электронной почты.

3. После того, как вы вошли в MailGun, вы увидите меню слева, перейдите на страницу Отправка> Обзор.

4. Справа вы увидите поле «Авторизованные получатели», добавьте электронное письмо или лицо, которое получит электронное письмо, они должны будут подтвердить также на своей стороне, поэтомупопробуйте добавить электронное письмо, к которому у вас есть доступ во время теста. Примечание: вам нужно сделать это, если вы не подтвердили свой домен .

5. Скопируйте значение домена, которое у вас есть по умолчанию (иливы проверили).

6. В том же окне есть меню со ссылкой на «Api Keys», нажмите на него и скопируйте ключ в разделе «Ключ подписи 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) 

примечание: некоторые из этих шагов могли бы показаться вам довольно очевидными, но я объяснил это так, чтобы другие люди моглиследуйте за этим также.

...