使用 Gmail 新 API 发送带有附件的邮件,但不会显示在收件人的收件箱中
Posted
技术标签:
【中文标题】使用 Gmail 新 API 发送带有附件的邮件,但不会显示在收件人的收件箱中【英文标题】:Send Mail with attachment using Gmail new API, but it is not displayed for receiver's inbox 【发布时间】:2014-12-25 00:05:58 【问题描述】:我们正在使用他们提供的最新 API 集成 GMail,作为在我们的应用程序中开发电子邮件客户端的一部分。我们使用的是 Google 提供的 php 客户端库。
查看链接https://developers.google.com/api-client-library/php/
在此我正在尝试发送带有附件的邮件。在这里,我们生成了 message/rfc822 兼容的文本,并使用 'raw' 参数传递它。这里我发现的问题是,在执行代码后,当我检查发送的邮件是否有我通过 GMail API 发送的邮件时,附件显示正确。但是发件人的邮箱没有收到/显示。
查看代码了解更多信息:
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']);
请帮帮我... 提前致谢。
【问题讨论】:
您检查过垃圾邮件文件夹吗?由于错误的标题数据,我遇到了一些电子邮件问题 它正在接收者的收件箱中,但没有附件。你有在 PHP 中使用 GMail API 发送邮件的正常工作代码示例吗? 您的代码对我来说运行良好。我可以在已发送邮件文件夹和我的收件箱中看到附件。我像你一样使用了 csv 附件。您的文件是否以某种方式损坏?您可以使用其他 CSV 文件重试吗? 您作为问题提供的代码原来有助于回答我的问题。向你致敬! 【参考方案1】:替换你的:
$strRawMessage .= 'Content-type: Multipart/Alternative; boundary="' . $boundary . '"' . "\r\n";
与:
$strRawMessage .= 'Content-type: Multipart/Mixed; boundary="' . $boundary . '"' . "\r\n";
【讨论】:
我可以发送带有或不带有附件的邮件,使用上述代码可以正常工作。但是当我在邮件正文中添加图像或在签名中添加图像时,它会显示为框而不是收件人收件箱中的图像。以上是关于使用 Gmail 新 API 发送带有附件的邮件,但不会显示在收件人的收件箱中的主要内容,如果未能解决你的问题,请参考以下文章
调用 gmail api 以发送带有附件(多部分)的电子邮件时,请求的正文如何?