2014-07-14 26 views
7

Tôi đang cố sử dụng API Gmail để nhận email của người dùng, lấy chủ đề và nội dung thư rồi hiển thị nó trên trang web. Tôi sẽ làm những thứ khác với nó, nhưng đây là phần mà tôi gặp khó khăn. Tôi đang sử dụng Angular.js.Gmail API - Nội dung thư phân tích cú pháp (giải mã Base64?) Với Javascript

Đây là cuộc gọi API của tôi:

function makeApiCall() { 
    gapi.client.load('gmail', 'v1', function() { 
    var request = gapi.client.gmail.users.messages.list({ 
     labelIds: ['INBOX'] 
    }); 
    request.execute(function(resp) { 
     var content = document.getElementById("message-list"); 
     angular.forEach(resp, function(message) { 
     var email = gapi.client.gmail.users.messages.get({'id': message.id}); 
     // var raw = email.payload.parts; 
     // console.log(raw); 
     content.innerHTML += JSON.stringify(email) + "<br>"; 
     }) 
    }); 
    }); 
} 

Vì vậy gapi.client.gmail.users.messages.list trả về một mảng các thông điệp của tôi, với số ID của họ. Đó là làm việc.

Cuộc gọi đến gapi.client.gmail.users.messages.get({<specific message ID>}) kết quả đầu ra này - {"B":{"method":"gmail.users.messages.get","rpcParams":{},"transport":{"name":"googleapis"}}}.

Không chắc chắn đó là gì, nhưng cố gắng tải trọng tải thư (email.payload.parts), dẫn đến undefined. Vì vậy, làm thế nào tôi có thể nhận được nội dung tin nhắn?

Ngoài ra, tôi giả định rằng nếu tôi có thể nhận được nội dung tin nhắn, tôi sẽ phải Base64 giải mã nội dung để lấy một số tiếng Anh ra khỏi nó. Mọi gợi ý cho điều đó cũng sẽ giúp ích rất nhiều. Tôi đã tìm thấy điều này: https://github.com/kvz/phpjs, nhưng vì tôi không chắc chắn làm thế nào để đi về nhận được nội dung tin nhắn để tôi có thể thử và giải mã chúng, do đó, không chắc chắn rằng php.js đó là một trợ giúp trong vấn đề đó.

Trả lời

3

Tùy thuộc vào những gì các email của bạn trông giống như (văn bản duy nhất/phần đồng bằng? Nhiều phần dữ liệu với text/html? File đính kèm, vv?), Bạn có thể hoặc có thể không có bất cứ "bộ phận" trong email.payload của bạn và thay vào đó bạn sẽ phải những gì bạn đang tìm kiếm trong "email.payload.body.data" (đối với các tin nhắn một phần). Đây là tất cả giả định bạn đang làm một message.get với định dạng mặc định ("đầy đủ"). Nếu bạn muốn nhận toàn bộ email trong trường message.raw và xử lý nó trong thư viện email cho ngôn ngữ của bạn, bạn có thể gọi message.get (format = raw).

Để biết thêm thông kiểm tra "cơ thể" và "bộ phận []" tài liệu lĩnh vực cho "Message" tại https://developers.google.com/gmail/api/v1/reference/users/messages

+0

Khi cố đăng nhập ' . payload.body.data' gapi.client.gmail.users.messages.get ({}), nó sẽ tạo ra 'lỗi chưa gặp: không thể đọc thuộc 'body' của undefined'. Tuy nhiên, khi thử nghiệm cuộc gọi phương thức .get trên tài liệu API của Gmail (tôi biết về liên kết mà bạn đã đăng) tại mục Dùng thử! phần của phần messages.get, tôi có thể xem nội dung trong trường tải trọng của đối tượng tin nhắn của tôi, vì vậy nó không được xác định. Mặc dù cho các bộ phận [], nó nói 'Đối ... text/plain, lĩnh vực này là empty.' Một thông điệp email cơ bản sẽ chứa văn bản đơn giản, đúng không? Vì vậy, có lẽ đó không phải là nơi tôi dự định đi .. – eugene1832

3

Ah! Tôi đã hiểu rồi. parts là một mảng, vì vậy tôi nên gọi nó là: gapi.client.gmail.users.messages.get({'id': <message ID>}).payload.parts[0].body.data

Bây giờ vấn đề của tôi là giải mã email, chứng minh thành công trong email văn bản thuần túy, nhưng không gửi email từ các địa điểm không phải cá nhân (doanh nghiệp, truyền thông xã hội) cập nhật email, v.v.) Nhưng tôi sẽ làm một câu hỏi mới để có được câu trả lời cho điều đó.

+0

Bạn nên sử dụng một [thư viện] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Base64_encoding_and_decoding) để mã hóa và giải mã – Stormie

+1

Xem câu trả lời của tôi ở trên để mã hóa/giải mã – FullStack

22

Về giải mã Base64, bạn có thể sử dụng

atob(dataToDecode) 

Đối với Gmail, bạn cũng sẽ muốn thay thế một số nhân vật:

atob(dataToDecode.replace(/-/g, '+').replace(/_/g, '/')); 

Chức năng trên là có sẵn cho bạn trong JavaScript (xem ref). Tôi sử dụng nó để giải mã các thư Gmail. Không cần phải cài đặt thêm công cụ. Là một tiếp tuyến thú vị, nếu bạn muốn mã hóa thông điệp của mình thành Base64, hãy sử dụng btoa.

Bây giờ, để truy cập vào tải trọng thông điệp của bạn, bạn có thể viết một hàm:

var extractField = function(json, fieldName) { 
    return json.payload.headers.filter(function(header) { 
    return header.name === fieldName; 
    })[0].value; 
}; 
var date = extractField(response, "Date"); 
var subject = extractField(response, "Subject"); 

tham chiếu từ trước đây của tôi SO Question

var part = message.parts.filter(function(part) { 
    return part.mimeType == 'text/html'; 
}); 
var html = atob(part.body.data.replace(/-/g, '+').replace(/_/g, '/')); 
+0

Cảm ơn người đàn ông! Bạn là một người tiết kiệm cuộc sống, hoạt động như ma thuật! – budiantoip

0

Bạn cần phải tìm kiếm nơi cơ thể cho một loại kịch câm cho là, tôi đã viết một hàm đệ quy cho điều đó:

function searchBodyRec(payload, mimeType){ 
    if (payload.body && payload.body.size && payload.mimeType === mimeType) { 
     return payload.body.data; 
    } else if (payload.parts && payload.parts.length) { 
     return payload.parts.flatMap(function(part){ 
      return searchBodyRec(part, mimeType); 
     }).filter(function(body){ 
      return body; 
     }); 
    } 
} 

Vì vậy, bây giờ bạn có thể gọi

var encodedBody = searchBodyRec(this.message.payload, 'text/plain'); 

Xem phương pháp flatMap up there? Phương pháp FP cổ điển bị thiếu trong js, dưới đây là cách thêm nó (hoặc bạn có thể sử dụng lodash.js hoặc underscore.js nếu bạn không muốn gây rối với các đối tượng gốc)

Array.prototype.flatMap = function(lambda) { 
    return Array.prototype.concat.apply([], this.map(lambda)); 
}; 
Các vấn đề liên quan