INICIO

GUÍA COMPLETA DE GMAIL API EN PHP | ENVIAR CORREO CON ARCHIVOS ADJUNTOS

Estás usando la API de Gmail para PHP con OAuth 2.0 de Google.

Pero es un marrón enorme porque la documentación para usar la API con PHP no es muy completa que digamos.

Pero no pasa nada porque aquí tienes a un artista que te lo va a explicar super bien.

Ojalá yo hubiese tenido en su día una persona tan buena gente que me lo explicase tan bien.

¡Has tenido suerte de encontrarme!

Crea una carpeta nueva para empezar

Vamos a hacer todo este asunto en un directorio de pruebas experimentales en nuestro servidor.

Por ejemplo:

En nuestro caso: salamarkesa.com/supergmail/

Tú llámalo como buenamente puedas. Okay.

Mini explicación sobre OAuth y la Google API:

El asunto básico es:

Ok.

Descargar la librería del tito google para PHP

Desde aquí: PHP Google API client

Descarga el zip y extrae el asunto.

Eso es una carpeta con muchas carpetas y muchos archivos.

Ponemos toda la carpeta enterita en nuestro directorio de pruebas.

Aquí: salamarkesa.com/supergmail/aqui-la-carpetaza

En mi caso yo le cambié el nombre y le puse “tito-google”.

Tú puedes hacer lo que quieras, pero usa el nombre correspondiente en los archivos que haremos más adelante.

Conectarnos con Gmail desde PHP

Para empezar con todo el asunto, necesitamos pillar una conexión OAuth con el tito Google.

Para eso pues vamos al developers console:

¿Dónde?

Enlace: Console Dev.

Creamos un proyecto.

Lo creamos y luego nos vamos a la parte de credenciales.

Es una pestaña que estará por ahí.

Ahí le das a “Crear Credenciales” y luego a “Id de cliente de OAuth“.

Tendrás que rellenar unos datos de pantalla de autorización.

¿Eso que es?

Pues es una pantalla que verá el usuario al acceder a tu APP.

Tú sigue los pasos que viene todo muy clarito.

La parte de callback URL es en plan la URL a la que va a redirigirte la APP cuando el menda haga la autorización.

Esa URL apuntará a tu servidor y nosotros crearemos el archivo.

Para este caso puedes poner “lalala.php”:

En tu carpeta: salamarkesa.com/supergmail/lalala.php

Luego te descargas las claves de tu app, que es un fichero en formato JSON.

Eso estará disponible desde la pestaña “Credenciales” cuando hayas configurado el asunto.

Y ese archivo lo metes en tu carpeta con el nombre clavesitas.

En nuestro caso: salamarkesa.com/supergmail/clavesitas.json

Cuando tengamos esto bien hecho, vamos a crear los archivos PHP.

Primero el archivo que pide permiso a la APP.

Contenido para lalala.php

// Incluyo la libreria del tito google
 require_once __DIR__.'/tito_google/vendor/autoload.php';

// Creamos una conexión con la clase Google_Client
 $client = new Google_Client();

// Nos identificamos, con los datos guardados en el JSON de clavesitas
 $client->setAuthConfigFile('clavesitas.json');

// Establecemos estos dos parámetros que sirven para que la APP pueda conseguir permisos de actuar por su cuenta sin que el usuario esté presente
 $client->setAccessType('offline');
 $client->setApprovalPrompt('force');

// Solicitamos los permisos que necesitamos que el usuario nos ceda
 // LISTADO --> https://developers.google.com/identity/protocols/googlescopes
 $client->addScope('https://mail.google.com/');

// Donde vamos pa hacer el control?
 $client->setRedirectUri('https://salamarkesa.com/supergmail/lalala.php');

// Ejecutamos el control, o bien se ha identificado o bien tiene que hacerlo
 if(!isset($_GET['code'])){
 //Aún no lo ha hecho, lo redirigimos pa que le salga la ventanita de permisos esa molona
 $auth_url = $client->createAuthUrl();
 header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));
 }else{

//Ya lo ha hecho, lo autenticamos pa sacar su mail del id del calendario primario
 $client->authenticate($_GET['code']);
 $merengue = $client->getAccessToken();

// Guardamos la clave refrescadora
 $codigo=$merengue['refresh_token'];

echo $codigo;

// Lo normal es guardarla en una base de datos, pero ahora solo copiala para pegarla en el otro archivo.

}

Perfecto.

Este archivo lo ejecutas desde tu servidor, y lo que hace es conectarte con tu APP de Google, pa tener autorización.

Es la misma base para todos los servicios que funcionan con Google OAuth 2.0.

Enviar correo electrónico con Gmail API

