API Google Gmail - как войти программно?

Я хочу написать PHP-скрипт, который сканирует мой почтовый ящик Gmail и читает непрочитанные электронные письма. Не должно быть никакого взаимодействия с пользователем. Это должно произойти в cronjob, который выполняет файл PHP.

Это вообще возможно с API? Документация Google абсолютно ужасна, и нигде, похоже, нет примеров, которые позволяют вам программно авторизовать вход в систему. Они всегда требуют, чтобы пользователь физически нажал кнопку разрешения в запросе oauth.

Есть ли у кого-нибудь опыт попытки просто войти в систему и просмотреть свои сообщения без необходимости взаимодействия с человеком?

вы должны использовать функции imap для этого php.net/manual/en/ref.imap.php

user10051234 14.05.2019 01:30

Возможный дубликат доступ к моему почтовому ящику gmail через php-код

user10051234 14.05.2019 01:30

Токен обновления должен действовать неопределенно долго или до тех пор, пока доступ не будет отозван в соответствии с их документацией — Developers.google.com/gmail/api/auth/веб-сервер.

tshimkus 14.05.2019 01:32

Я просмотрел документы API для Gmail, и они были почти нечитаемы. Мне потребовалось более 3 часов, чтобы понять, что мне нужна служебная учетная запись, что такое служебная учетная запись и что она не работает с личными учетными записями Gmail. Обязательно буду использовать imap!

simonw16 14.05.2019 02:26

Будучи вашей собственной учетной записью, Imap, безусловно, лучший вариант.

user10051234 14.05.2019 05:28
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
5
5
5 755
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вам нужно использовать трехсторонний OSuth, то есть OAuth, где конечный пользователь (владелец учетной записи gmail) входит в систему и разрешает вашему приложению читать свою электронную почту. Нет другого способа получить доступ к учетной записи пользователя Gmail через API, кроме как с помощью трехэтапного протокола OAuth.

Конечный пользователь должен щелкнуть в первый раз. Как только ваше приложение получит согласие от конечного пользователя, оно сможет в будущем получать доступ к Gmail API от имени пользователя без кликов. Я считаю документацию это самой понятной, ищите grantOfflineAccess().

Вы можете скопировать и вставить простой JavaScript-интерфейс из документации, который позволяет вам войти в систему, и написать свою внутреннюю логику на PHP.

ОП, сказал «моя» учетная запись, поэтому можно просто использовать imap, нет необходимости использовать OAuth и т. д.

user10051234 14.05.2019 05:27
Ответ принят как подходящий

логин клиента

Я думаю, что вы пытаетесь спросить здесь, как войти в API, используя свой логин и пароль. Ответ заключается в том, что вы не можете, это называлось входом в систему клиента, и Google отключил эту опцию в 2015 году. У вас нет другого выбора, кроме как использовать Oauth2, если вы хотите подключиться к Gmail API.

сервисные аккаунты

Обычно я бы сказал, что вы должны использовать учетную запись службы. Однако служебные учетные записи работают с gmail только в том случае, если у вас есть учетная запись gsuite, и в этом случае вы можете настроить широкое делегирование домена здесь.

// Load the Google API PHP Client Library.
require_once __DIR__ . '/vendor/autoload.php';
// Use the developers console and download your service account
// credentials in JSON format. Place the file in this directory or
// change the key file location if necessary.
putenv('GOOGLE_APPLICATION_CREDENTIALS='.__DIR__.'/service-account.json');
/**
 * Gets the Google client refreshing auth if needed.
 * Documentation: https://developers.google.com/identity/protocols/OAuth2ServiceAccount
 * Initializes a client object.
 * @return A google client object.
 */
function getGoogleClient() {
    return getServiceAccountClient();
}
/**
 * Builds the Google client object.
 * Documentation: https://developers.google.com/api-client-library/php/auth/service-accounts
 * Scopes will need to be changed depending upon the API's being accessed. 
 * array(Google_Service_Analytics::ANALYTICS_READONLY, Google_Service_Analytics::ANALYTICS)
 * List of Google Scopes: https://developers.google.com/identity/protocols/googlescopes
 * @return A google client object.
 */
function getServiceAccountClient() {
    try {   
        // Create and configure a new client object.        
        $client = new Google_Client();
        $client->useApplicationDefaultCredentials();
        $client->addScope([YOUR SCOPES HERE]);
        return $client;
    } catch (Exception $e) {
        print "An error occurred: " . $e->getMessage();
    }
}

oatuh2

Если вы не используете gsuite. Тогда вы можете один раз аутентифицировать свой код. Не забудьте запросить автономный доступ. Вам будет возвращен токен обновления. Если вы сохраните этот токен обновления, вы сможете использовать его в любое время, чтобы запросить новый токен доступа. В приведенном ниже примере вы можете увидеть, как токен обновления был просто сохранен в переменной сеанса, вы можете сохранить его в файле и читать из него, когда вам это нужно.

function getOauth2Client() {
    try {

        $client = buildClient();

        // Set the refresh token on the client. 
        if (isset($_SESSION['refresh_token']) && $_SESSION['refresh_token']) {
            $client->refreshToken($_SESSION['refresh_token']);
        }

        // If the user has already authorized this app then get an access token
        // else redirect to ask the user to authorize access to Google Analytics.
        if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {

            // Set the access token on the client.
            $client->setAccessToken($_SESSION['access_token']);                 

            // Refresh the access token if it's expired.
            if ($client->isAccessTokenExpired()) {              
                $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
                $client->setAccessToken($client->getAccessToken()); 
                $_SESSION['access_token'] = $client->getAccessToken();              
            }           
            return $client; 
        } else {
            // We do not have access request access.
            header('Location: ' . filter_var( $client->getRedirectUri(), FILTER_SANITIZE_URL));
        }
    } catch (Exception $e) {
        print "An error occurred: " . $e->getMessage();
    }
}

код взят из Oauth2Authentication.php

смтп

Вы упомянули, что хотите использовать gmail api, но рассматривали ли вы возможность перехода напрямую через почтовый сервер? Это позволит вам использовать логин и пароль. или oauth -> Имап-SMTP

Это очень полезно. Я решил использовать imap для удобства. Я думаю, что у нашей компании есть учетная запись GSuite, и мой адрес электронной почты будет ее частью, поэтому я, вероятно, могу выбрать этот вариант, если захочу. Досадно, что мне удалось написать аналогичный код, но всякий раз, когда я пытался получить доступ к чему-либо в библиотеке Gmail, я получал 400 ошибок неверного запроса. Каждый раз. Я так и не понял почему. У меня был правильный файл кредитов и ссылка на кредиты при настройке useApplicationDefaultCredentials(), и мои области были настроены для gmail ТОЛЬКО ДЛЯ ЧТЕНИЯ

simonw16 14.05.2019 20:28

учетная запись службы должна быть настроена администратором gsuite

DaImTo 14.05.2019 22:33

Другие вопросы по теме