Как отправить письмо через Gmail API с помощью PHP: подробное руководство

Как отправить письмо через Gmail API с помощью PHP: подробное руководство

Отправка электронных писем является важной частью многих веб-приложений. Gmail API предоставляет мощный и гибкий способ отправки электронных писем с использованием вашей учетной записи Gmail. В этой статье мы подробно рассмотрим, как настроить и использовать Gmail API с помощью PHP для отправки писем.

Необходимые условия

Прежде чем начать, убедитесь, что у вас есть следующее:

  • Учетная запись Google (Gmail)
  • PHP установленный на вашем сервере или локальной машине
  • Composer (менеджер зависимостей для PHP)
  • Google Cloud Platform project

Шаг 1: Создание проекта в Google Cloud Platform

Первым шагом является создание проекта в Google Cloud Platform (GCP) и включение Gmail API.

  1. Перейдите на Google Cloud Console.
  2. Войдите в свою учетную запись Google.
  3. Если у вас нет проекта, создайте новый проект, нажав на кнопку “Select a project” в верхней части страницы, а затем “New Project”. Введите имя проекта и выберите организацию (если необходимо).
  4. После создания проекта, выберите его.

Шаг 2: Включение Gmail API

Теперь вам нужно включить Gmail API для вашего проекта.

  1. В Google Cloud Console перейдите в “APIs & Services” -> “Library”.
  2. Найдите “Gmail API” в строке поиска.
  3. Выберите “Gmail API” из результатов поиска.
  4. Нажмите кнопку “Enable”.

Шаг 3: Создание учетных данных (Credentials)

Для доступа к Gmail API вам понадобятся учетные данные. Мы будем использовать OAuth 2.0.

  1. В Google Cloud Console перейдите в “APIs & Services” -> “Credentials”.
  2. Нажмите кнопку “Create credentials” и выберите “OAuth client ID”.
  3. Если вас попросят настроить экран согласия OAuth, нажмите “Configure consent screen”.
    • Выберите тип пользователя (Internal или External). Для целей тестирования выберите Internal.
    • Введите имя приложения.
    • Укажите email службы поддержки.
    • В разделе “Authorized domains” (если требуется), укажите домен вашего приложения.
    • Сохраните.
  4. Вернитесь к “Create credentials” -> “OAuth client ID”.
  5. Выберите тип приложения “Web application”.
  6. Введите имя для вашего OAuth клиента.
  7. В разделе “Authorized JavaScript origins”, укажите URI вашего приложения (например, http://localhost для локальной разработки).
  8. В разделе “Authorized redirect URIs”, укажите URI, на который Google будет перенаправлять пользователя после авторизации (например, http://localhost/oauth2callback.php). Этот файл мы создадим позже.
  9. Нажмите “Create”.
  10. Сохраните Client ID и Client secret. Они понадобятся вам в дальнейшем.

Шаг 4: Установка Google API Client Library для PHP

Используйте Composer для установки Google API Client Library для PHP.

  1. Откройте терминал или командную строку.
  2. Перейдите в директорию вашего проекта.
  3. Выполните следующую команду:
composer require google/apiclient:^2.0

Это установит Google API Client Library и все необходимые зависимости.

Шаг 5: Создание файлов для авторизации и отправки письма

Теперь создадим несколько PHP файлов:

  • client_secret.json: содержит Client ID и Client secret, которые вы получили на шаге 3.
  • oauth2callback.php: обрабатывает перенаправление после авторизации пользователя и сохраняет access token.
  • send_email.php: отправляет email с использованием Gmail API.

5.1. Создание файла client_secret.json

Создайте файл с именем client_secret.json в корневой директории вашего проекта. Содержимое файла должно быть следующим, заменив YOUR_CLIENT_ID и YOUR_CLIENT_SECRET на ваши значения:

{
 "web": {
  "client_id": "YOUR_CLIENT_ID",
  "client_secret": "YOUR_CLIENT_SECRET",
  "redirect_uris": ["http://localhost/oauth2callback.php"],
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token"
 }
}

5.2. Создание файла oauth2callback.php

Создайте файл с именем oauth2callback.php. Этот файл будет обрабатывать перенаправление после авторизации пользователя и сохранять access token.

<?php
require_once __DIR__ . '/vendor/autoload.php';

session_start();

$client = new Google_Client();
$client->setAuthConfig('client_secret.json');
$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php');
$client->addScope(Google_Service_Gmail::GMAIL_SEND);

if (! isset($_GET['code'])) {
  $auth_url = $client->createAuthUrl();
  header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));
} else {
  $client->fetchAccessTokenWithAuthCode($_GET['code']);
  $accessToken = $client->getAccessToken();
  $_SESSION['access_token'] = $accessToken;
  header('Location: ./'); // Redirect back to the main page
}

