Как получить все части тела письма? А как узнать, сколько деталей существует?

Я пытаюсь прочитать электронные письма, на которые отвечает Gmail API.

У меня проблемы с доступом ко всем "частям". И нет отличных способов пройти через ответ. Я также не понимаю, сколько частей может существовать, поэтому я могу убедиться, что правильно читаю различные ответы по электронной почте. Я сократил ответ ниже ...

{"payload": {"mimeType": "multipart / mixed", "filename": "",], "body": {"size": 0}, "parts": [{

"body": {
 "size": 0
},
"parts": [
 {
  "partId": "0.0",
  "mimeType": "text/plain",
  "filename": "",
  "headers": [
   {
    "name": "Content-Type",
    "value": "text/plain; charset=\"us-ascii\""
   },
   {
    "name": "Content-Transfer-Encoding",
    "value": "quoted-printable"
   }
  ],
  "body": {
   "size": 2317,
   "data": "RGVhciBNSVQgQ2x1YiBWb2x1bnRlZXJzIGluIEFzaWEsDQoNCkJ5IG5vdyBlYWNoIG9mIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBpbnZpdGF0aW9ucyB0byB0aGUgcmVjZXB0aW9ucyBpbiBib3RoIFNpbmdhcG9yZSBhbmQgSG9uZyBLb25nIHdpdGggUHJlc2lkZW50IFJlaWYgb24gTm92ZW1iZXIgNyBhbmQgTm92ZW1iZXIg"
  }
 },
 {
  "partId": "0.1",
  "mimeType": "text/html",
  "filename": "",
  "headers": [
   {
    "name": "Content-Type",
    "value": "text/html; charset=\"us-ascii\""
   },
   {
    "name": "Content-Transfer-Encoding",
    "value": "quoted-printable"
   }
  ],
  "body": {
   "size": 9116,
   "data": "PGh0bWwgeG1sbnM6dj0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp2bWwiIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIgeG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIgeG1sbnM6bT0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2UvMjA"
  }
 }
]    },    {
"partId": "1",
"mimeType": "text/plain",
"filename": "",
"body": {
 "size": 411,
 "data": "X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NClRoYW5rIHlvdSBmb3IgYWxsb3dpbmcgdXMgdG8gcmVhY2ggeW91IGJ5IGVtYWlsLCB0aGUgbW9zdCBpbW1lZGlhdGUgbWVhbnMgZm9yIHNoYXJpbmcgaW5mb3JtYXRpb24gd2l0aCBNSVQgYWx1bW5pLiANCklmIHlvdSB3b3VsZCBsaWtlIHRvIHVuc3Vic2NyaWJlIGZyb20gdGhpcyBtYWlsaW5nIGxpc3Qgc2VuZCBhIGJsYW5rIGVtYWlsIHRvIGxpc3RfdW5zdWJzY3JpYmVAYWx1bS5taXQuZWR1IGFuZCBwdXQgdGhlIGxpc3QgbmFtZSBpbiB0aGUgc3ViamVjdCBsaW5lLg0KRm9yIGV4YW1wbGU6DQpUbzogbGlzdF91bnN1YnNjcmliZUBhbHVtLm1pdC5lZHUNCkNjOg0KU3ViamVjdDogYXNpYW9mZg0K"
}    }   ]  } }

Что-то мне не хватает?


person echan00    schedule 08.10.2014    source источник


Ответы (4)


Части MIME, которые вы ищете, находятся в массиве. JSON не сообщает вам заранее, сколько элементов находится в массиве. Даже сам MIME не позволяет узнать, сколько частей присутствует, не просматривая все сообщение. Вам просто нужно будет пройти весь массив, чтобы узнать, сколько в нем частей, и обработать каждую часть по мере ее появления.

