2015-10-01 67 views
1

我正在嘗試使用Google的API發送電子郵件。我有一個由AngularJS支持的Web應用程序,用戶使用oauth2使用他們的Google帳戶(通過passport.js)登錄。一個新的訪問令牌被寫入我的數據庫的帳戶。他們的谷歌用戶ID也寫入他們的帳戶。我希望用戶能夠使用簡單的用戶ID和訪問令牌通過HTTP請求發送電子郵件。我使用郵差做一些測試的要求,但我不斷收到此錯誤:僅使用令牌發送包含Gmail API的電子郵件?

{ 
    "error": { 
    "errors": [ 
     { 
     "domain": "global", 
     "reason": "insufficientPermissions", 
     "message": "Insufficient Permission" 
     } 
    ], 
    "code": 403, 
    "message": "Insufficient Permission" 
    } 
} 

我使用下面的鏈接進行POST請求:

https://content.googleapis.com/gmail/v1/users/106xxxxxxxxxxx/messages/send 

在我的頭,我有:

Authorization: Bearer yaxx._wxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
Content-Type: application/json 

我的身體:

{ 
"raw": "test" 
} 

我已經有一些電子郵件間歇性地使用這種方法,但我似乎無法確定地重新創建一個成功的請求。我對Google的文檔有點困惑。我是否需要明確授予訪問權限,如this page底部的示例所示?

回答

2

您提到的access token需要存在於POST-要求您發送郵件。 Oauth2 - procotol規定您需要傳遞標頭Authorization: Bearer <ACCESS_TOKEN>或參數access_token=<ACCESS_TOKEN>

raw的值也需要是有效的base64-encoded rfc822郵件。在JavaScript中的一個例子可能看起來像下面這樣:

// Base64-encode the mail and make it URL-safe 
// (replace all "+" with "-" and all "/" with "_") 
var encodedMail = btoa(
     "Content-Type: text/plain; charset=\"UTF-8\"\n" + 
     "MIME-Version: 1.0\n" + 
     "Content-Transfer-Encoding: 7bit\n" + 
     "Subject: Subject of the mail\n" + 
     "From: [email protected]\n" + 
     "To: [email protected]\n\n" + 

     "This is where the mail text will go" 
    ).replace(/\+/g, '-').replace(/\//g, '_'); 

這將導致你在請求主體的raw使用的字符串。

在郵遞員請求將然後如下所示:

POST https://www.googleapis.com/gmail/v1/users/me/messages/send?access_token=<ACCESS_TOKEN> 

{ // The encoded mail from the example above. 
"raw": "Q29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJVVEYtOCIKTUlNRS1WZXJzaW9uOiAxLjAKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdApTdWJqZWN0OiBTdWJqZWN0IG9mIHRoZSBtYWlsCkZyb206IHNlbmRlckBnbWFpbC5jb20KVG86IHJlY2lldmVyQGdtYWlsLmNvbQoKVGhpcyBpcyB3aGVyZSB0aGUgbWFpbCB0ZXh0IHdpbGwgZ28=" 
} 

您還需要與application/json值提供Content-Type -header。請注意,您不必使用userId。提供me將使Google自動使用與提供的訪問令牌關聯的用戶。

此外請確保您要求擁有Passport的足夠權限scopehttps://mail.google.com/將工作。

+0

謝謝,但我得到相同的錯誤響應。這是我的Postman HTTP請求的副本。 'POST /gmail/v1/users/me/messages/send?access_token=ya29.xxxxxxxxxxxxxxxxx HTTP/1.1 Host:www.googleapis.com Content-Type:application/json Cache-Control:no-cache Postman-令牌:c152b250-b38f-7280-6466-XXXXXXXXXXXXXX { 「原始」: 「Q29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJVVEYtOCIKTUlNRS1WZXJzaW9uOiAxLjAKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdApTdWJqZWN0OiBTdWJqZWN0IG9mIHRoZSBtYWlsCkZyb206IHNlbmRlckBnbWFpbC5jb20KVG86IHJlY2lldmVyQGdtYWlsLmNvbQoKVGhpcyBpcyB3aGVyZSB0aGUgbWFpbCB0ZXh0IHdpbGwgZ28 =」 }' – mjoyce91

+0

@MikeJoyce更新了答案:) – Tholle

+0

@Throlle:你的回答對我的作品,但我想知道從你從哪裏得到這些不同的領域。即使在GMail API文檔中我也找不到它 –

相關問題