5.3. Создание файла send_email.php

Создайте файл с именем send_email.php. Этот файл будет отправлять email с использованием Gmail API.

<?php
require_once __DIR__ . '/vendor/autoload.php';

session_start();

$client = new Google_Client();
$client->setAuthConfig('client_secret.json');
$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php');
$client->addScope(Google_Service_Gmail::GMAIL_SEND);

// Load previously authorized token from session, if one exists.
if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {
    $client->setAccessToken($_SESSION['access_token']);
} elseif (file_exists('token.json')) {
    $accessToken = json_decode(file_get_contents('token.json'), 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 'After approving the token, paste the CODE here: '; 
        $authCode = trim(fgets(STDIN));

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

        if (array_key_exists('error', $accessToken)) {
            throw new Exception(join(', ', $accessToken));
        }
    }
    // Save the token to a file.  This is for demonstration purposes only.
    if (!file_exists(dirname('token.json'))) {
        mkdir(dirname('token.json'), 0700, true);
    }
    file_put_contents('token.json', json_encode($client->getAccessToken()));
}

$service = new Google_Service_Gmail($client);

function sendMessage($service, $userId, $message)
{
    try {
        $message = base64_encode($message);
        $message = str_replace(array('+', '/', '='), array('-', '_', ''), $message);
        $message = new Google_Service_Gmail_Message();
        $message->setRaw($message);
        $message = $service->users_messages->send($userId, $message);
        printf('Message with ID: %s sent successfully.\n', $message->getId());
        return $message;
    } catch (Exception $e) {
        print 'An error occurred: ' . $e->getMessage();
    }
}

function composeMessage($sender, $to, $subject, $body)
{
    $message =  "From: " . $sender . "\r\n";
    $message .= "To: " . $to . "\r\n";
    $message .= "Subject: " . $subject . "\r\n";
    $message .= "Content-Type: text/html; charset=utf-8\r\n\r\n";
    $message .= $body;
    return rtrim($message);
}

$sender = '[email protected]';  // Replace with your Gmail address
$to = '[email protected]';  // Replace with the recipient's email address
$subject = 'Test Email from Gmail API';
$body = '<h1>Hello World!</h1><p>This is a test email sent using Gmail API and PHP.</p>';

$message = composeMessage($sender, $to, $subject, $body);

sendMessage($service, 'me', $message);

Важные замечания:

  • Замените [email protected] на ваш адрес Gmail.
  • Замените [email protected] на адрес электронной почты получателя.
  • Измените http://localhost/oauth2callback.php в send_email.php и client_secret.json, если ваше приложение находится не на локальном сервере.
  • В примере выше, если токен авторизации не найден, он будет запрошен интерактивно через командную строку. Этот подход подходит для локального тестирования. Для production-окружения, рассмотрите сохранение токена в базе данных или другом хранилище и автоматическое обновление токена при необходимости.

Шаг 6: Запуск приложения

  1. Откройте терминал или командную строку.
  2. Перейдите в директорию вашего проекта.
  3. Запустите встроенный веб-сервер PHP (для локального тестирования):
php -S localhost:8000
  1. Откройте браузер и перейдите по адресу http://localhost:8000/oauth2callback.php.
  2. Если вы не авторизовались ранее, вас перенаправит на страницу авторизации Google.
  3. Предоставьте приложению доступ к вашей учетной записи Gmail.
  4. После авторизации вас перенаправит обратно на http://localhost:8000/oauth2callback.php.
  5. Теперь запустите скрипт отправки письма:
php send_email.php

В консоли вы увидите сообщение об успешной отправке письма, а также ID отправленного сообщения.

Шаг 7: Обработка ошибок и улучшение кода

