2014-06-27 66 views
16

我正在嘗試新的Gmail REST API如何使用新的Gmail REST API成功發送消息?

API Explorer中,可以使用OAuth 2.0授權請求並執行請求,即發送消息。

首先我授權。 enter image description here

我使用以下測試數據(當然我使用的有效to電子郵件地址):

{  
    "raw": "c2VuZGluZyBhIG1haWwgdXNpbmcgR21haWwgUkVTVCBBUEk=", 
    "payload": { 
    "headers": [ 
     { "name": "to",  "value": "[email protected]" }, 
     { "name": "from", "value": "[email protected]" }, 
     { "name": "subject", "value": "Test Gmail REST API" } 
    ], 
    "mimeType": "text/plain" 
    } 
} 

我也得到一個200 OK及以下結果回來,這看起來不錯。

{ 
    "id": "146dee391881b35b", 
    "threadId": "146dee391881b35b", 
} 

但是,郵件將無法發送成功,我可以在收件箱中;:"An error occurred, your message has not been sent."

enter image description here

問題找到[email protected]的消息:
1.是否有人測試這成功了嗎?
2.我必須添加一些其他參數才能使其運行?



EDIT:有2種不同的HTTP請求方法,

  1. 上傳URI爲媒體上傳請求,並且
  2. 元數據URI爲僅元數據請求

The API Explorer currently supports metadata requests only,這意味着純文本消息沒有附件,這就是我想要做的。

+0

肯定,我當然第一個授權請求,否則我想我不會得到一個'200 OK'回來... – Taifun

+0

@Taifun,你是如何創建的RFC 2822字符串,是否有任何圖書館或硬編碼它,任何例子? – Sasikanth

+0

@Sasikanth這取決於你最喜歡的編程語言。 [看我下面的答案](http://stackoverflow.com/a/24461102/1545993)如何網絡安全的base64編碼完整的消息 – Taifun

回答

40

明白了!

閱讀RFC 2822 specification後我才發現,需要完整的消息在raw參數傳遞,看到的例子:

From: John Doe <[email protected]> 
To: Mary Smith <[email protected]> 
Subject: Saying Hello 
Date: Fri, 21 Nov 1997 09:55:06 -0600 
Message-ID: <[email protected]> 

This is a message just to say hello. So, "Hello". 

編碼完整信息的base64所以以後,通過它在raw參數沒有使用任何其他參數,它工作正常。

編輯1:
作爲@Amit提到的,它必須是網絡安全base64編碼,又見https://code.google.com/p/stringencoders/wiki/WebSafeBase64

所以要以base64阿爾法轉換成格式是「基於web安全」的 以下更改建議:

+ --> - (char 62, plus to dash) 
/--> _ (char 63, slash to underscore) 
= --> * padding 

要只CON對我而言,+-/_就足夠了。

編輯2:
要在這裏回答@Hjulle問題的例子:你只需要userId和請求主體的raw參數。假設,你的電子郵件地址是[email protected]

首先Base64編碼,完整的消息使用online encoder(見上文),你會得到這個字符串:

RnJvbTogSm9obiBEb2UgPGpkb2VAbWFjaGluZS5leGFtcGxlPiAKVG86IE1hcnkgU21pdGggPG1h 
cnlAZXhhbXBsZS5uZXQ+IApTdWJqZWN0OiBTYXlpbmcgSGVsbG8gCkRhdGU6IEZyaSwgMjEgTm92 
IDE5OTcgMDk6NTU6MDYgLTA2MDAgCk1lc3NhZ2UtSUQ6IDwxMjM0QGxvY2FsLm1hY2hpbmUuZXhh 
bXBsZT4KClRoaXMgaXMgYSBtZXNzYWdlIGp1c3QgdG8gc2F5IGhlbGxvLiBTbywgIkhlbGxvIi4= 

現在轉換+-/_,你會得到

RnJvbTogSm9obiBEb2UgPGpkb2VAbWFjaGluZS5leGFtcGxlPiAKVG86IE1hcnkgU21pdGggPG1h 
cnlAZXhhbXBsZS5uZXQ-IApTdWJqZWN0OiBTYXlpbmcgSGVsbG8gCkRhdGU6IEZyaSwgMjEgTm92 
IDE5OTcgMDk6NTU6MDYgLTA2MDAgCk1lc3NhZ2UtSUQ6IDwxMjM0QGxvY2FsLm1hY2hpbmUuZXhh 
bXBsZT4KClRoaXMgaXMgYSBtZXNzYWdlIGp1c3QgdG8gc2F5IGhlbGxvLiBTbywgIkhlbGxvIi4= 

現在傳遞給API Explorer的raw參數。

+1

需要的網址編碼。 http://stackoverflow.com/questions/22128789/converting-string-to-web-safe-base64-format –

+0

https://gist.github.com/AkashkumarDev/20ab002e7f5785ae778e 任何想法在哪裏是問題? – akdev

+0

@akdev對於問題請發起一個新問題,而不是在這裏評論。謝謝。 – Taifun

1

注:這是一個PHP特定的答案,但我相信你們中的一些人會覺得它有用。

如果您正在努力在PHP中正確設置原始數據,那麼使用PHPMailer會使您的工作變得更簡潔,更輕鬆。 ,你設置的基本細節:

$mail = new PHPMailer(); 
$mail->From = 'FROM_EMAIL'; 
$mail->FromName = 'FROM_NAME'; 
$mail->addAddress('TO_EMAIL','TO_NAME'); 
$mail->Subject = 'EMAIL_SUBJECT'; 
$mail->Body = 'EMAIL_BODY'; 
$mail->preSend(); 
$mime = $mail->getSentMIMEMessage(); 

,包括在你的代碼庫(在你的composer.json的要求部分「〜5.2」,如果你使用的作曲家,只需添加「的PHPMailer/PHPMailer的」)後

現在,您可以對$ mime進行base64編碼,以獲取Gmail API的原始字符串。使用此代替簡單的base64_encode,以獲得有效的Web安全編碼字符串。 rtrim(strtr(base64_encode($mime), '+/', '-_'), '=');

相關問題