PHP Gmail API. Сообщения, отправленные самому себе, не отображаются в клиенте Outlook для настольных ПК, но подходят для других получателей. - PullRequest
0 голосов
/ 08 ноября 2019

Я использую Gmail API (используя код PHP) для отправки электронных писем. Если я отправляю электронное письмо самому себе, я могу прекрасно просматривать его в клиенте Gmail (телефоне и в Интернете), но тело не отображается в клиенте Outlook для настольных ПК. Однако любой человек, которому я отправляю CC или BCC в один и тот же адрес электронной почты, может прекрасно видеть полное сообщение в клиенте Outlook.

Кажется, что отправленные вам сообщения не будут отображать содержимое тела в Outlook, но все остальные могутувидеть то же сообщение отлично. Если кто-то еще отправит мне письмо и отправит мне CC, я тогда увижу содержимое.

Есть ли в Outlook какое-то требование для отображения сообщений, отправленных самому себе, или есть какой-то заголовок, который нужно отправить сGMAIL API.

Сводка. Если я отправитель, я не могу видеть содержимое сообщения в Outlook. Если я получатель, но не отправитель, в Outlook Client все отлично отображается.

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /**
     * NEW WORKING VERSION
     * @param $arg_email_data
     * @param bool $arg_attachments
     */
    public function sendMessage($arg_email_data, $arg_attachments = false) {
        //
        // DO NOT MOVE THE SECTIONS AROUND, AS THIS MIGHT BREAK THE CONTENT STRUCTURE
        //
        $this->client->setConfig('subject', $arg_email_data['from']);

        $strMailContent = $arg_email_data['body'];

        $strRawMessage = "";
        $subjectCharset = $charset = 'utf-8';
        $strSesFromName = $arg_email_data['from_name'];
        $strSesFromEmail = $arg_email_data['from'];
        $strSubject = $arg_email_data['subject'];

        //boundary definitions - DO NOT CHANGE
        $boundary = uniqid(rand(), true);
        $strStartBoundary = "\r\n--{$boundary}\r\n";
        $strEndBoundary = '--' . $boundary . "\r\n";

        //to
        $strToMailName = isset($arg_email_data['to_name']) ? $arg_email_data['to_name'] : $arg_email_data['to'];
        $strRawMessage .= 'To: ' .$strToMailName . " <" . $arg_email_data['to'] . ">" . "\r\n";

        //cc
        if(isset($arg_email_data['cc']) && !empty($arg_email_data['cc'])) {
            $strRawMessage .= $this->add_recipient_list("cc", $arg_email_data["cc"]);
        }

        //bcc
        if(isset($arg_email_data['bcc']) && !empty($arg_email_data['bcc'])) {
            $strRawMessage .= $this->add_recipient_list("bcc", $arg_email_data["bcc"]);
        }

        //from
        $strRawMessage .= 'From: '.$strSesFromName . " <" . $strSesFromEmail . ">" . "\r\n";

        //Subject
        $strRawMessage .= 'Subject: =?' . $subjectCharset . '?B?' . base64_encode($strSubject) . "?=\r\n";

        //TODO - Add reply to tag

        // SECTION --------------------------------------------------------------
        $strRawMessage .= 'MIME-Version: 1.0' . "\r\n";

        //Mixed Content Type - SHOULD BE AT TOP ACCORDING TO MIME
        $strRawMessage .= 'Content-type: Multipart/Mixed; boundary="' . $boundary . '"' . "\r\n";

        // SECTION --------------------------------------------------------------
        // TEXT ONLY VERSION - DO NOT MOVE
        if(1==2) { //WE DON'T SEND PLAIN TEXT MAILS ANY LONGER
            //$strRawMessage .= "\r\n--{$boundary}\r\n";
            $strRawMessage .= $strStartBoundary;
            $strRawMessage .= 'Content-Type: text/plain; charset=' . $charset . "\r\n";
            $strRawMessage .= 'Content-Transfer-Encoding: 7bit' . "\r\n\r\n";
            $strRawMessage .= 'This is a text body' . "\r\n";
            $strRawMessage .= $strEndBoundary;
        }
        // END SECTION --------------------------------------------------------------

        // SECTION --------------------------------------------------------------
        //HTML Section - DO NOT MOVE
        $strRawMessage .= $strStartBoundary;
        $strRawMessage .= 'Content-Type: text/html; charset=' . $charset . "\r\n";
        $strRawMessage .= 'Content-Transfer-Encoding: base64' . "\r\n\r\n";
        $strRawMessage .= $strMailContent . "\r\n";
        $strRawMessage .= $strEndBoundary;
        // END SECTION --------------------------------------------------------------


        // SECTION --------------------------------------------------------------
        // ATTACHMENTS - DO NOT MOVE
        if(1==1) {
            if ($arg_attachments && count($arg_attachments) > 0) {

                foreach ($arg_attachments as $attachment) {
                    $filePath = $attachment['filepath'];
                    $finfo = @finfo_open(FILEINFO_MIME_TYPE); // return mime type ala mimetype extension
                    $mimeType = finfo_file($finfo, $filePath);
                    $fileName = $attachment['filename'];

                    $strRawMessage .= $strStartBoundary;
                    $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 .= base64_encode(file_get_contents($filePath)) . "\r\n";
                    $strRawMessage .= $strEndBoundary;
                }

            }
        }
        // END SECTION --------------------------------------------------------------


        //Send the Message 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);
            if($this->service->users_messages->send($strSesFromEmail, $msg)) {
                //echo 'sent';
                return true;
            } else {
                echo('Failed');
                //$this->slack->send(json_encode($arg_email_data), 'integra-errors');
            }
        } catch (Exception $e) {
            $this->slack->send($e->getMessage() . 'MSG: ' . json_encode($arg_email_data), 'integra-errors');
            print($e->getMessage());
            unset($_SESSION['access_token']);
        }
        return false;
    }

Я ценю, что большинство людей спросят: «Почему вы хотите отправлять сообщения себе?»но наши сотрудники по продажам отправляют предложение клиенту, ему нравится, когда его электронная почта отправляется в CC, чтобы у него была запись предложения, которое они отправили в свой почтовый ящик.

Это хорошо для тех, кто использует Gmail в браузере, но некоторые наши сотрудники используют Outlook (по другим причинам), и это вызовет у них проблемы.

Будем благодарны за любые мысли и идеи. .

С уважением

Джеймс

...