javascript отправляет почту с gmail API (аутентификация), где ошибка - PullRequest
0 голосов
/ 12 октября 2018

Этот код не работает.Я использую ReactJS вместо обычного js для загрузки скрипта, эта часть работает (я получаю разрешение), но тогда «url» как-то ошибается

*, что я хочу сделать, это отправить почтус помощью API Gmail, поиска в Google и документах API, пока не повезло

componentDidMount() {
    this.handleSort('stocks_present', 'total_invested_EUR')();

    const script = document.createElement("script");
    script.src = "https://apis.google.com/js/client.js";
    document.body.appendChild(script);
    script.onload = () => this.sendMail(script);
}

wait = ms => new Promise((r, j) => setTimeout(r, ms));

sendMail = async (script) => {
    let clientId = 'xxxxxxxx.apps.googleusercontent.com';
    let apiKey = 'xxxxxxxxxxxxxxxxxxx5ZDsC3l9TY';
    let scopes = 'https://www.googleapis.com/auth/gmail.send';

    const google_auth = async () => {
        window.gapi.client.setApiKey(apiKey);
        await this.wait(1000);

        console.log('starting -> authorized')
        window.gapi.auth2.authorize({
            client_id: clientId,
            scope: scopes,
            immediate: true
        }, () => {
            console.log('loading gmail');
            window.gapi.client.load('gmail',
                {
                    callback: () => {
                        console.log('loaded'); // it doesn't get here
                        let sendRequest = window.gapi.client.gmail.users.messages.send({
                            'userId': 'me',
                            'resource': {
                                'raw': window.btoa(email).replace(/\+/g, '-').replace(/\//g, '_')
                            }
                        });
                        sendRequest.execute();
                    },
                    onerror: (e) => console.log('error'),
                    timeout: 1000,
                    ontimeout: (e) => console.log('error')
                });
        });
        return false;
    }

    let counter = 10;
    while (counter > 1) {
        if (script.getAttribute('gapi_processed')) {
            console.log('auth gained');
            google_auth();
            break;
        } else {
            await this.wait(1000);
            counter--;
            console.log('waiting for gapi ' + counter);
        }
    }
}

Я получаю

waiting for gapi 9
auth gained
starting -> authorized
loading gmail

, а затем ошибка

GET https://content.googleapis.com/discovery/v1/apis/gmail/%5Bobject%20Object%5D/rest?fields=kind%2Cname%2Cversion%2CrootUrl%2CservicePath%2Cresources%2Cparameters%2Cmethods%2CbatchPath%2Cid&pp=0&key=xxxxxxxxxxxxxxx3l9TY 404

гдеесли я делаю это вручную, я получаю

{"error":{"errors":[{"domain":"global","reason":"notFound","message":"Not Found"}],"code":404,"message":"Not Found"}}

ОБНОВЛЕНИЕ: я могу, если я использую это

            window.gapi.client.load('gmail', 'v1', () => {
                console.log('loaded');
                let sendRequest = window.gapi.client.gmail.users.messages.send({
                    'userId': 'me',
                    'resource': {
                        'raw': window.btoa(email).replace(/\+/g, '-').replace(/\//g, '_')
                    }
                });
                sendRequest.execute();
                console.log('message sent');
            });

Но в теории этот способ устарел, так как язаставить это работать?

gapi.client.load (имя, версия, обратный вызов) устарело.Пожалуйста, загрузите API с документами обнаружения.Загружает интерфейс клиентской библиотеки к определенному API.Если обратный вызов не предоставлен, возвращается goog.Thenable.Загруженный интерфейс API будет иметь вид gapi.client.api.collection.method.Например, API-интерфейс Moderator будет создавать такие методы, как gapi.client.moderator.series.list.

...