При разработке реального приложения важно обрабатывать ошибки и улучшать код. Вот несколько советов:

  • Обработка исключений: Добавьте блоки try...catch для обработки исключений, которые могут возникнуть при работе с Gmail API.
  • Логирование: Добавьте логирование для отслеживания ошибок и проблем.
  • Конфигурация: Используйте конфигурационные файлы для хранения настроек приложения, таких как адрес электронной почты отправителя, адрес получателя, тема письма и текст письма.
  • Автоматическое обновление токена: Реализуйте автоматическое обновление access token, чтобы не запрашивать авторизацию у пользователя каждый раз.
  • Безопасность: Храните client_secret.json в безопасном месте и не коммитьте его в систему контроля версий. В production-окружении рассмотрите использование переменных окружения или системы управления секретами.
  • Отправка HTML: Отправляйте письма в формате HTML для более привлекательного отображения. Установите заголовок Content-Type: text/html; charset=utf-8.
  • Отправка вложений: Gmail API позволяет отправлять письма с вложениями. Изучите документацию Google API Client Library для PHP, чтобы узнать, как это сделать.

Пример с обработкой ошибок и использованием конфигурации

Ниже приведен пример кода send_email.php с обработкой ошибок и использованием конфигурации (предполагается, что конфигурация хранится в файле config.php):

<?php
require_once __DIR__ . '/vendor/autoload.php';

session_start();

// Include configuration file
require_once 'config.php';

$client = new Google_Client();
$client->setAuthConfig('client_secret.json');
$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php');
$client->addScope(Google_Service_Gmail::GMAIL_SEND);

// Load previously authorized token from session, if one exists.
if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {
    $client->setAccessToken($_SESSION['access_token']);
} elseif (file_exists('token.json')) {
    $accessToken = json_decode(file_get_contents('token.json'), 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 'After approving the token, paste the CODE here: '; 
        $authCode = trim(fgets(STDIN));

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

        if (array_key_exists('error', $accessToken)) {
            throw new Exception(join(', ', $accessToken));
        }
    }
    // Save the token to a file.  This is for demonstration purposes only.
    if (!file_exists(dirname('token.json'))) {
        mkdir(dirname('token.json'), 0700, true);
    }
    file_put_contents('token.json', json_encode($client->getAccessToken()));
}

$service = new Google_Service_Gmail($client);

function sendMessage($service, $userId, $message)
{
    try {
        $message = base64_encode($message);
        $message = str_replace(array('+', '/', '='), array('-', '_', ''), $message);
        $message = new Google_Service_Gmail_Message();
        $message->setRaw($message);
        $message = $service->users_messages->send($userId, $message);
        printf('Message with ID: %s sent successfully.\n', $message->getId());
        return $message;
    } catch (Exception $e) {
        error_log('Error sending message: ' . $e->getMessage());
        return false;
    }
}

function composeMessage($sender, $to, $subject, $body)
{
    $message =  "From: " . $sender . "\r\n";
    $message .= "To: " . $to . "\r\n";
    $message .= "Subject: " . $subject . "\r\n";
    $message .= "Content-Type: text/html; charset=utf-8\r\n\r\n";
    $message .= $body;
    return rtrim($message);
}

try {
    $sender = $config['sender_email'];
    $to = $config['recipient_email'];
    $subject = $config['email_subject'];
    $body = $config['email_body'];

    $message = composeMessage($sender, $to, $subject, $body);

    if (sendMessage($service, 'me', $message)) {
        echo 'Email sent successfully!';
    } else {
        echo 'Failed to send email. Check the logs for details.';
    }

} catch (Exception $e) {
    error_log('An error occurred: ' . $e->getMessage());
    echo 'An error occurred. Check the logs for details.';
}

Пример файла config.php:

<?php

$config = [
    'sender_email' => '[email protected]',
    'recipient_email' => '[email protected]',
    'email_subject' => 'Test Email from Gmail API',
    'email_body' => '<h1>Hello World!</h1><p>This is a test email sent using Gmail API and PHP, with configuration.</p>'
];

Заключение

В этой статье мы рассмотрели, как использовать Gmail API с помощью PHP для отправки электронных писем. Мы рассмотрели создание проекта в Google Cloud Platform, включение Gmail API, создание учетных данных, установку Google API Client Library, создание необходимых файлов и запуск приложения. Также мы рассмотрели обработку ошибок и улучшение кода. Gmail API предоставляет мощный и гибкий способ отправки электронных писем из ваших веб-приложений. Не забывайте про безопасность и лучшие практики при работе с API.

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

0 0 votes
Article Rating
Subscribe
Notify of
0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments