Cómo enviar Correos desde tu Web con la API de Zoho Mail

Zoho Mail ofrece un plan gratuito que te permite tener hasta 5 direcciones de correo con el mismo dominio. Sin embargo, tiene una limitación: no permite el uso de sus servidores SMTP o IMAP, lo que restringe su uso únicamente al webmail desde su plataforma o en la aplicación para dispositivos móviles.

Pero no todo está perdido. Zoho Mail cuenta con una API OAuth2 que te permite, aunque de una manera un poco más compleja, enviar correos desde tu sitio web utilizando PHP. En este tutorial, te explicaré paso a paso cómo hacerlo.

Debo admitir que me costó bastante implementarlo, principalmente porque Zoho tarda aproximadamente 24 horas en habilitar el token después de crear la aplicación en su API. En mi caso, todo el proceso me llevó dos días: el primer día creé la aplicación en la API de Zoho y las páginas PHP en mi servidor, pero no pude obtener el token. No fue hasta el día siguiente, en el primer intento, que Zoho me lo entregó.

A continuación, te guiaré para que puedas realizar este proceso de manera exitosa y, espero, te diviertas mientras lo haces.

Requisitos previos
  • Cuenta de Zoho Mail: Necesita una cuenta activa de Zoho Mail. Si aún no tienes una, puedes registrarte en: https://zoho.com
  • Aplicación registrada en Zoho API Console: Debes registrar una aplicación en la consola de API de Zoho para obtener las credenciales necesarias (Client ID y Client Secret). Puedes acceder a la consola aquí: https://api-console.zoho.com/
  • Servidor con PHP: Necesitarás un servidor que ejecute PHP para poder ejecutar el código que envía los correos electrónicos.
  • Conocimientos básicos de PHP y API: Será de gran utilidad tener conocimientos básicos de como realizar peticiones a una API y como trabajar con el lenguaje PHP.
Pasos para enviar correos con la API de Zoho Mail
1. Registrar una aplicación en Zoho API Console
  • Acceda a la consola de API de Zoho: https://api-console.zoho.com/
  • Crea una nueva aplicación. Selecciona "Aplicaciones basadas en servidor" o la opción más adecuada para tu caso.
  • Configura los "URI de redireccionamiento". Este URI es a donde Zoho redireccionará al usuario después de autorizar la aplicación. Por ejemplo: https://www.tudominio.com/zoho-callback.php. Es importante que este URI coincida con la ubicación de tu script PHP que manejará la autorización. Puedes agregar varios URI de redireccionamiento.
  • Obtenga el "ID de cliente" y el "Secreto de cliente". Estas credenciales son esenciales para autenticar tu aplicación con la API de Zoho Mail. Guarde estos valores de manera segura.
2. Obtener un Authorization Code

Construye la URL de autorización con los scopes (permisos) necesarios:

https://accounts.zoho.com/oauth/v2/auth?
response_type=code&
client_id=TU_CLIENT_ID&
scope=ZohoMail.messages.CREATE&
redirect_uri=https://www.tudominio.com/zoho-callback.php&
access_type=offline
scope: ZohoMail.messages.CREATE
        

Abre la URL en tu navegador y pega el código y se redireccionará hacia una página de Zoho para autorizar la aplicación.

3. Obtener un Access Token y Refresh Token

Usa cURL para intercambiar el Authorization Code por un Access Token y un Refresh Token:

curl -X POST \
  'https://accounts.zoho.com/oauth/v2/token' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -d 'code=TU_CODIGO_DE_AUTORIZACION' \
  -d 'client_id=TU_CLIENT_ID' \
  -d 'client_secret=TU_CLIENT_SECRET' \
  -d 'redirect_uri=https://www.tudominio.com/zoho-callback.php' \
  -d 'grant_type=authorization_code'
        

Guarda el Access Token y el Refresh Token para usarlos en tus solicitudes.

4. Obtener el accountId

Usa el Access Token para obtener el accountId de tu cuenta de Zoho Mail:

curl -X GET \
'https://mail.zoho.com/api/accounts' \
-H 'Authorization: Zoho-oauthtoken TU_ACCESS_TOKEN'

En la respuesta, busca el campo accountId. Por ejemplo:

{
"data": [
{
"accountId": "2427022010000008002",
"emailAddress": "tucuenta@zoho.com"
}
]
}
        
5. Enviar correos con la API

Usa el Access Token y el accountId para enviar correos. Aquí tienes un ejemplo de cómo hacerlo con cURL:

curl -X POST \
'https://mail.zoho.com/api/accounts/2427012000000008002/messages' \
-H 'Authorization: Zoho-oauthtoken TU_ACCESS_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"fromAddress": "tucuenta@zoho.com",
"toAddress": "destinatario@example.com",
"ccAddress": "copia@example.com",
"subject": "Prueba de correo",
"content": "Este es un mensaje de prueba."
}'

Si la solicitud es exitosa, obtendrás una respuesta como esta:

{
  "status": {
    "code": 200,
    "description": "success"
  },
  "data": {
    "messageId": "1234567890"
  }
}
6. Integrar en PHP

Crea un archivo PHP (zoho_send.php) para manejar el envío de correos desde un formulario. Aquí tienes el código:

<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);

