Не удалось отправить электронную почту с помощью механизма Google

Я на GAE версии 1.7.3 и используя java mail api для отправки электронной почты. На локальном сервере разработки почта отправляется штрафом. Но после развертывания в приложении я получаю следующее исключение

com.google.apphosting.api.ApiProxy$CallNotFoundException: The API package 'remote_socket' or call 'Resolve()' was not found.
    at java.lang.Thread.getStackTrace(Thread.java:1495)
    at com.google.apphosting.runtime.ApiProxyImpl.doSyncCall(ApiProxyImpl.java:240)
    at com.google.apphosting.runtime.ApiProxyImpl.access$000(ApiProxyImpl.java:66)
    at com.google.apphosting.runtime.ApiProxyImpl$1.run(ApiProxyImpl.java:183)
    at com.google.apphosting.runtime.ApiProxyImpl$1.run(ApiProxyImpl.java:180)

    at java.security.AccessController.doPrivileged(Native Method)

    at com.google.apphosting.runtime.ApiProxyImpl.makeSyncCall(ApiProxyImpl.java:180)

    at com.google.apphosting.runtime.ApiProxyImpl.makeSyncCall(ApiProxyImpl.java:66)

    at com.google.apphosting.api.ApiProxy.makeSyncCall(ApiProxy.java:107)
    at com.google.apphosting.api.ApiProxy.makeSyncCall(ApiProxy.java:56)

    at com.google.appengine.api.socket.SocketApiHelper.apiProxyMakeSyncCall(SocketApiHelper.java:90)

    at com.google.appengine.api.socket.SocketApiHelper.makeSyncCall(SocketApiHelper.java:58)

    at com.google.appengine.api.socket.NameServiceImpl.lookupAllHostAddr(NameServiceImpl.java:61)

    at com.google.apphosting.util.ResolverManager$AppEngineNameservice.lookupAllHostAddr(ResolverManager.java:42)

    at java.net.InetAddress.getAddressFromNameService(InetAddress.java:1353)
    at java.net.InetAddress.getAllByName0(InetAddress.java:1303)

    at java.net.InetAddress.getAllByName(InetAddress.java:1232)

    at java.net.InetAddress.getAllByName(InetAddress.java:1163)

    at java.net.InetAddress.getByName(InetAddress.java:1113)

    at javax.mail.Service.connect(Service.java:257)

    at javax.mail.Service.connect(Service.java:91)

    at javax.mail.Service.connect(Service.java:76)

    at javax.mail.Transport.send(Transport.java:94)
    at javax.mail.Transport.send(Transport.java:48)
    at com.test.igreetings.service.impl.EmailImpl.sendEmail(EmailImpl.java:61)

Вот мой код для отправки электронной почты:

