克隆一条消息并使用原始 "From" headers 发送

Clone a message and send it with original "From" headers

我正在尝试开发一个基于 Gmail API 的 PHP 脚本,它可以在特定时间暂停我的消息,即存档和 un-archive 消息在特定日期时间。

一切都已到位并且有效,但有一个细节,那就是我无法保留原始消息的 "From" headers。更具体地说:

  1. 由于 CRON 作业,在特定时间检索要暂停的消息的 ID;
  2. 使用消息 ID,检索并克隆原始格式的消息;
  3. 删除原始邮件并发送(和接收)克隆邮件 => 这确保电子邮件显示在收件箱顶部。

问题: 克隆的电子邮件是原始电子邮件的完美副本,但 "From" headers 显示经过身份验证的用户的电子邮件地址,即我自己 (username@gmail.com).

//[...] object $this->message

private function cloneMail() {

   // GET RAW message
   $this->message->raw = $this->gmail->users_messages->get(
                                        $this->message->user, 
                                        $this->message->id,
                                        array('format'=>'raw')
                                       );

   try {

     // INSERT original message
     $inserted = $this->gmail->users_messages->delete(
                                              $this->message->user,
                                              $this->message->id
                                                 );

        // ONCE DELETED, SEND CLONED EMAIL    
        if ($deleted->getId()) {
            try {
                $this->gmail->users_messages->send(
                                           $this->message->user, 
                                           $this->message->raw
                                           );
                } catch (Exception $e) {
                    // -- Fallback...
                }
          }

    } catch(Exception $e) {}
}

[更新] 使用 messages.insert()

的工作解决方案
private function cloneMail() {

   // GET RAW message
   $this->message->raw = $this->gmail->users_messages->get(
                                        $this->message->user, 
                                        $this->message->id,
                                        array('format'=>'raw')
                                       );

   try {

     // DELETE original message
     $deleted = $this->gmail->users_messages->delete(
                                              $this->message->user,
                                              $this->message->id
                                                 );

        // ONCE DELETED, SEND CLONED EMAIL    
        if ($deleted->getId()) {
            try {
                $this->gmail->users_messages->insert(
                                           $this->message->user, 
                                           $this->message->raw
                                           );
                } catch (Exception $e) {
                    // -- Fallback...
                }
          }

    } catch(Exception $e) {}
}

messages.send() requires that the From: address be under the control of the authenticated user. Use messages.import() 代替。

我成功地使用了 import() 并获得了线程支持。

我在为大消息进行分段上传时遇到了一个主要问题,尽管如此(我是如何着陆在这个 post 上的)

"code": 400, "message": "Expected a single 'From' header"

虽然 Import 希望您使用原始(base64 编码的消息),但 Google_Http_MediaFileUpload() 希望您使用 ASCII 版本,因此您必须解码原始消息并执行以下操作:

$ret = $service->users_messages->import( $user, $newMessage, array( 'internalDateSource' => "dateHeader", 'uploadType'=>"multipart" ) );

$media = new Google_Http_MediaFileUpload( $client, $ret, 'message/rfc822', $textMessage, true, $chunkSize );

$media->setFileSize( strlen( $rawMessage ) );

// upload
$status = false;
while( $status == false ) {
        try {
                $status = $media->nextChunk();
        }  catch( Exception $e ) {
                echo "An error occurred: {$e->getMessage()} \n";

                exit();

        }
}

$newMessage 具有所有元数据,包括标签等,但 none 实际数据。

感谢http://michiel.vanbaak.eu/2016/02/27/sending-big-email-using-google-php-api-client-and-gmail/

我确实认为在我们可以摆脱它的情况下只使用 import() 更好,因为它确实节省了 API 次调用。