API GMAIL en PHP

Me gustaría saber si alguien ha utilizado la API de GMail para poder enviar correos desde PHP.
Soy capaz de enviarlos con PHP pero sin utilizar la API, simplemente usando la configuración del servidor, el nombre de usuario y la contraseña.
Me gustaría poder usar la API, ya que en un futuro es posible que Google deshabilite el metodo que utilizo actualmente y tenga que pasar por su API si o si.
Buenas!

No se como estás accediendo ahora pero supongo que por imap no creo que lo cierren, aunque siendo Google.. vete a saber, pero me parecería super extraño que algo tan standar lo cerrasen. Ya que hay millones de páginas web por ejemplo que con poner el host de gmail, el usuario y contraseña o token dejarían de funcionar.

Un saludo
@luciferfran ahora estoy accediendo con las variables del servidor, puerto, usuario y contraseña en el propio PHP.

Pienso que es más interesante y correcto hacerlo con OAuth2 ;)
He logrado acceder mediante OAuth2, pero el token que genera tiene una validez limitada de tiempo; me gustaría saber si alguno ha implementado alguna función que usando un token de refresco sea capaz de generar un token de acceso nuevo para cuando el anterior haya expirado.
Si funciona no lo toques.
@pulupul y si el día de mañana no funcionara? Era necesario pasar al logueo mediante OAuth2 ya que en las cuentas personales de GMail ya ha dejado de funcionar la otra manera.

Solucionado [oki]

Servidor con PHP 8.2 y https://github.com/googleapis/google-api-php-client por Composer.
La siguiente función se encarga de todo:
function getClient()
{
    $client = new Client();
    $client->setApplicationName('Gmail API PHP Test');
/*    $client->setScopes('https://www.googleapis.com/auth/gmail.addons.current.message.readonly'); */
// habilitar permisos totales para la app
    $client->setScopes('https://mail.google.com/');
    $client->setAuthConfig('credentials.json');
    $client->setAccessType('offline');
    $client->setPrompt('select_account consent');

    // Load previously authorized token from a file, if it exists.
    // The file token.json stores the user's access and refresh tokens, and is
    // created automatically when the authorization flow completes for the first
    // time.
    $tokenPath = 'token.json';
    if (file_exists($tokenPath)) {
        $accessToken = json_decode(file_get_contents($tokenPath), true);
        $client->setAccessToken($accessToken);
    }

    // If there is no previous token or it's expired.
    if ($client->isAccessTokenExpired()) {
        // Refresh the token if possible, else fetch a new one.
        if ($client->getRefreshToken()) {
            $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
        } else {
            // Request authorization from the user.
            $authUrl = $client->createAuthUrl();
            printf("Open the following link in your browser:\n%s\n", $authUrl);
            print 'Enter verification code: ';
            $authCode = trim(fgets(STDIN));

            // Exchange authorization code for an access token.
            $accessToken = $client->fetchAccessTokenWithAuthCode($authCode);
            $client->setAccessToken($accessToken);

            // Check to see if there was an error.
            if (array_key_exists('error', $accessToken)) {
                throw new Exception(join(', ', $accessToken));
            }
        }
        // Save the token to a file.
        if (!file_exists(dirname($tokenPath))) {
            mkdir(dirname($tokenPath), 0700, true);
        }
        file_put_contents($tokenPath, json_encode($client->getAccessToken()));
    }
    return $client;


Es necesario crear el proyecto en Google, asociarlo para usar la API determinada y descargar el fichero de credentials.json que actualmente te lo da con otro nombre / churro.
4 respuestas