CORS:Access-Control-Allow-Origin不等于提供的原点

时间:2015-04-05 15:14:32

标签: javascript xmlhttprequest cors sendgrid

我尝试使用sendgrid从应用程序发送电子邮件。这不应该太难,而且我之前已经发过电子邮件。在这种情况下,我想在Javascript中这样做,因为它是Ember应用程序的一部分。第一个问题是" No' Access-Control-Allow-Origin"消息,我试图用CORS解决。现在我有一个不同的错误!

现在我不确定在哪里寻找解决这个问题的方法。我使用的代码如下:

(function(){
  makeCorsRequest('GET', mailUrl); 
})();

function createCORSRequest(method, url) {
  var xhr = new XMLHttpRequest();
  if ("withCredentials" in xhr) {
    xhr.open(method, url, true);
  } else if (typeof XDomainRequest != "undefined") {
    xhr = new XDomainRequest();
    xhr.open(method, url);
  } else {
    xhr = null;
  }
  return xhr;
}

function makeCorsRequest(type, url) {
  var xhr = createCORSRequest(type, url);
  if (!xhr) {
    alert('CORS not supported');
    return;
  }
  xhr.onload = function() {
    var text = xhr.responseText;
    console.log(text);
    var title = getTitle(text);
    alert('Response from CORS request to ' + url + ': ' + title);
  };

  xhr.onerror = function() {
    alert('Woops, there was an error making the request.');
  };

  xhr.send(); 
}

这给了我错误:

The 'Access-Control-Allow-Origin' header has a value 'https://sendgrid.com'      that is not equal to the supplied origin. Origin 'http://localhost' is   therefore not allowed access.

2 个答案:

答案 0 :(得分:1)

看起来您正在从浏览器中运行的Ember应用程序调用SendGrid API?如果是这样,你可能不应该(出于安全原因)。

您需要向在您自己的域上运行的服务器发出AJAX请求,并拥有您的服务器

  • 验证请求是否合法,
  • 调用SendGrid API发送电子邮件

公开您的SendGrid API密钥,并直接从浏览器调用API会将您的SendGrid帐户暴露给潜在的滥用者。

对于服务器端API调用,请查看SendGrid's API Clients。您不应该自己编写API调用。

答案 1 :(得分:1)

sendGrid CORS政策不允许浏览器调用其API(除非您位于“ sendgrid.api-docs.io”域中)...您必须从服务器发送电子邮件,

但是如果只是出于测试或开发目的,您可以在github上使用我的演示 https://github.com/itisnajim/sendgrid-nodejs

将您的数据发布到 http://sendgrid-nodejs-oxailstudiosnode.7e14.starter-us-west-2.openshiftapps.com

Ajax示例:

let urlStr = "http://sendgrid-nodejs-oxailstudiosnode.7e14.starter-us-west-2.openshiftapps.com";
const msg = {
    "personalizations": [
        {"to": [{"email": "example1@mail.com"}]}
    ],
    "from": {"email": "example2@mail.com"},
    "subject": "subject example",
    "content": [{"type": "text/plain", "value": "example body text"}]
};

$.ajax({
    url: urlStr,
    type: 'post',
    data: JSON.stringify(msg),
    dataType: 'json',
    contentType: "application/json; charset=utf-8",
    beforeSend: function(xhr) {
        xhr.setRequestHeader("Authorization", "Bearer API_KEY_HERE")
    },
    success: function(data){
        //console.log(data);
        //OK: Mail sent!!
    },
    error: function( jqXhr, textStatus, errorThrown ){
        //console.log( errorThrown, textStatus, jqXhr );
        if(jqXhr.status === 202 || jqXhr.status === "202"){
            //OK: Mail sent!!
        }else
        console.error("Mail not sent! Err:"+JSON.stringify(errorThrown))

    }
})