Una vez tengamos nuestra refresh token (la variable $codigo del archivo anterior), el resto es muy fácil.

Creamos en el mismo directorio un archivo que sea enviar-cositas.php

// Incluyo la libreria del tito google
 require_once __DIR__.'/tito_google/vendor/autoload.php';

// Nombre pa mandar el tema
 $nombremenda='Menda D. Enviador';

// Gmail del nota que manda
 $dequien='tallergranadosortiz@gmail.com';

// A quién queremos mandarle
 $paquien='woooooooohhhh@gmail.com';

// Clave OAuth 2.0
 $codigo='1/ISEs1NoQYZpQL0YfNOAYmwsas9EV4oMhr_vvmvANorQ';

// Asunto del mensaje
 $asuntazo='Plato de queso fresco';

// Contenido del mensaje en HTML
 $contenido='Te regalo un <b>queso</b> francés.';

// Creamos una conexión con la clase Google_Client
 $client = new Google_Client();

// Nos identificamos, con los datos guardados en el JSON de clavesitas
 $client->setAuthConfigFile('clavesitas.json');

// Dale caña
 $client->refreshToken($codigo);

// Iniciamos un GMAIL service
 $service = new Google_Service_Gmail($client);

echo '<h2>Envío mail a '.$paquien.'</h2>';
 echo '<h3>Desde cuenta '.$dequien.'</h3>';

// Limpiamos los caracteres graciosos primero
 $subject = mb_encode_mimeheader($asuntazo, 'UTF-8');
 $nombremendaguay = mb_encode_mimeheader($nombremenda, 'UTF-8');
 $msg = "To: $paquien\n";
 $msg .= "From: $nombremendaguay <$dequien>\n";
 $msg .= "Subject: $subject\n";
 $msg .= "MIME-Version: 1.0\n";
 $msg .= "Content-Type: multipart/mixed;\n";
 $boundary = uniqid("_Part_".time(), true); //random unique string
 $boundary2 = uniqid("_Part2_".time(), true); //random unique string
 $msg .= " boundary=\"$boundary\"\n";
 $msg .= "\n";

$msg .= "--$boundary\n";

$msg .= "Content-Type: multipart/alternative;\n";
 $msg .= " boundary=\"$boundary2\"\n";
 $msg .= "\n";
 $msg .= "--$boundary2\n";

// Parte de texto plano
 $msg .= "Content-Type: text/plain; charset=utf-8\n";
 $msg .= "Content-Transfer-Encoding: 7bit\n";
 $msg .= "\n";
 $msg .= strip_tags($contenido); //remove any HTML tags
 $msg .= "\n";

// Parte HTML
 $msg .= "--$boundary2\n";
 $msg .= "Content-Type: text/html; charset=utf-8\n";
 $msg .= "Content-Transfer-Encoding: 7bit\n";
 $msg .= "\n";
 $msg .= $contenido;
 $msg .= "\n";
 $msg .= "--$boundary2--\n";

// Parte de archivo adjunto
 $msg .= "\n";
 $msg .= "--$boundary\n";
 $msg .= "Content-Transfer-Encoding: base64\n";
 $msg .= "Content-Type: {image/jpg}; name=una-imagen-adjunta.jpg;\n";
 $msg .= "Content-Disposition: attachment; filename=una-imagen-adjunta.jpg;\n";
 $msg .= "\n";
 $msg .= base64_encode(file_get_contents('https://salamarkesa.com/wp-content/uploads/2017/03/superman-1367737_1280-min.jpg'));
 $msg .= "\n--$boundary";

// Cerrar mensaje
 $msg .= "--\n";

echo '<pre>'.htmlentities($msg).'</pre>';

// Intentamos mandar el tema
 try {

// Codificamos el mensaje en base64 url safe
 $mime = rtrim(strtr(base64_encode($msg), '+/', '-_'), '=');
 $msg = new Google_Service_Gmail_Message();
 $msg->setRaw($mime);

$objSentMsg = $service->users_messages->send("me", $msg);

echo '<h4>Resultado:</h4>';

echo '<pre>';
 var_dump($objSentMsg);
 echo '</pre>';

} catch (Exception $e) {

echo '<h4>Fallo gordo:</h4>';
 print($e->getMessage());

}

Solo tienes que cambiar tu mail ($dequien) y tu refresh token ($codigo), y ahí lo llevas. Cuando ejecutes el archivo, tu super mensaje se enviará:

Puedes añadir tantos archivos adjuntos como te dé la gana.

Simplemente repite ese bloque y pon el MIME type correspondiente.

¿Qué es un mime type?

Dicho por encima, el formato del archivo.

Ok.