我正在尝试使用JS Mailgun API发送电子邮件。让它正常工作,直到我将模板变量扔到'h:X-Mailgun-Variables'中,其中jsonString非常大(17000+字符):
const mailData = {
from: 'Insights <insights@hello.net>',
to: mailAddress,
subject: `Insights: ${DAYS_OF_WEEK[date.getDay()]}, ${MONTHS[date.getMonth()]} ${ordinal_suffix_of(date.getDate())} ${date.getFullYear()}`,
template: "template1",
'h:X-Mailgun-Variables': jsonString,
};
查看这里的文档说明如下:
Note The value of the “X-Mailgun-Variables” header must be valid JSON string,
otherwise Mailgun won’t be able to parse it. If your X-Mailgun-Variables
header exceeds 998 characters, you should use folding to spread the variables
over multiple lines.
参考了这篇文章,它建议我"折叠"。通过定期插入CRLF字符来提升JSON。这导致我在这里,这仍然不工作,虽然记录这确实显示常规换行,并符合JSON:
const jsonString = JSON.stringify(templateVars).split('},').join('},r n');
对如何正确"折叠"有什么见解吗?我的JSON,所以我可以使用大的模板变量在我的MailGun邮件?
更新:
按要求,添加我的代码。当数据只有几个公司/帖子时,这可以工作,但是当我有许多公司每个都有许多帖子时,我得到400错误:
function dispatchEmails(data) {
const DOMAIN = 'test.net';
const mg = mailgun({apiKey: API_KEY, domain: DOMAIN});
const templateVars = {
date: theDate,
previewText: 'preview',
subject: 'subject',
subhead: 'subhead',
companies: data.companies.map(company => {
return {
url: company.url,
totalParts: data.totalParts,
currentPart: data.currentPart,
companyData: {
name: company.name,
website: company.website,
description: company.description
},
posts: _.map(company.news, item => {
return {
category: item.category,
date: new Date(item.date),
url: item.sourceUrl,
title: item.title,
source: item.publisherName,
description: item.description,
}
})
}
})
};
const jsonString = JSON.stringify(templateVars).split('},').join('},r n');
const mailData = {
from: 'test@test.com',
to: 'recipient@test.com',
subject: 'subject',
template: 'template',
'h:X-Mailgun-Variables': jsonString
};
return mg.messages().send(mailData)
.then(body => {
return body;
})
.catch(err => {
return {error: err};
});
}
我认为你的问题可能是整体有效载荷大小,而不是字符串折叠。超过998个字符的字符串的折叠似乎由node.js客户端处理,可能由form-data包处理。
我运行了以下测试:
test_big_data(在mailgun中通过UI创建的模板)
<!DOCTYPE html>
<html>
<body>
<h2>An HTML template for testing large data sets.</h2>
<ul>
<li>{{param_name_0}}</li>
... other lis ...
<li>{{param_name_999}}</li>
</ul>
</body>
</html>
send_email.js
const API_KEY = 'MY_KEY';
const DOMAIN = 'MY_DOMAIN.COM';
const formData = require('form-data');
const Mailgun = require('mailgun.js');
const mailgun = new Mailgun(formData);
const client = mailgun.client({ username: 'api', key: API_KEY });
const bigData = {};
for (let i = 0; i < 400; i++) {
bigData[`param_name_${i}`] = `param_value_${i}`;
}
const dataString = JSON.stringify(bigData);
console.log(dataString.length);
const messageData = {
from: 'Mailgun Sandbox <postmaster@DOMAIN>',
to: 'test@MY_DOMAIN.COM',
subject: 'Big Data Test',
template: 'test_big_data',
'h:X-Mailgun-Variables': dataString,
};
client.messages
.create(DOMAIN, messageData)
.then((res) => {
console.log(res);
})
.catch((err) => {
console.error(err);
});
本例中dataString的长度为13781个字符,邮件队列成功。
但是,如果我将for循环条件改为I <1000我得到以下错误时,排队的电子邮件:
[Error: Bad Request] {
status: 400,
details: '{"message":"Send options (parameters starting with o:, h:, or v:) are limited to 16 kB total"}n'
}
当我向Mailgun技术支持询问文档中的折叠警告时,他们告诉我RFC 2822 section "3.2.3。折叠空白和注释。但就像我说的,我不认为折叠是这里的问题。
干杯!https://datatracker.ietf.org/doc/html/rfc2822 11页
只是跳出框框思考,但为什么要在邮件头传递那么多数据?我假设你在接收端有一些东西来解析邮件头。如果不是向他们发送数据而是向他们发送一个键,他们可以回调到你端的API来获取数据呢