【问题标题】:Clone a message and send it with original "From" headers克隆邮件并使用原始“发件人”标头发送
【发布时间】:2016-03-02 17:01:01
【问题描述】:

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

一切都准备就绪并且工作正常,但有一个细节,即我无法保留原始邮件的“发件人”标头。更具体地说:

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

问题:克隆的电子邮件是原始电子邮件的完美副本,但“发件人”标头显示经过身份验证的用户的电子邮件地址,即我自己 (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) {}
}

【问题讨论】:

    标签: php gmail gmail-api


    【解决方案1】:

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

    【讨论】:

    • 非常感谢。实际上,import 不适用于线程,但 messages.insert 成功了!
    【解决方案2】:

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

    我在为大型消息进行分段上传时遇到了一个重大问题,不过(我是如何登陆这篇文章的)

    “代码”:400, "message": "需要一个 'From' 标头"

    虽然 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 包含所有元数据,包括标签等,但没有实际数据。

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

    我确实认为,当我们可以摆脱它时只使用 import() 会更好,因为它确实节省了 API 调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-02
      • 2014-04-24
      • 2016-03-11
      • 1970-01-01
      • 1970-01-01
      • 2019-04-06
      • 1970-01-01
      相关资源
      最近更新 更多