2016-09-21 8 views
1

GMAIL APIを使用して添付ファイルあり/なしのメールを送信できます。私の唯一の問題は、添付ファイルを送信したいときのように見えるということです。私はaccesstokenが必要です。これは、ユーザーが電子メールフォームに記入し、ファイルを添付して送信ボタンをクリックした直後とは良くないです、私はどうにかしてすべてのデータを保存する必要があります(状態パラメータで送信しますか?)、gmail's authentication link、リダイレクトすると、ユーザーからはまったく関係のない多くのものでいっぱいになっているURLからaccesstokenを取得し、URLから自分のデータを取得し、最後にメールを送信します。アクセストークンやリダイレクトなしでGMAIL APIを使用して添付ファイル付きのメッセージを送信する方法

ドキュメントによると、状態パラメータはので、私はtoccsubjectbase64 encoded msgcontenttypefilename変数を送信するために必要なリダイレクト後にデータを取得するために使用されます。

その他のオプションはありますか?

function getAccessToken() { 
     window.location = 'https://accounts.google.com/o/oauth2/v2/auth?scope=' + scopes + '&state=' + 'hello' + '&redirect_uri=https://skeebdo.com/quickstart.html' + '&response_type=token' + '&client_id=' + clientId; 
    } 

//Now when the page gets redirected and back I need to read the accesstoken and state parameter from the url. 
var accesstoken = ''; 
var url = window.location.href; 
if (url.indexOf("access_token=") > 0) { 
    var at_starts = url.indexOf("access_token="); 
    var tokentype_starts = url.indexOf("&token_type="); 
    accesstoken = url.substring((at_starts + 13), tokentype_starts); 
    if (url.indexOf("state=") > 0) { 
     //get to, cc, subject, msg, contenttype, filename, base64 encoded file 
    } 
} 

function sendEmail() { //Send email 

     var to = $("#compose-to").val(); 
     var cc = $("#compose-cc").val(); 
     var subject = $("#compose-subject").val(); 
     var message = editor.getData(); 

     if (contenttype != null && contenttype != "" && contenttype.length > 0) { 
      //we got an attachment! 

       var pngData = base64_image; 

       var mail = 
        'Content-Type: multipart/mixed; boundary="foo_bar_baz"\n' + 
        'MIME-Version: 1.0\n' + 
        'to: ' + to + '\n' + 
        'cc: ' + cc + '\n' + 
        'subject: ' + subject + '\n\n' + 

        '--foo_bar_baz\n' + 
        'Content-Type: text/html; charset="UTF-8"\n' + 
        'MIME-Version: 1.0\n' + 
        'Content-Transfer-Encoding: 7bit\n\n' + 

        message + '\n\n' + 

        '--foo_bar_baz\n' + 
        'Content-Type: ' + contenttype + '\n' + 
        'MIME-Version: 1.0\n' + 
        'Content-Transfer-Encoding: base64\n' + 
        'Content-Disposition: attachment; filename=' + filename + '\n\n' + 

        pngData + '\n\n' + 

        '--foo_bar_baz--'; 


       $.ajax({ 
       type: "POST", 
        url:"https://www.googleapis.com/upload/gmail/v1/users/me/messages/send?uploadType=multipart", 
        contentType: "message/rfc822",      
        async: true, 
        data: mail, 
        beforeSend: function (xhr){ 
         xhr.setRequestHeader('Authorization', 'Bearer ' + accesstoken); 
        }, 
        success:function(data){ 
         ShowNotification("success", "Message Sent!"); 
        }, 
        error:function(xhr,err){ 
         alert("readyState:"+xhr.readyState+"\nstatus: "+xhr.status) 
         alert(xhr.responseText) 
         if (xhr.status == "401") { //get or refresh accesstoken 
          alert("Ujra kell kerni az accesstokent"); 
          getAccessToken(); 
         } 

        } 
       }); 
      } else { 
       //No attachment 
       sendTextMessage(
       { 
        'To': to, 
        'Cc': cc, 
        'Subject': subject 
       }, 
       message); 
      } 

     } 
    } 


function sendTextMessage(headers_obj, message, callback) { 

     var email = ''; 

     for(var header in headers_obj) 
     email += header += ": "+headers_obj[header]+"\r\n"; 
     email += 'Content-Type: text/html; charset=UTF-8\r\n'; 
     email += "\r\n" + message; 

     var sendRequest = gapi.client.gmail.users.messages.send({ 
      'userId': 'me', 
      'resource': { 
      'raw': window.btoa(email).replace(/\+/g, '-').replace(/\//g, '_') 
      } 
     }); 
     return sendRequest.execute(callback); 
    } 
+0

まずアクセストークンを取得してから、ユーザーに電子メールを記入させることを考えましたか?この場合、リダイレクトはあまり重要ではありません。 –

+0

アクセストークンは1時間有効なので、セッションの中断は無効です。UX – erdomester

+2

Oauth2の実装では、通常、アクセストークンのリフレッシュをサポートする必要があります。 –

答えて

0

あなたはそれが期限切れになった後、あなたがアクセストークンを再生成するリフレッシュトークンを使用することができた後、一度だけアクセストークンを取得する必要があります。

+0

アイデアをありがとう、私はドキュメントからこれを無視しているようです。私は最後にこれをやっていましたが、解決策はここにあります:http://stackoverflow.com/questions/39674841/unable-to-get-access-and-refresh-token-after-authenticating-with-google-api/39677051# 39677051 – erdomester

関連する問題