person Remy Lebeau    schedule 08.10.2014
comment
ясно спасибо. Я полагаю, есть способы легко пройти через json? - person echan00; 08.10.2014
comment
Доступно множество парсеров JSON, я уверен, что вы сможете найти для выбранного вами языка программирования. Если производительность и / или использование памяти являются проблемой, попробуйте найти синтаксический анализатор, поддерживающий модель синтаксического анализа, подобную SAX. - person Remy Lebeau; 08.10.2014
comment
В итоге я решил просто взять электронное письмо в формате RAW и использовать Ruby Email Parser (почтовый гем), чтобы справиться с этим. - person echan00; 08.10.2014
comment
Попутно этот пост мне тоже очень помог: github.com/google/google-api-ruby-client/issues/ - person echan00; 08.10.2014

Сообщение MIME - это не просто массив, это полноценная древовидная структура. Так что вам придется пересечь его, чтобы правильно с ним справиться. К счастью, парсеров JSON предостаточно, и проблему можно легко решить с помощью рекурсии. На многих языках существуют очень полезные библиотеки синтаксического анализа электронной почты, которые могут сделать доступ к традиционным частям (например, отображаемой части text / plain или text / html или вложениям) не слишком трудоемким.

person Eric D    schedule 08.10.2014

Чтобы узнать, сколько частей существует, вы можете просто использовать свойство Length.

Пример :

json.payload.parts.length

В вашем примере это свойство равно 2, потому что есть 2 части.

person Alexis Paques    schedule 28.10.2014

Вам нужно будет настроить функции walker, чтобы проходить через json и выбирать те биты, которые вам нужны. Вот часть того, что я написал. Это может помочь вам запустить ваш код. ПРИМЕЧАНИЕ: это используется внутри wordpress ... отсюда и специальный вызов jQuery. Не нужен, если вам не нужно использовать jquery внутри wordpress.

function makeApiCall() {
gapi.client.load('gmail', 'v1', function() {
    //console.log('inside call: '+myquery);
  var request = gapi.client.gmail.users.messages.list({
    'userId': 'me',
    'q': myquery
  });
  request.execute(function(resp) {
    jQuery(document).ready(function($) {
          //console.log(resp);
          //$('.ASAP-emailhouse').height(300); 
          $.each(resp.messages, function(index, value){
                messageId = value.id;
                var messagerequest = gapi.client.gmail.users.messages.get({
                    'userId': 'me',
                    'id': messageId
                  });//end var message request
                messagerequest.execute(function(messageresp) {
                    //console.log(messageresp); 
                    $.each(messageresp, responsewalker);
                    function responsewalker(key, response){
                        messagedeets={};
                        $.each(messageresp.payload.headers, headerwalker);
                        function headerwalker(headerkey, header){
                            if(header.name =='Date'){
                                d = new Date(header.value);
                                var curr_date = d.getDate();
                                var curr_month = d.getMonth() + 1; //Months are zero based
                                var curr_year = d.getFullYear();
                                var formatteddate = curr_month+'/'+curr_date+'/'+curr_year;
                                messagedeets['date']=formatteddate;
                                //$('.ASAP-emailhouse').append('<p>'+header.value+'</p>');
                            }
                            if(header.name =='Subject'){
                                //console.log(header.value);
                                messagedeets.subject=header.value;
                            }
                        }
                        messagedeets.body = {};
                        $.each(messageresp.payload.parts, walker);
                        function walker(partskey, value) {
                            //console.log(value.body);
                            if (value.body.data !== "undefined") {
                                //console.log(value.body);
                                var messagebody = atob(value.body.data);
                                messagedeets.body.partskey = messagebody;
                            }
                        console.log(messagedeets);
                        $('.ASAP-emailhouse').append('<div class="messagedeets"><p class="message-date">'+messagedeets.date+': <span class="message-subject">'+messagedeets.subject+'</span></p><p>'+messagedeets.body.partskey+'</p></div>');
                        }//end responsewalker
                        //$('.ASAP-emailhouse').append('</li>');
                    }
                    //$('.ASAP-emailhouse').append('</ul>');
                });//end message request
            });//end each message id
      });//end jquery wrapper for wordpress
  });//end request execute list messages
});//end gapi client load gmail

}

person MegPhillips91    schedule 06.11.2014