try {
           //Email is my custom pojo class
            Email email = new Email();
            email.setMailHost("smtp.gmail.com");
            email.setAuth("true");
            email.setFrom("[email protected]");
            email.setTo("[email protected]");
            email.setSubject("test);
            email.setMessage("test body");
            email.setPort("25");
            email.setStarttls("true");
            email.setLogin("[email protected]");
            email.setPassword("pwd");

            Properties props = new Properties();
            props.setProperty("mail.host", email.getMailHost());
            props.setProperty("mail.smtp.port", email.getPort());
            props.setProperty("mail.smtp.auth", email.getAuth());
            props.setProperty("mail.smtp.starttls.enable", email.getStarttls());

            Authenticator auth = new SMTPAuthenticator(email.getLogin(), email.getPassword());

            Session session = Session.getInstance(props, auth);

            MimeMessage msg = new MimeMessage(session);
            msg.setText(email.getMessage());
            msg.setSubject(email.getSubject());
            msg.setFrom(new InternetAddress(email.getFrom()));
            msg.addRecipient(Message.RecipientType.TO, new InternetAddress(email.getTo()));
            Transport transport = session.getTransport("smtp");
            transport.connect(email.getMailHost(), 25, "[email protected]", "pwd");

            transport.sendMessage(msg, msg.getAllRecipients());

            transport.close();
        } catch (AuthenticationFailedException ex) {
            Logging.log("AuthenticationFailedException in sendEmail: " + ex.toString());
            ex.printStackTrace();

        } catch (AddressException ex) {

            Logging.log("AddressException in sendEmail: " + ex.toString());
            ex.printStackTrace();
        } catch (MessagingException ex) {
            Logging.log("MessagingException in sendEmail: " + ex.toString());
            ex.printStackTrace();
        }

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

Я изменил код на ваше предложение, и вот мой обновленный код:

Properties props = new Properties();
                        Session session = Session.getDefaultInstance(props, null);
                        Message msg = new MimeMessage(session);
                        msg.setFrom(new InternetAddress("[email protected]"));
                        msg.addRecipient(Message.RecipientType.TO,
                        new InternetAddress("[email protected]"));
                        msg.setSubject("test");
                        msg.setText("test");
                        Transport.send(msg);

И я получаю подобное исключение. Пакет API «remote_socket» или вызов «CreateSocket ()» не был найден. Вышеуказанный отправитель также зарегистрирован как разработчик этого приложения.

0
nl ja de

2 ответы

Как отметил @Shay, вы не можете использовать внешний SMTP-провайдер с GAE. GAE использует собственный SMTP-шлюз.

Related issue: on GAE you can only send email that originates (i.e. from field) from one of the app administrators (GAE Admin -> permissions) or currently logged-in users via Google Accounts. Note: this only works for users logged-in via Google Accounts, not for users logged in via federated login (e.g. OpenID): Sending email on behalf of Google Apps user (answer is from Google engineer)

Update: as noted before, the [email protected] must be the email of the user that logged into your GAE app via Google Apps login or the user must be an admin of your GAE app.

Update2: this works for me:

Properties props = new Properties();
Session session = Session.getDefaultInstance(props, null);
try {
    Message msg = new MimeMessage(session);
    msg.setFrom(new InternetAddress("[email protected]", "Admin", "UTF-8"));
    msg.addRecipient(Message.RecipientType.TO, new InternetAddress(recipientAddress));
    msg.setSubject(emailSubject);
    msg.setText(emailText);
    Transport.send(msg);

} catch (AddressException e) {
// TO address not valid
} catch (MessagingException e) {
   //other email error
} catch (UnsupportedEncodingException e) {
   //should not happen UTF-8 is always available
}
2
добавлено
вопрос отредактирован.
добавлено автор Muhammad Imran Tariq, источник
Благодарю. Он был решен с помощью почтового ящика приложения вместо javax.mail.
добавлено автор Muhammad Imran Tariq, источник
Обновленный код, который вы опубликовали, работает для меня.
добавлено автор Peter Knego, источник
Опубликуйте новые ошибки.
добавлено автор Peter Knego, источник

Приложение не может использовать интерфейс JavaMail для подключения к другой почте   услуги для отправки или получения сообщений электронной почты. Конфигурация SMTP   добавлено в транспорт или сеанс, игнорируется.

Удалите настройки порта, пользователя, пароля и почтового хоста, и он должен работать.

1
добавлено
вопрос отредактирован.
добавлено автор Muhammad Imran Tariq, источник
Благодарю. Он был решен с помощью почтового ящика приложения вместо javax.mail.
добавлено автор Muhammad Imran Tariq, источник
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Кибербезопасность АСУ ТП: RUSCADASEC Community
Кибербезопасность АСУ ТП: RUSCADASEC Community
1 389 участник(ов)

Группа открытого независимого сообщества специалистов по кибербезопасности АСУ ТП / RUSCADASEC для интерактивного обмена информацией по теме Подробнее: www.ruscadasec.ru Наш канал для основных новостей и материалов @RUSCADASECnews

secinfosec
secinfosec
697 участник(ов)

Эта группа про информационную безопасность. Целевая аудитория: пентестеры, ресерчеры, ибшники всех мастей. Реклама, криминал, политика и прочая чушь карается родовыми проклятьями. Митапы: https://www.youtube.com/channel/UCagEjp1FmxY9gsVxi6_d4SQ

Linux Security
Linux Security
652 участник(ов)

Данная группа принципиально про безопасность и в частности про безопасность Linux. Прочие темы просим обсуждать в профильных чатах.

Chat Security / ИБач чат
Chat Security / ИБач чат
601 участник(ов)

Чат канала @ibach Обсуждение всего, что касается информационной безопасности Правила: https://t.me/chat_security/65

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async