【问题标题】:Sending e-mail with GMail API in PHP在 PHP 中使用 GMail API 发送电子邮件
【发布时间】:2018-08-20 07:55:13
【问题描述】:

我应该将邮件服务从旧项目替换为 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!”发送到 foo@gmail.com 等电子邮件地址。谢谢!

【问题讨论】:

标签: php email google-api gmail


【解决方案1】:

此工作示例使用服务帐户,请根据您的需要进行调整:

    $user_to_impersonate = "email_to_impersonate@yourdomain.com";
    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<myemail@mydomain.com>\r\n";
        $strRawMessage .= "To: Foo<foo@gmail.com>\r\n";
        $strRawMessage .= "CC: Bar<bar@gmail.com>\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), '+/', '-_'), '=');
  • 如何创建service-account-credentials.json 文件?文件内容是什么?
  • 您需要实现自己的身份验证流程,具体取决于您的应用程序需求。从这里开始developers.google.com/identity/protocols/OAuth2
  • 我修改了凭据并删除了Users/MyUser/.credentials 中的文件,现在可以了!谢谢!
猜你喜欢
  • 2014-10-30
  • 2017-05-25
  • 2019-04-17
  • 2014-08-27
  • 2018-01-26
  • 2021-09-11
  • 2014-09-16
  • 2016-01-20
  • 2015-01-02
相关资源
最近更新 更多