web-dev-qa-db-ja.com

新しい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と次のresultが返されます。

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

ただし、メールは正常に送信されず、代わりに[email protected]からのメッセージを受信ボックスで見つけることができます; "An error occurred, your message has not been sent."

enter image description here

質問:
1。誰かがこれを正常にテストしましたか?
2。これを実行するには、他のパラメーターを追加する必要がありますか?



[〜#〜] edit [〜#〜]:2つの異なるHTTPリクエストメソッドがあり、

  1. メディアアップロードリクエストのアップロードURI
  2. メタデータのみのリクエストのメタデータURI

The API Explorer currently supports metadata requests onlyは、添付ファイルのないプレーンテキストメッセージを意味し、これが私がやろうとしていることです。

24
Taifun

とった!

RFC 2822仕様 を読んだ後、完全なメッセージを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が述べたように、web-safe base64エンコードする必要があります。 https://code.google .com/p/stringencoders/wiki/WebSafeBase64

そのため、base64アルファを「Webセーフ」な形式に変換するには、次の変更をお勧めします。

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

+-/to _に変換するだけで十分でした。

編集2:
ここで@Hjulleの質問に答えるには、userIdと、リクエスト本文にrawパラメーターのみが必要です。あなたのメールアドレスは[email protected]であると仮定しましょう

最初のBase64は、 オンラインエンコーダー を使用して完全なメッセージ(上記を参照)をエンコードし、次の文字列を取得します。

RnJvbTogSm9obiBEb2UgPGpkb2VAbWFjaGluZS5leGFtcGxlPiAKVG86IE1hcnkgU21pdGggPG1h
cnlAZXhhbXBsZS5uZXQ+IApTdWJqZWN0OiBTYXlpbmcgSGVsbG8gCkRhdGU6IEZyaSwgMjEgTm92
IDE5OTcgMDk6NTU6MDYgLTA2MDAgCk1lc3NhZ2UtSUQ6IDwxMjM0QGxvY2FsLm1hY2hpbmUuZXhh
bXBsZT4KClRoaXMgaXMgYSBtZXNzYWdlIGp1c3QgdG8gc2F5IGhlbGxvLiBTbywgIkhlbGxvIi4=

+-および/to _に変換すると、

RnJvbTogSm9obiBEb2UgPGpkb2VAbWFjaGluZS5leGFtcGxlPiAKVG86IE1hcnkgU21pdGggPG1h
cnlAZXhhbXBsZS5uZXQ-IApTdWJqZWN0OiBTYXlpbmcgSGVsbG8gCkRhdGU6IEZyaSwgMjEgTm92
IDE5OTcgMDk6NTU6MDYgLTA2MDAgCk1lc3NhZ2UtSUQ6IDwxMjM0QGxvY2FsLm1hY2hpbmUuZXhh
bXBsZT4KClRoaXMgaXMgYSBtZXNzYWdlIGp1c3QgdG8gc2F5IGhlbGxvLiBTbywgIkhlbGxvIi4=

これをAPI Explorerのrawパラメーターに渡します。

50
Taifun

注:これはPHP特定の回答ですが、あなたの一部はそれが有用であると確信しています。

PHPで行ったように、生データを正しく設定するのに苦労している場合、 PHPMailer を使用すると、物事がよりクリーンで簡単になります。

ライブラリをコードに含めた後(composerを使用する場合は、composer.jsonのrequireセクションに「phpmailer/phpmailer」:「〜5.2」を追加するだけです)、基本的な詳細を設定します。

_$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();
_

これで$ mimeをbase64でエンコードして、Gmail APIの生の文字列を取得できます。有効なWebセーフエンコード文字列を取得するには、単純なbase64_encodeの代わりにこれを使用します。 rtrim(strtr(base64_encode($mime), '+/', '-_'), '=');

1
trajchevska