2016-06-18 2 views
3

nodeJSのgoogle-api-nodejs-clientライブラリの最新(0.9.8)を使用しています。 サービスアカウントとJWTの有効範囲がhttps:\\googleapis.com/auth/gmail.send(および/ auth/drive FWIW)になっています。nodeJSのGMail API - sendが400 Bad Requestを返す

私はこのような電子メール(base64urlencoded)を送信しよう:

req = mail.users.messages.send(
    { 
    auth: jwtClient,   // really works with google drive 
    userId: [email protected]  // actually a legit gmail address 
    resource: { 
     raw: message    // base64encode(urlencode(RFC822 msg)) 
    } 
    }, (err, res) => { console.log(err); } 
); 

とコールバックは、この今までとても便利オブジェクトを受信:

{"code": 400,"errors":[{"domain":"global","reason":"failedPrecondition","message":"Bad Request"}]} 

を私はGoogleの-API-nodejs-クライアントことを認識していますはalphaで、GMail API自体が進化しています(メッセージとリソースなど)。だから、オンラインの情報(Google独自のドキュメントを含む)の中には矛盾しているものがあります。エラーが非常に一般的なように私は任意の提案を探しています。

+0

UPDATE: 'users.labels.list({auth:jwtClient、userId: 'me'})'に対しても(400、Bad Request)を取得します。一時的に 'auth'をnullに設定すると、パーミッションエラーが発生するので、JWTがうまくいきます。私のサービスアカウントではなく、ユーザーのためにOAuth2を使用すると、ラベルが正常に取得されます。私はサービスアカウントで世界的に何か問題があると言いたいと思いますが、同じJWTを使ってGoogleドライブのドキュメントを作成したり作成したりできます(問題ありません)。 ??? – Carlos

+0

(https://github.com/google/google-api-nodejs-client/issues/399)のように、GMailはOAuth2クライアントIDのみで使用でき、サービスアカウントでは使用できないようです。ドメイン全体の委任を設定し、サービスアカウントのクライアントIDを作成し、そのclient-idでGMailを試します。 – Carlos

答えて

4

「問題」は自分自身のものでした。また、このソリューションは3つ(または4つ)の簡単な部品で構成されています。何もスキップしようとしないでください。

tl; drですが、まだ読んでおく必要があります。ここにはworking gistがあります。

あなたがGoogle Appsアカウントを持っている場合は、サービスアカウントでGmail APIを使用することが可能です。です。 (これは私がしています。)これは、OAuthのリダイレクトを使ってサーバーが電子メールを送信することを回避する必要がないことを意味します。これは偽装によって達成されます。 [N.B. Google Appsドメインをお持ちでない場合は、Gmailでサービスアカウントを使用する理由を再度ご確認ください。結局、すべての電子メールは、一方または両方がロボットであっても、送信者と受信者によって共同所有である]

ここにあなたが何をする必要があるかである:。

  1. のGoogle Appsアカウントをお持ちです。上記を参照。
  2. hereの手紙に従ってください。
  3. 手順2で設定したサービスアカウントのGoogle AppsドメインへのAPIアクセスを有効にします。手順2のリンクには、これらの手順が含まれています。しかしそれは繰り返すのに十分重要です。
  4. は、このようなあなたのJWTを生成します:あなたが必要とするスコープは、あなたがは、Google Appsドメインで有効になっているようにしたい呼び出すAPIによって決定されている
var jwtClient = new google.auth.JWT(
    serviceaccount_key.client_email 
    , null 
    , serviceaccount_key.private_key 
    , [ 
    'https://www.googleapis.com/auth/gmail.readonly' 
    , 'https://www.googleapis.com/auth/gmail.send' 
    ] 
    , '[email protected]_google_apps_domain' // a legit user 
) 

私はこれで半日を節約したいと考えています。