Send mail with attachment using the new Gmail API, but it doesn’t appear for recipient inbox

We integrate GMail using the latest API provided by them as part of the development of the email client in our application. We use the PHP client library provided by Google.

See the link https://developers.google.com/api-client-library/php/

In this I am trying to send mail with the application. Here we created text compatible with the / rfc 822 message and passed it with the "raw" option. Here is the problem that I found after executing the code, when I checked the sent email to the mail that I sent via the GMail API, the attachments are displayed correctly. But it is not received / displayed for the sender mailbox.

See the code for more information:

require_once DOCUMENT_ROOT . '/../library/google/src/Google/Client.php'; require_once DOCUMENT_ROOT . '/../library/google/src/Google/Service/Gmail.php'; function encodeRecipients($recipient){ $recipientsCharset = 'utf-8'; if (preg_match("/(.*)<(.*)>/", $recipient, $regs)) { $recipient = '=?' . $recipientsCharset . '?B?'.base64_encode($regs[1]).'?= <'.$regs[2].'>'; } return $recipient; } $isAccessCodeExpired = 0; $arrAccessToken = array(); $session = new Zend_Session_Namespace(); $client = new Google_Client(); $client->setClientId($this->client_id); $client->setClientSecret($this->client_secret); $client->setRedirectUri($this->redirect_uri); $client->setAccessType('offline'); $client->setApprovalPrompt('force'); $client->addScope("https://mail.google.com/"); $client->addScope("https://www.googleapis.com/auth/gmail.compose"); $client->addScope("https://www.googleapis.com/auth/gmail.modify"); $client->addScope("https://www.googleapis.com/auth/gmail.readonly"); if ($this->getRequest()->getParam('code')) { $code = $this->getRequest()->getParam('code'); $client->authenticate($code); $session->gmail_access_token = $client->getAccessToken(); //$redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']; $redirect = BASE_PATH . '/oauth2callback'; header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL)); } $isAccessCodeExpired = $client->isAccessTokenExpired(); if (isset($session->gmail_access_token) && $session->gmail_access_token != "" && $isAccessCodeExpired !== 1) { $client->setAccessToken($session->gmail_access_token); $objGMail = new Google_Service_Gmail($client); $strMailContent = 'This is a test mail which is sent via using Gmail API client library.<br/><br/><br/>Thanks,<br/>GMail API Team.'; $strMailTextVersion = strip_tags($strMailContent, ''); $strRawMessage = ""; $boundary = uniqid(rand(), true); $subjectCharset = $charset = 'utf-8'; $strToMailName = 'To User Name'; $strToMail = ' toemail@gmail.com '; $strSesFromName = 'From User Name'; $strSesFromEmail = ' fromemail@gmail.com '; $strSubject = 'Test mail using GMail API - with attachment - ' . date('M d, Y h:i:s A'); $strRawMessage .= 'To: ' . encodeRecipients($strToMailName . " <" . $strToMail . ">") . "\r\n"; $strRawMessage .= 'From: '. encodeRecipients($strSesFromName . " <" . $strSesFromEmail . ">") . "\r\n"; $strRawMessage .= 'Subject: =?' . $subjectCharset . '?B?' . base64_encode($strSubject) . "?=\r\n"; $strRawMessage .= 'MIME-Version: 1.0' . "\r\n"; $strRawMessage .= 'Content-type: Multipart/Alternative; boundary="' . $boundary . '"' . "\r\n"; $filePath = '/home/server/Downloads/credentials.csv'; $finfo = finfo_open(FILEINFO_MIME_TYPE); // return mime type ala mimetype extension $mimeType = finfo_file($finfo, $filePath); $fileName = 'credentials.csv'; $fileData = base64_encode(file_get_contents($filePath)); $strRawMessage .= "\r\n--{$boundary}\r\n"; $strRawMessage .= 'Content-Type: '. $mimeType .'; name="'. $fileName .'";' . "\r\n"; $strRawMessage .= 'Content-ID: <' . $strSesFromEmail . '>' . "\r\n"; $strRawMessage .= 'Content-Description: ' . $fileName . ';' . "\r\n"; $strRawMessage .= 'Content-Disposition: attachment; filename="' . $fileName . '"; size=' . filesize($filePath). ';' . "\r\n"; $strRawMessage .= 'Content-Transfer-Encoding: base64' . "\r\n\r\n"; $strRawMessage .= chunk_split(base64_encode(file_get_contents($filePath)), 76, "\n") . "\r\n"; $strRawMessage .= '--' . $boundary . "\r\n"; $strRawMessage .= "\r\n--{$boundary}\r\n"; $strRawMessage .= 'Content-Type: text/plain; charset=' . $charset . "\r\n"; $strRawMessage .= 'Content-Transfer-Encoding: 7bit' . "\r\n\r\n"; $strRawMessage .= $strMailTextVersion . "\r\n"; $strRawMessage .= "--{$boundary}\r\n"; $strRawMessage .= 'Content-Type: text/html; charset=' . $charset . "\r\n"; $strRawMessage .= 'Content-Transfer-Encoding: quoted-printable' . "\r\n\r\n"; $strRawMessage .= $strMailContent . "\r\n"; //Send Mails //Prepare the message in message/rfc822 try { // The message needs to be encoded in Base64URL $mime = rtrim(strtr(base64_encode($strRawMessage), '+/', '-_'), '='); $msg = new Google_Service_Gmail_Message(); $msg->setRaw($mime); $objSentMsg = $objGMail->users_messages->send("me", $msg); print('Message sent object'); print($objSentMsg); } catch (Exception $e) { print($e->getMessage()); unset($_SESSION['access_token']); } } 

Please help me ... Thanks in advance.

+5
source share
1 answer

Replace:

 $strRawMessage .= 'Content-type: Multipart/Alternative; boundary="' . $boundary . '"' . "\r\n"; 

from:

 $strRawMessage .= 'Content-type: Multipart/Mixed; boundary="' . $boundary . '"' . "\r\n"; 
+2
source

Source: https://habr.com/ru/post/1205768/


All Articles