这段代码使用基于流星请求的包HTTP调用mailgun api已经工作多年了:
HTTP.post(process.env.MAILGUN_API + '/messages', {
auth: 'api:' + process.env.MAILGUN_API_KEY,
params
}, function(error, result) {
if (error) {
standardServerError(error, 'while sending email to ' + params.to);
// throw error;
}
});
Meteor在Meteor 2.0中弃用了HTTP/request包。因此,我将fetch转换为如下
const response = await fetch(process.env.MAILGUN_API + '/messages', {
method: 'POST',
headers: {
'Authorization': 'Basic ' + Buffer.from('api:' + process.env.MAILGUN_API_KEY).toString('base64'),
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
});
return response;
不幸的是它不起作用。获取状态文本为"BAD REQUEST"的响应代码400。参数是相同的,弃用的调用可以工作。
答案是当你用http调用mailgun api时,一些神奇的转换会在幕后发生。当使用fetch时,魔术不会发生。如果我在发出mailgun请求之前显式地将JSON数据转换为表单数据,那么它将按预期工作。
let formData = multipartFormData(params);
const response = fetch(mailgunEndpoint + '/messages', {
method: 'POST',
headers: _.extend({
'Authorization': 'Basic ' + Buffer.from(`${mailgunUser}:${mailgunAPIKey}`).toString('base64'),
}, formData.headers),
body: formData.content
}).then(response => {
if (traceSendEmail) {
console.warn(`{status: ${response.status}, statusText: ${response.statusText}}`);
}
return response;
}).catch(err => {
standardServerError(err, 'while sending email to ' + params.to);
return false;
});
答案是,当您使用http包调用api时,一些神奇的转换在幕后发生。当使用fetch时,魔术不会发生。在发出api请求之前,必须显式地将JSON数据转换为表单数据,然后代码才能按预期工作。
let formData = multipartFormData(params);
const response = fetch(mailgunEndpoint + '/messages', {
'method': 'POST',
'headers': _.extend({
'Authorization': 'Basic ' + Buffer.from(`${mailgunUser}:${mailgunAPIKey}`).toString('base64'),
}, formData.headers),
'body': formData.content
}).then(response => {
if (traceSendEmail) {
console.warn(`{status: ${response.status}, statusText: ${response.statusText}}`);
}
return response;
}).catch(err => {
standardServerError(err, 'while sending email to ' + params.to);
return false;
});