2015-06-13 2 views
3

Я пытаюсь отправить электронное письмо от NodeJS, запущенного на сервере Linux, в HTTP API API Gmail HTTP. Не использовать библиотеки, просто отправляя https. Я выяснил часть OAuth, имею токен доступа и получаю ответы от google. Но я не могу пройти мимо сообщений об ошибках. Я разместил код ниже. Это не очевидно, но EmailSend() вызывается после того, как я получаю токен доступа из google, так что да, он называется.отправить адрес электронной почты через google http rest api

var emailStr = new Buffer(
     "Content-Type: text/plain; charset=\"UTF-8\"\n" + 
     "MIME-Version: 1.0\n" + 
     "Content-Transfer-Encoding: 7bit\n" + 
     "to: [email protected]\n" + 
     "from: [email protected]\n" + 
     "subject: Subject Text\n\n" + 

     "The actual message text goes here" 
).toString("base64").replace(/\+/g, '-').replace(/\//g, '_'); 
//var emailBase64UrlSafe = Rtrim(emailStr, '='); 
//var emailBase64UrlSafe = JsStrToUrlSafe (emailStr); 
var emailBase64UrlSafe = emailStr; 

var http = require('https'); 
function EmailSend() { 

    var post_data = emailBase64UrlSafe; 
    var post_options = { 
     hostname: 'www.googleapis.com', 
     port: '443', 
     path: '/gmail/v1/users/me/messages/send', 
     method: 'POST', 
     headers: { 
     "Authorization": 'Bearer '+googleAccessKey['access_token'], 
     "Content-Type" : "application/json; charset=UTF-8" 
     }, 
    }; 
    console.log(post_options); 

    var post_req = http.request(post_options, function(res) { 
     res.setEncoding('utf8'); 
     res.on('data', function (chunk) { 
      console.log('Response: ' + chunk); 
     }); 
    }); 
    post_req.write(JSON.stringify({ "raw": emailBase64UrlSafe })); 
    post_req.end(); 
}; /* end EmailSend() */ 
Response: { 
"error": { 
"errors": [ 
    { 
    "domain": "global", 
    "reason": "failedPrecondition", 
    "message": "Bad Request" 
    } 
], 
"code": 400, 
"message": "Bad Request" 
} 

Ресурсы, используемые:

  1. https://tools.ietf.org/html/rfc2822#appendix-A

  2. https://developers.google.com/identity/protocols/OAuth2ServiceAccount

  3. https://nodejs.org/api/https.html#https_https_request_options_callback

  4. Send email using Google API with only access token

+0

Я не мог получить эти ресурсы в сообщении, не испортив форматирование. Итак, вот они. 1. https://tools.ietf.org/html/rfc2822#appendix-A 2. https://developers.google.com/identity/protocols/OAuth2ServiceAccount 3. https://nodejs.org/api/ https.html # https_https_request_options_callback 4. http://stackoverflow.com/questions/29504289/send-email-using-google-api-with-only-access-token?rq=1 – user3356715

+0

Вы занимаетесь делегированием домена и выдачей лицензий пользователь вашей учетной записи? проверьте эту ссылку https://developers.google.com/drive/web/delegation, иначе она выкинет эту ошибку. – SGC

+0

Посмотрите документацию, вам нужно разместить объект, частью которого является сообщение: https://developers.google.com/gmail/api/v1/reference/users/messages/send – gcbirzan

ответ

1

Пробовали для себя, и это сработало!

var http = require('https'); 

var mail = new Buffer(
    "From: [email protected]\n" + 
    "To: [email protected]\n" + 
    "Subject: Subject Text\n\n" + 

    "Message text" 
).toString("base64").replace(/\+/g, '-').replace(/\//g, '_'); 


var post_options = { 
    hostname: 'www.googleapis.com', 
    port: '443', 
    path: '/gmail/v1/users/me/messages/send', 
    method: 'POST', 
    headers: { 
    "Authorization": 'Bearer <ACCESS_TOKEN>', 
    "Content-Type" : "application/json" 
    } 
}; 

var post_req = http.request(post_options, function(res) { 
    res.setEncoding('utf8'); 
    res.on('data', function (chunk) { 
     console.log('Response: ' + chunk); 
    }); 
}); 

post_req.write(JSON.stringify({ "raw": mail })); 
post_req.end(); 
Смежные вопросы