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