Я могу отправить электронное письмо с прикрепленным файлом без использования 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);
}
Считаете ли вы, что вы сначала получили токен доступа, а затем позволили пользователю заполнить электронное письмо? В этом случае перенаправление не так уж и важно. –
Токен доступа действителен в течение 1 часа, поэтому прерывание сеанса плохое UX – erdomester
Реализация Oauth2 обычно должна поддерживать обновление токена доступа. –