克隆一条消息并使用原始 "From" headers 发送
Clone a message and send it with original "From" headers
我正在尝试开发一个基于 Gmail API 的 PHP 脚本,它可以在特定时间暂停我的消息,即存档和 un-archive 消息在特定日期时间。
一切都已到位并且有效,但有一个细节,那就是我无法保留原始消息的 "From" headers。更具体地说:
- 由于 CRON 作业,在特定时间检索要暂停的消息的 ID;
- 使用消息 ID,检索并克隆原始格式的消息;
- 删除原始邮件并发送(和接收)克隆邮件 => 这确保电子邮件显示在收件箱顶部。
问题: 克隆的电子邮件是原始电子邮件的完美副本,但 "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 次调用。
我正在尝试开发一个基于 Gmail API 的 PHP 脚本,它可以在特定时间暂停我的消息,即存档和 un-archive 消息在特定日期时间。
一切都已到位并且有效,但有一个细节,那就是我无法保留原始消息的 "From" headers。更具体地说:
- 由于 CRON 作业,在特定时间检索要暂停的消息的 ID;
- 使用消息 ID,检索并克隆原始格式的消息;
- 删除原始邮件并发送(和接收)克隆邮件 => 这确保电子邮件显示在收件箱顶部。
问题: 克隆的电子邮件是原始电子邮件的完美副本,但 "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 次调用。