Php 从带有特定标签的电子邮件下载所有附件

Php 从带有特定标签的电子邮件下载所有附件,php,gmail-api,Php,Gmail Api,我想写一个脚本,使用Gmail API从所有带有labelID标签的电子邮件下载所有附件 我在一年级完成了教学 使用我期望的listUsersMessages(…)->getMessages()返回所有带有标签的电子邮件 然而,正如我的终端输出所示,我在这里收到的所有电子邮件都没有指定标签。我做错了什么 问题在于foreach循环中的$message对象几乎不包含任何数据。需要使用full参数启动消息对象。这是下载带有标签_41的邮件的所有附件的最终代码 也许其他人会在寻找简单的解决方案。请参阅

我想写一个脚本,使用Gmail API从所有带有labelID标签的电子邮件下载所有附件

我在一年级完成了教学

使用我期望的
listUsersMessages(…)->getMessages()
返回所有带有标签的电子邮件

然而,正如我的终端输出所示,我在这里收到的所有电子邮件都没有指定标签。我做错了什么


问题在于foreach循环中的
$message
对象几乎不包含任何数据。需要使用
full
参数启动消息对象。这是下载带有标签_41的邮件的所有附件的最终代码


也许其他人会在寻找简单的解决方案。请参阅下面可以用作Google脚本的脚本代码(Java脚本,请参阅此处的开始教程:):

//全局
//要提取到驱动器的文件扩展名数组
var fileTypesToExtract=['sql','gz'];
//google drive i中的文件夹名称,将放置哪些文件
var folderName='BACKUPS';
//处理邮件消息后将应用的标签的名称
var labelName='SavedToGDrive';
函数GmailToDrive(){
//构建查询以搜索电子邮件
var查询=“”;
//取消按文件类型搜索的注释
//filename:jpg或filename:tif或filename:gif或filename:png或filename:bmp或filename:svg';//'after:'+formattedDate+
//for(fileTypesToExtract中的变量i){
//query+=(query==''?('filename:'+fileTypesToExtract[i]):('或filename:'+fileTypesToExtract[i]);
//}
//query='in:inbox有:nouserlabels'+query;
//按标签搜索
查询='标签:备份不动产备份';
//排除已下载的邮件,以便可以重复运行此脚本
如果超时发生
query=query+'而不是label:savedtogdrive';
var threads=GmailApp.search(查询);
var label=GetgMillabel(labelName);
var父文件夹;
如果(螺纹长度>0){
parentFolder=getFolder(folderName);
}
var root=DriveApp.getRootFolder();
for(线程中的变量i){
var mesgs=threads[i].getMessages();
用于(在mesgs中为j值){
//获取附件
var attachments=mesgs[j].getAttachments();
for(附件中的变量k){
var附件=附件[k];
var isDefinedType=检查定义类型(附件);
如果(!isDefinedType)继续;
var attachmentBlob=attachment.copyBlob();
var file=DriveApp.createFile(attachmentBlob);
parentFolder.addFile(文件);
root.removeFile(文件);
}
}
线程[i]。添加标签(标签);
}
}
//此函数将获取Google drive中的父文件夹
函数getFolder(folderName){
var文件夹;
var fi=DriveApp.getFoldersByName(folderName);
if(fi.hasNext()){
folder=fi.next();
}
否则{
folder=DriveApp.createFolder(folderName);
}
返回文件夹;
}
//getDate n天以前
//n必须是整数
函数getDateNDaysBack(n){
n=parseInt(n);
变量日期=新日期();
date.setDate(date.getDate()-n);
return Utilities.formatDate(日期,Session.getScriptTimeZone(),'yyyy/MM/dd');
}
函数getgmailabel(名称){
var label=GmailApp.getUserLabelByName(名称);
如果(!标签){
label=GmailApp.createLabel(名称);
}
退货标签;
}
//此函数将检查filextension类型。
//并返回布尔值
功能检查定义类型(附件){
var fileName=attachment.getName();
var temp=fileName.split('.');
var fileExtension=temp[temp.length-1].toLowerCase();
if(fileTypesToExtract.indexOf(fileExtension)!=-1)返回true;
否则返回false;

}
尝试使用字符串参数,而不是数组
$labels=array('labelIds'=>'Label_41')参数也应该是Id,而不是文本,除了一些标准的,如“收件箱”。检查此示例@Axalix thx中的链接。在你参考代码的帮助下,我设法让它工作。Google API for PHP确实需要一些改进。Google API文档被称为“垃圾”。。。
$client = getClient();
$service = new Google_Service_Gmail($client);

$user = 'me';
$labels = array('labelIds' => array('Label_41'));
$messagesResponse = $service->users_messages->listUsersMessages($user, $labels);
$messages = $messagesResponse->getMessages();

foreach ($messages as $message) {
    echo 'Message with ID: ' . $message->getId();

    echo $message->getLabelIds();

    if($message->getLabelIds() == null) echo " (NO LABEL) ";

    echo  "\n";
}
client = getClient();
$service = new Google_Service_Gmail($client);

$user = 'me';
$optParams = [];
$optParams['labelIds'] = 'Label_41';

$messagesResponse = $service->users_messages->listUsersMessages($user, $optParams);
$messages = $messagesResponse->getMessages();

foreach ($messages as $message) {
    echo 'Message with ID: ' . $message->getId();

    $messageId = $message->getId();

    $optParamsGet = [];
    $optParamsGet['format'] = 'full'; // Display message in payload
    $message = $service->users_messages->get($user,$messageId,$optParamsGet);

    $messagePayload = $message->getPayload();
    $headers = $message->getPayload()->getHeaders();
    $parts = $message->getPayload()->getParts();

    $timestamp = ($message->internalDate) / 1000;

    $date = date('Y-m-d H-i-s', $timestamp);

    foreach ($parts as $part) {
      if($part->mimeType == 'application/pdf'){
          $attachmentId = $part['body']['attachmentId'];
      }
    }

    $data = $service->users_messages_attachments->get($user, $messageId, $attachmentId);
    $data = $data->data;
    $data = strtr($data, array('-' => '+', '_' => '/'));

    $filename = "Car2Go " . $date . ".pdf";

    if(!file_exists($filename)){
      $fh = fopen($filename, "w+");
      fwrite($fh, base64_decode($data));
      fclose($fh);
    }
    else{
      'File ' . $filename . 'already exists!';
    }

    echo  "\n";
}