// Configuración de credenciales
$client_id = '2000.ASDEMfsdfsdfFHMLMHJ9QJ7123234rtf'; // Reemplaza con tu Client ID
$client_secret = '8jfdshfdshfdshdsf7f160937ee10b1264fea08123lksdfslkdlkj'; // Reemplaza con tu Client Secret
$refresh_token = '2000.dfsdfsdfwer890c044ef135e0f03706027.b873c97715dec552cpwpe80rkjqw4e98'; // Tu Refresh Token
$account_id = '6727088000000009002'; // Reemplaza con tu accountId

// Función para obtener un nuevo Access Token usando el Refresh Token
function getNewAccessToken($client_id, $client_secret, $refresh_token) {
    $url = 'https://accounts.zoho.com/oauth/v2/token';
    $data = [
        'refresh_token' => $refresh_token,
        'client_id' => $client_id,
        'client_secret' => $client_secret,
        'grant_type' => 'refresh_token'
    ];

    $options = [
        'http' => [
            'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
            'method'  => 'POST',
            'content' => http_build_query($data)
        ]
    ];

    $context = stream_context_create($options);
    $result = file_get_contents($url, false, $context);

    if ($result === FALSE) {
        die('Error al obtener el nuevo Access Token. Detalles: ' . print_r(error_get_last(), true));
    }

    $response = json_decode($result, true);
    return $response['access_token'];
}

// Verifica si el formulario se envió
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // Recupera los datos del formulario
    $name = $_POST['name'];
    $email = $_POST['email']; // Correo del remitente
    $message = $_POST['message'];

    // Configuración del correo
    $from_email = 'web@xxx.com.ar'; // Tu dirección de correo
    $to_email = 'xxx@xxx.com.ar'; // Correo principal (destinatario)
    $subject = 'Nuevo mensaje de contacto de ' . $name;
    $body = "Nombre: $name\nCorreo electrónico: $email\nMensaje:\n$message";

    // Access Token (puedes almacenarlo en un archivo o base de datos para no solicitarlo siempre)
    $access_token = '1000.be3428e2bc69f8e3f121bb4e0d7ca1da.07a6522fab57275d036ffc349ea9f3fr';

    // URL de la API de Zoho Mail
    $url = "https://mail.zoho.com/api/accounts/$account_id/messages";

    // Datos del correo
    $data = [
        'fromAddress' => $from_email,
        'toAddress' => $to_email, // Correo principal (nbaglietto@chinaimport.com.ar)
        'ccAddress' => $email, // Copia al remitente (el correo que ingresó en el formulario)
        'subject' => $subject,
        'content' => $body
    ];

    // Configuración de la solicitud HTTP
    $options = [
        'http' => [
            'header'  => "Authorization: Zoho-oauthtoken $access_token\r\n" .
                         "Content-type: application/json\r\n",
            'method'  => 'POST',
            'content' => json_encode($data)
        ]
    ];

    // Realiza la solicitud
    $context = stream_context_create($options);
    $result = file_get_contents($url, false, $context);

    // Si la solicitud falla, intenta obtener un nuevo Access Token y reintentar
    if ($result === FALSE) {
        // Obtén un nuevo Access Token
        $new_access_token = getNewAccessToken($client_id, $client_secret, $refresh_token);

        // Actualiza el Access Token en la solicitud
        $options['http']['header'] = "Authorization: Zoho-oauthtoken $new_access_token\r\n" .
                                     "Content-type: application/json\r\n";

        // Reintenta la solicitud con el nuevo Access Token
        $context = stream_context_create($options);
        $result = file_get_contents($url, false, $context);

        // Si sigue fallando, muestra un error
        if ($result === FALSE) {
            die('Error al enviar el correo. Detalles: ' . print_r(error_get_last(), true));
        }
    }

    // Decodifica la respuesta JSON
    $response = json_decode($result, true);

    // Verifica si la solicitud fue exitosa
    if (isset($response['status']['code']) && $response['status']['code'] === 200) {
        // Redirige al usuario a la página de confirmación
        header('Location: gracias.php');
        exit();
    } else {
        die('Error en la API de Zoho Mail: ' . print_r($response, true));
    }
} else {
    // Si el formulario no se envió, redirige al formulario
    header('Location: contactoz.php');
    exit();
}
?>
        

Crea un formulario HTML (contactoz.php) para que los usuarios ingresen sus datos:

<form action="zoho_send.php" method="POST">
<label for="name">Nombre:</label>
<input type="text" id="name" name="name" required>
<label for="email">Correo electrónico:</label>
<input type="email" id="email" name="email" required>
<label for="message">Mensaje:</label>
<textarea id="message" name="message" rows="5" required></textarea>
<button type="submit">Enviar</button>
</form>

Crea una página de confirmación (gracias.html) para redirigir al usuario después de enviar el correo:

Crea un formulario HTML (contactoz.php) para que los usuarios ingresen sus datos:

<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Gracias</title>
</head>
<body>
<h1>¡Gracias!</h1>
<p>Tu mensaje ha sido enviado correctamente.</p>
</body>
</html>
  1. Completa el formulario en contactoz.php.
  2. Haz clic en "Enviar".
  3. Verifica que el correo llegue a tucorreo@tudominio.com.ar y que se envíe una copia al correo del remitente.
  4. El usuario será redirigido a gracias.html si el correo se envía correctamente.

Aún no hay comentarios en esta página.