Я ищу отправку электронной почты через приложение из учетной записи пользователя через JavaMail API, используя токен аутентификации Google (вместо использования прямого пароля). Вот как я получаю токен после того, как пользователь выбирает учетную запись:
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken("requestIdToken")
.requestEmail()
.build();
mGoogleApiClient = new GoogleApiClient.Builder(this)
//.enableAutoManage(this, MainActivity.this)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
private void signIn() {
Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
startActivityForResult(signInIntent, RC_SIGN_IN2);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RC_SIGN_IN2) {
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
if (result.isSuccess()) {
final GoogleSignInAccount account = result.getSignInAccount();
userMail = account.getEmail();
Runnable runnable = new Runnable() {
@Override
public void run() {
try {
String scope = "oauth2:"+Scopes.EMAIL+" "+ Scopes.PROFILE;
accessToken = GoogleAuthUtil.getToken(getApplicationContext(), account.getAccount(), scope, new Bundle());
Log.d("myapp", "accessToken:"+accessToken); // I get accessToken:ya29.Gl...
Теперь я использую это для JavaMail api
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.ssl.enable", "true");
props.put("mail.smtp.EnableSSL.enable","true");
props.put("mail.smtp.auth.mechanisms", "XOAUTH2");
mSession = Session.getInstance(props);
try {
transport = mSession.getTransport("smtp");
transport.connect("smtp.gmail.com", userMail, token);
} catch (NoSuchProviderException e) {
e.printStackTrace();
}
MimeMessage msg = new MimeMessage(mSession);
msg.setFrom(new InternetAddress(userMail, "test"));
msg.setRecipient(Message.RecipientType.TO, new InternetAddress(mEmail));
msg.setSubject(mSubject);
msg.setContent(mMessage, "text/html");
//transport.issueCommand("AUTH XOAUTH2 " + new String(BASE64EncoderStream.encode(String.format("user=%s\1auth=Bearer %s\1\1", Utils.EMAIL, Utils.PASSWORD).getBytes())), 235);
transport.sendMessage(msg, msg.getAllRecipients());
Но я получаю исключение: Отладка SMTP: сбой AUTH XOAUTH2 javax.mail.AuthenticationFailedException: OAUTH2 запросил больше
Вопрос: есть ли проблема с моим кодом для JavaMail ? Но более того, я чувствую, что область, которую я определил для получения токена доступа, выглядит недостаточно для отправки почты, но я не уверен.
Если да, есть ли другой способ добиться того же как использование маркера firebase для JavaMail.