Отправка электронной почты с помощью GMail API на PHP

Я должен заменить почтовую службу из старого проекта на GMail. Однако в проекте используется PHP, а документация по PHP-коду еще не доступна на странице документации Google. Я хотел протестировать отправку электронного письма с простым телом письма, вот код:

require_once __DIR__."/google-api-php-client-2.2.1/vendor/autoload.php";

define("APPLICATION_NAME", "Gmail API PHP Quickstart");
define("CREDENTIALS_PATH", "~/.credentials/gmail-php-quickstart.json");
define("CLIENT_SECRET_PATH", __DIR__."/client_secret.json");

// If modifying these scopes, delete your previously saved credentials
// at ~/.credentials/gmail-php-quickstart.json
define('SCOPES', implode(' ', array(
    Google_Service_Gmail::GMAIL_READONLY)
));

date_default_timezone_set('America/New_York'); // Prevent DateTime tz exception
/*
if (php_sapi_name() != 'cli') {
    throw new Exception('This application must be run on the command line.');
}
*/

/**
* Returns an authorized API client.
* @return Google_Client the authorized client object
*/
function getClient() {
    $client = new Google_Client();
    $client->setApplicationName(APPLICATION_NAME);
    $client->setScopes(SCOPES);
    $client->setAuthConfig(CLIENT_SECRET_PATH);
    $client->setAccessType('offline');

    // Load previously authorized credentials from a file.
    $credentialsPath = expandHomeDirectory(CREDENTIALS_PATH);
    if (file_exists($credentialsPath)) {
        $accessToken = json_decode(file_get_contents($credentialsPath), true);
    }
    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);

        // Store the credentials to disk.
        if (!file_exists(dirname($credentialsPath))) {
            mkdir(dirname($credentialsPath), 0700, true);
        }
        file_put_contents($credentialsPath, json_encode($accessToken));
        printf("Credentials saved to %s\n", $credentialsPath);
    }
    $client->setAccessToken($accessToken);

    // Refresh the token if it's expired.
    if ($client->isAccessTokenExpired()) {
        $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
        file_put_contents($credentialsPath, json_encode($client->getAccessToken()));
    }
    return $client;
}

/**
* Expands the home directory alias '~' to the full path.
* @param string $path the path to expand.
* @return string the expanded path.
*/
function expandHomeDirectory($path) {
    $homeDirectory = getenv('HOME');
    if (empty($homeDirectory)) {
        $homeDirectory = getenv('HOMEDRIVE') . getenv('HOMEPATH');
    }
    return str_replace('~', realpath($homeDirectory), $path);
}

// Get the API client and construct the service object.
$client = getClient();
$service = new Google_Service_Gmail($client);

// Print the labels in the user's account.
$user = 'me';
$message = new Google_Service_Gmail_Message();
$messagePart = new Google_Service_Gmail_MessagePart();
$messagePartBody = new Google_Service_Gmail_MessagePartBody();
$messagePartHeader = new Google_Service_Gmail_MessagePartHeader();

$messagePartBody->setData("TEST BY FAROUK");

$messagePart->setHeader($messagePartHeader);
$messagePart->setBody($messagePartBody);
$message->setPayLoad($messagePart);

$service->users_messages->send($user, $message, null);

Проблема в этой части, которая еще не закончена:

$user = 'me';
$message = new Google_Service_Gmail_Message();
$messagePart = new Google_Service_Gmail_MessagePart();
$messagePartBody = new Google_Service_Gmail_MessagePartBody();
$messagePartHeader = new Google_Service_Gmail_MessagePartHeader();

$messagePartBody->setData("TEST BY ME");

$messagePart->setHeader($messagePartHeader);
$messagePart->setBody($messagePartBody);
$message->setPayLoad($messagePart);

$service->users_messages->send($user, $message, null);

Я знаю, что мне нужно создать объект этих классов, но я не знаю, какие данные я должен установить в параметре, используя их установщики.

Пожалуйста, дайте простой код для отправки "Hello world!" на адрес электронной почты, например [email protected]. Спасибо!

Пожалуйста, проверьте эту ссылку: w3schools.com/php/func_mail_mail.asp и воспользуйтесь функцией почты. Это самый простой способ отправки электронной почты.

Lalbhusan Yadav 12.03.2018 11:21
developers.google.com/gmail/api/quickstart/php
Masivuye Cokile 12.03.2018 11:25

@LalbhusanYadav, клиент хочет, чтобы мы использовали GMail API.

Logos 12.03.2018 11:30

@MasivuyeCokile, на этой странице приведен только пример того, как перечислить метки в клиентской почте. Я прочитал эту страницу и использую ее для создания клиентского объекта.

Logos 12.03.2018 11:32

Итак, вы спрашиваете, как использовать недокументированный API? Скажите клиенту, что это не задокументировано, и взимайте дополнительную плату за потерю времени.

marshal craft 12.03.2018 11:33

Я сам не уверен, @marshalcraft, поэтому и спрашиваю. Кто-нибудь использовал этот API раньше?

