php - 使用 Gmail 新 API 发送带附件的邮件,但不显示在收件人的收件箱中

标签 php email gmail attachment gmail-api

我们正在使用他们提供的最新 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']);
    }
}

请帮帮我... 提前致谢。

最佳答案

替换你的:

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

与:

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

关于php - 使用 Gmail 新 API 发送带附件的邮件,但不显示在收件人的收件箱中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26627755/

相关文章:

php - symfony 1.4 & Doctrine 1.2 - 几个表的一个模型

php - 检查查询字符串 (PHP)

command-line - 向 Gmail 发送 POP3 命令会返回旧邮件

gmail - 骡子 ESB : Retrieving email messages from Gmail using IMAP connector

email - 我可以使用 Go 在 Google 群组上发布新主题吗?

php - 在 WooCommerce 中创建订阅产品时使用 update_post_meta

php - 无法写入 session 数据(文件)

php - codeigniter 将 pdf 文件作为电子邮件附件发送

c# - 如何获取托管 asp.net 应用程序的计算机的 HostName、Ip

php - Laravel 邮件与 g 套件和 XOAUTH2