Отправка почты через JavaMail API с помощью токена - PullRequest
0 голосов
/ 20 апреля 2020

Я ищу отправку электронной почты через приложение из учетной записи пользователя через 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.

...