Logos 12.03.2018 11:35

Если у вас что-то работает, как вы узнаете, что это правильно и что в какой-то момент не произойдет сбоя? Документация также является гарантией того, что ваше программное обеспечение в некоторой степени работает правильно. В противном случае вам платят за то, что вы собираете что-то на основе информации из обмена стеками?!?!

marshal craft 12.03.2018 11:39

@Logos Что именно недокументировано об этом API? Справка по PHP: developers.google.com/resources/api-libraries/documentation/‌… И общие руководства по созданию и отправке электронных писем: developers.google.com/gmail/api/guides/sending

Loek 12.03.2018 11:43

@Loek, нет четких объяснений того, что может принимать параметр метода и что он возвращает. Посмотрите на класс Google_Service_Gmail_Message например developers.google.com/resources/api-libraries/documentation/‌…

Logos 12.03.2018 11:49

Я не думаю, что функция readonly scope позволит вам отправлять электронные письма. gmail api и php довольно хорошо документированы, если вы посмотрите developers.google.com/gmail/api/quickstart/php

DaImTo 12.03.2018 11:49

@Loek, ссылка, которую вы мне дали, предназначена для Java и Python, а не для PHP

Logos 12.03.2018 11:51

@Logos Я, честно говоря, не знаю, что в этом непонятного. Кроме того, тот факт, что руководство написано на Java, не означает, что вы не можете переписать его на PHP. Взгляните на то, что говорится в руководстве, и посмотрите, сможете ли вы найти соответствующие классы в клиенте PHP. Google - одна из тех компаний, которым вы можете доверять в обеспечении единообразия своих клиентов. Java - это другой синтаксис, но это, вероятно, единственное отличие. Не будьте одним из тех программистов типа «Это написано не на моем любимом языке, поэтому не может работать»;)

Loek 12.03.2018 11:52

Один из атрибутов класса Google_Client - это $users_messages, тип которого - Google_Service_Gmail_Resource_UsersMessages, имеющий метод public function send($userId, Google_Service_Gmail_Message $postBody, $optParams = array()). Это означает, что я должен создать объект Google_Service_Gmail_Message, чтобы использовать метод send(). В документации даже не сказано, для каких атрибутов в классе Google_Service_Gmail_Message и какие опции принимает $optParams.

Logos 12.03.2018 12:16

Возможный дубликат Как отправить электронную почту с помощью gmail api php

Francisco Luz 20.06.2018 10:39
Стоит ли изучать 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 и хотите разрабатывать...
1
14
2 691
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В этом рабочем примере используется учетная запись службы, настройте ее в соответствии со своими потребностями:

    $user_to_impersonate = "[email protected]";
    putenv("GOOGLE_APPLICATION_CREDENTIALS=google-api-php-client/service-account-credentials.json");
    $client = new Google_Client();
    $client->useApplicationDefaultCredentials();
    $client->setSubject($user_to_impersonate);
    $client->setApplicationName("My Mailer");
    $client->setScopes(["https://www.googleapis.com/auth/gmail.compose"]);
    $service = new Google_Service_Gmail($client);
    // Process data
    try {
        $strSubject = "Set the email subject here";
        $strRawMessage = "From: Me<[email protected]>\r\n";
        $strRawMessage .= "To: Foo<[email protected]>\r\n";
        $strRawMessage .= "CC: Bar<[email protected]>\r\n";
        $strRawMessage .= "Subject: =?utf-8?B?" . base64_encode($strSubject) . "?=\r\n";
        $strRawMessage .= "MIME-Version: 1.0\r\n";
        $strRawMessage .= "Content-Type: text/html; charset=utf-8\r\n";
        $strRawMessage .= "Content-Transfer-Encoding: base64" . "\r\n\r\n";
        $strRawMessage .= "Hello World!" . "\r\n";
        // The message needs to be encoded in Base64URL
        $mime = rtrim(strtr(base64_encode($strRawMessage), '+/', '-_'), '=');
        $msg = new Google_Service_Gmail_Message();
        $msg->setRaw($mime);
        //The special value **me** can be used to indicate the authenticated user.
        $service->users_messages->send("me", $msg);
    } catch (Exception $e) {
        print "An error occurred: " . $e->getMessage();
    }

Надеюсь, это поможет вам начать

РЕДАКТИРОВАТЬ

Дальнейшая помощь https://stackoverflow.com/a/37256138/9482295

Не могли бы вы объяснить, для чего эта часть? $mime = rtrim(strtr(base64_encode($strRawMessage), '+/', '-_'), '=');

Logos 13.03.2018 04:15

Как создать файл service-account-credentials.json? Каково содержание файла?

Logos 13.03.2018 04:57

вам нужно будет реализовать собственный поток аутентификации, в зависимости от потребностей вашего приложения. Начать здесь developers.google.com/identity/protocols/OAuth2

trueChazza 13.03.2018 05:26

Я изменил учетные данные и удалил файл в Users/MyUser/.credentials, теперь все заработало! Спасибо!

Logos 13.03.2018 07:32

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