克隆邮件并使用原始“发件人”标头发送邮件

时间:2016-03-02 17:01:02

标签: php gmail gmail-api

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

一切都到位并且工作但细节,即我无法保留原始邮件的“发件人”标题。更具体地说:

  1. 由于CRON作业,在特定时间检索要暂停的消息的ID;
  2. 使用消息ID,检索并克隆原始格式的消息;
  3. 删除原始邮件并发送(并收到)克隆的邮件=>这可确保电子邮件显示在收件箱顶部。
  4. 问题:克隆的电子邮件是原始邮件的完美副本,但“From”标题显示经过身份验证的用户的电子邮件地址,即我自己(username@gmail.com)。< / p>

    //[...] 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) {}
    }
    

2 个答案:

答案 0 :(得分:1)

messages.send()要求From:地址在经过身份验证的用户的控制之下。请改用messages.import()

答案 1 :(得分:0)

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

我在为大型邮件进行多部分上传时遇到了一个重大问题,但是(我是如何登陆这篇文章的)

“code”:400,   “message”:“预期单个'来自'标题”

虽然Import希望您使用raw(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包含所有元数据,包括标签等,但没有实际数据。

感谢{{3}}

我确实认为只要使用import(),我们就可以使用它更好,因为它可以节省API调用。