Search code examples
phpemailgmail-apisendemail-bounces

Bounce <[email protected]> Gmail API sending failure


I'm trying to send emails with the google API. I'm able to read emails, authenticate with oath using a client_secret.json file per the quickstart instructions. I've almost got sending emails working, but am unable to send successfully.

My email is bouncing and I'm unable to specify the email I'm sending to (hence the [email protected] address).

Code here bellow works for the most part. I've commented out the parts that work: (reading emails).

Code:

<?php
require 'google-api-php-client/src/Google/autoload.php';

define('APPLICATION_NAME', 'Gmail API Quickstart');
define('CREDENTIALS_PATH', '~/.credentials/gmail-api-quickstart.json');
define('CLIENT_SECRET_PATH', 'client_secret.json');
define('SCOPES', implode(' ', array(
  Google_Service_Gmail::MAIL_GOOGLE_COM,
  Google_Service_Gmail::GMAIL_COMPOSE)
));

/**
 * 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->setAuthConfigFile(CLIENT_SECRET_PATH);
  $client->setAccessType('offline');

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

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

  // Refresh the token if it's expired.
  if ($client->isAccessTokenExpired()) {
    $client->refreshToken($client->getRefreshToken());
    file_put_contents($credentialsPath, $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);


$msg = new Google_Service_Gmail_Message(); 
$mime = rtrim(strtr(base64_encode("TEST MESSAGE OR SOMETHING"), '+/', '-_'), '=');
$msg->setRaw($mime); 

// Print the labels in the user's account.
$userId = 'me';

function sendMessage($service, $userId, $message) {
  try {
    $message = $service->users_messages->send($userId, $message);
    print 'Message with ID: ' . $message->getId() . ' sent.';
    // <----------- GET'S HERE AND THIS WORKS
    return $message;
  } catch (Exception $e) {
    print 'An error occurred: ' . $e->getMessage();
  }
}

try {
    sendMessage($service, $userId, $msg); 
} catch (Exception $Ex ) {
    echo $Ex->getMessage(); 
}

Email Response (In my Gmail inbox):

An error occurred. Your message was not sent.

TEST MESSAGE OR SOMETHING Date: Tue, 21 Jul 2015 14:51:12 -0700 Message-Id: <

I'm not sure how to even specify the destination address, like [email protected]. I couldn't really find much in the way of documentation. If someone could help me out or point me in the right direction, I'd be greatly appreciative.


Solution

  • You need to put an entire RFC822 email message in the raw field. So where you have "TEST MESSAGE OR SOMETHING" you should have a string like:

    To: [email protected]
    From: [email protected]
    Subject: this is my cool subject
    
    here's a text/plain email, neato?
    

    remember to have \r\n between lines and two between headers and body. seems for php that PEAR::Mail_Mime is a good library for constructing such rfc822 MIME email message strings.

    For more details, see Sending Email.