#android #jakarta-mail
#Android #джакарта-почта
Вопрос:
Я использовал более старый JavaMail API для отправки электронной почты из моего приложения для Android с использованием аутентификации на основе пароля. Дело в том, что я использую свою собственную учетную запись GMail для отправки электронной почты (таким образом, сохраняя электронную почту / пароль в коде — я знаю, что это не очень хорошая идея)
new PasswordAuthentication(_user, _pass)
Теперь я обновился до более новой версии JavaMail и хочу использовать OAuth2
implementation 'com.sun.mail:android-mail:1.6.2'
implementation 'com.sun.mail:android-activation:1.6.2'
Как мне сгенерировать учетные данные OAuth для моей собственной учетной записи GMail и использовать их для отправки электронной почты?
Редактировать:
Это то, что я пробовал до сих пор:
- Создал проект на консоли Google. На экране учетных данных создайте идентификатор клиента OAuth — выберите «Другое». Это дает мне идентификатор клиента и секрет клиента
- Используя oauth2.py , использовал идентификатор клиента и секрет клиента для генерации токена доступа и токена обновления (В производственном приложении я намерен жестко запрограммировать все 4: идентификатор клиента, секрет, доступ, токен обновления и продолжать использовать их «навсегда» для генерации новых токенов доступа)
- Проверено, что проверка подлинности SMTP работает с использованием oauth2.py
-
Я изменил свой Java-код для отправки почты следующим образом:
Properties props = new Properties(); props.put("mail.smtp.host", "smtp.gmail.com"); props.put("mail.debug", "true"); props.put("mail.smtp.port", 587); props.setProperty("mail.smtp.socketFactory.port", 587); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enable", "true"); props.put("mail.smtp.auth.mechanisms", "XOAUTH2"); Session session = Session.getInstance(props); SMTPTransport transport = new SMTPTransport(session, null); transport.connect("smtp.gmail.com", _user, _accessToken); transport.sendMessage(msg, msg.getAllRecipients());
И теперь я получаю:
java.net.UnknownHostException: mail.google.com Unknown SMTP host: smtp.gmail.com
У меня возникли проблемы с поиском того, как установить токен доступа в запросе. Вместо
transport.connect("smtp.gmail.com", _user, _accessToken);
Я также пытался
String auth = new String(BASE64EncoderStream.encode(String.format("user=%s1auth=Bearer %s11", _user, _accessToken).getBytes()));
transport.issueCommand("AUTH XOAUTH2 " auth, 235);
Но та же ошибка.
Комментарии:
1. Обратитесь за справкой к странице JavaMail для Android , там содержатся ссылки на документы, которые вам нужно прочитать.
2. Я уже просмотрел эту документацию — не удалось найти способ сгенерировать токен доступа для моей собственной учетной записи GMail.
3. У меня это сработало, когда я попробовал это много месяцев назад. Что именно вы пробовали? В Google есть веб-страница для управления всеми вашими учетными данными OAuth, вы нашли ее?
4. @BillShannon: Чтобы уточнить, вы пытались войти в систему, используя свою собственную учетную запись GMail, или разрешить пользователям входить в систему, используя «свои» учетные записи для отправки почты? Я могу легко найти документацию для последнего. Если вы можете, пожалуйста, поделитесь ссылкой на веб-страницу, которую вы упоминаете?
5. Страница JavaMail Android ссылается на страницу JavaMail OAuth2 , которая ссылается на инструкции Google OAuth2 и консоль разработчиков Google . На этой странице выберите Учетные данные, и вы сможете управлять своими учетными данными OAuth2, которые разрешают доступ к вашей учетной записи. Поскольку вы прочитали все эти страницы и уже пробовали это, расскажите нам более точно, что вы сделали и что получилось.