【问题标题】:Gmail REST API Users.messages.attachments: get - not returning filenameGmail REST API Users.messages.attachments:获取 - 不返回文件名
【发布时间】:2015-11-10 04:44:24
【问题描述】:

我需要能够在任何电子邮件正文中收集多个附件。我的测试用例基于多部分/混合格式的电子邮件。我能够正确获取单个附件的文件名。当在回调中包含console.log('Filename' + part.filename) 时,可以很容易地看到问题。它永远是空的。看起来数组 - 部分总是“卡”在索引的最后一个,在我的情况下,这会给我一个空的 part.filename 和一个错误的 part.mimeType。

我尝试了各种解决方法,包括推送和弹出正确的文件名,但这不起作用,因为附件是按随机顺序返回的..

我相信这是一个错误,我希望这可以被识别为一个错误,因为我真的需要修复这个问题。

编辑:经过更多调查后的其他信息: 1. request.execute(function( attachment).. 只运行一次 - 在 for..loop 完成后,即使有多个 附件。但它会返回正确的附件 - 也 多个,按随机顺序排列。

  1. request.execute(function( 附件)永远不会包含附件ID,只有原始数据 和大小。

  2. 附件对象request.execute(function( 附件)与 var parts = 报告的大小不同 message.payload.parts;这使得它无法用于关联。

  3. request.execute(function(attachment) 只会使用最后的数据 来自 var parts = message.payload.parts;这与 附件。

function getAttachments(userId, message, callback) { var parts = message.payload.parts;

for (var i = 0; i < parts.length; i++) {
part = parts[i];
if (part.filename && part.filename.length > 0){
    var attachId = part.body.attachmentId;
    myfilename.push( part.filename )
    var request = gapi.client.gmail.users.messages.attachments.get({
    'id': attachId,
    'messageId': message.id,
    'userId': userId
    }); 

request.execute(function( attachment) {

// PROBLEM: part.filename and part.mimeType is empty or wrong.            
callback( **part.filename**, part.mimeType, attachment );
});
}
}

}

function callback( name, mime, att ) {
// PROBLEM: empty name, and wrong mime 
console.log( 'Filnavn: ' + name );
if (name == '') {
 name = myfilename.pop();
}

【问题讨论】:

    标签: rest get gmail attachment gmail-api


    【解决方案1】:

    您需要保存文件上下文,以便在进行回调时,它知道原始文件名和 mimetype,如下所示:

    function getAttachments(userId, message, callback) {
      var parts = message.payload.parts;
      var attachments = [];//The attachments cache
      for (var i = 0; i < parts.length; i++) {
        part = parts[i];
        if (part.filename && part.filename.length > 0) {
            var attachId = part.body.attachmentId;
            myfilename.push(part.filename);
            console.log('attachId=' + attachId);
            console.log('MessageID=' + message.id);
            console.log('UserID=' + userId);
            var request = gapi.client.gmail.users.messages.attachments.get({
                'id': attachId,
                'messageId': message.id,
                'userId': userId
            });
            attachments[attachId] = {filename: part.filename, mimeType:part.mimeType};
            request.execute(function (attachment) {
            // PROBLEM: part.filename and part.mimeType is empty or wrong.            
                var file = attachments[attachment.attachmentId];
                callback(file.filename, file.mimeType, attachment);
            });
        }
      }
    }
    

    【讨论】:

    • 嗨@Furhan Shabir,感谢您的评论,但我看不到您在此处绘制的全图!如果回调中不存在来自 part.filename 的数据,我不明白递归将如何帮助我?可以举个例子吗?
    • 如果您使用 get() 格式='full' 从 gmail API 接收消息,那么您必须收到该部分。然而,该部分可能是“多部分/混合”或“多部分/替代”类型,这表明它本身包含不同 MIME 类型的部分。这就是递归发挥作用的地方。
    • 嗨@Furhan Shabir - 澄清一下:我确实得到了part.filename 和消息。我只是无法在同一个回调中获得它们。无法将回调中显示的 att 和 name 关联起来。
    • @petrusjak 您需要保存上下文,以便在调用 callback() 时,它具有适当的参数。相应地修改了我的答案。
    • 所以我按照你的类比尝试了你的代码,但这只是让我再次确信问题与使用 request.execute(function(attachment) 有关事实上,返回的附件对象没有任何attachId,因此不可能与之前获取的ID相关联。当另一个for循环完成时,request.execute也只执行一次 - 所以 - 任何更多的想法都会很棒!
    【解决方案2】:

    不确定您是否已解决此问题。我面临同样的问题。 当我看着谷歌ApI Gmail Attachment Play ground 即使我有这些字段:attachmentId、data、size。响应只是没有给出 attachmentId。我想我们可能不应该使用 bathQuery 方法。

    【讨论】:

    • 我在 gapi.client.gmail.users.messages.attachments 这条线上遇到问题,gmail 没有定义
    猜你喜欢
    • 2015-06-30
    • 1970-01-01
    • 2018-05-06
    • 2018-03-15
    • 2016-12-12
    • 2022-10-25
    • 2014-08-19
    • 2018-10-25
    • 2018-07-27
    相关资源
    最近更新 更多