2016-09-21 4 views
1

Я могу отправить электронное письмо с прикрепленным файлом без использования GMAIL API. Моя единственная проблема в том, что, похоже, когда я хочу отправить вложение, мне нужен accesstoken. Это не так хорошо, как сразу после того, как пользователь заполнил форму электронной почты, приложил файл и нажал кнопку «Отправить», мне нужно как-то сохранить все данные (например, отправить их в параметр состояния?), Загрузить gmail's authentication link, перезагрузить страницу на перенаправлять, извлекать accesstoken из URL-адреса, который теперь заполнен множеством вещей, совершенно не относящихся к пользователю, извлечения моих данных из URL-адреса и отправки электронной почты.Как отправить сообщение с приложением с использованием GMAIL API без токена доступа или перенаправления

Согласно документации параметр состояния используется для получения данных после редиректа, поэтому мне нужно отправить переменные to, cc, subject, base64 encoded msg, contenttype и filename.

Какие еще варианты у меня есть?

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

Смежные вопросы