我尝试使用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.
答案 0 :(得分:1)
看起来您正在从浏览器中运行的Ember应用程序调用SendGrid API?如果是这样,你可能不应该(出于安全原因)。
您需要向在您自己的域上运行的服务器发出AJAX请求,并拥有您的服务器
公开您的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))
}
})