我试图用nodejs和nodemailer发送多封邮件,我尝试了+50种方法,直到现在,结果总是一样的:传送者发送的邮件主体不同,但主题相同。
我试着用逻辑函数逐一发送,我改成把所有邮件的有效载荷推送到一个数组中,然后调用一个函数来发送,但总是一样的:同样的主题(当我做console.log时,我看到3个不同的和正确的邮件对象)。
这是我的代码(Books是一个mongoose模型)。
var TypesBook = [
"Comic",
"Action",
"Adventure"
];
sendDailyEmails = () => {
var emails = [];
Books.find({day: stringday}, (err, books) => {
if (err) {
console.log("error get books")
}
if (!stats) {
console.log("books not found")
}
for (let i=0; i < TypesBook.length; i++) {
let EmailPayload = {
from: '',
to:["[email protected]"],
subject : "[Book "+TypesBook[i]+"] is availbale at day "+stringday
}
for (let j=0; j<books.length; j++) {
if (TypesBook[i] !== books[j].Type) {
continue
} else {
EmailPayload["html"] =
'Hi' +
"Your book "+TypesBook[i]+" is ready <br/><br />" +
"details: "+books[j].Length.pages+" <br />"
emails.push(EmailPayload)
}
}
}
sendMyNewEmails(emails);
}).catch(err => console.log(err))
};
sendMyNewEmails = (tab) => {
console.log(tab) // here I get 3 correct objects with correct subject and body
tab.forEach(function(entry) {
Email.sendMail(entry);
});
}
sendMail = async (payload) => {
var mailOptions = {
from: '[email protected]',
to: payload.to,
subject: payload.subject,
text: payload.text,
html: payload.html
};
transporter.sendMail(mailOptions, function(error, info){
if (error) {
console.log(error)
}
});
}
我把它改成了这个,但还是一样的错误。
sendMail = function(mailOptions){
return new Promise(function (resolve, reject){
transporter.sendMail(mailOptions, (err, info) => {
if (err) {
console.log("error: ", err);
reject(err);
} else {
console.log(`Mail sent successfully!`);
resolve(info);
}
});
});
}
UPDATE :
当我在收到的邮件中点击邮件详情时,我看到了正确的主题,但在收件箱中却出现了错误的旧主题(甚至在代码中不存在)。
使用关闭函数调用(s)。
var TypesBook = [
"Comic",
"Action",
"Adventure"
];
sendDailyEmails = () => {
var emails = [];
Books.find({day: stringday}, (err, books) => {
if (err) {
console.log("error get books")
}
if (!stats) {
console.log("books not found")
}
for (let i=0; i < TypesBook.length; i++) {
(function(idx){
let EmailPayload = {
from: '',
to:["[email protected]"],
subject : "[Book "+TypesBook[idx]+"] is availbale at day "+stringday
}
for (let j=0; j<books.length; j++) {
if (TypesBook[idx] !== books[j].Type) {
continue
} else {
EmailPayload["html"] =
'Hi' +
"Your book "+TypesBook[idx]+" is ready <br/><br />" +
"details: "+books[j].Length.pages+" <br />"
emails.push(EmailPayload)
}
}
}
sendMyNewEmails(emails);
}).catch(err => console.log(err))
};
sendMyNewEmails = (tab) => {
console.log(tab) // here I get 3 correct objects with correct subject and body
tab.forEach(function(entry) {
Email.sendMail(entry);
});
}
sendMail = async (payload) => {
var mailOptions = {
from: '[email protected]',
to: payload.to,
subject: payload.subject,
text: payload.text,
html: payload.html
};
transporter.sendMail(mailOptions, function(error, info){
if (error) {
console.log(error)
}
});
})(i);
}
const TypesBook = [
"Comic",
"Action",
"Adventure"
];
const sendDailyEmails = async(stringday) => {
try{
const emails = [];
const books = await Books.find({day: stringday})
for (let type of TypesBook) {
const emailPayload = {
from: ``,
to: [`[email protected]`] ,
subject : `[Book ${type}] is availbale at day ${stringday}`
}
for (let book of books) {
if (type = book.Type) {
const newPayload = Object.assign({}, emailPayload); // add this ine
newPayload[`html`] = //change this line
`Hi
Your book ${type} is ready <br/><br />
details: ${book.Length.pages} <br/>`
emails.push(newPayload ) //change this line
}
}
}
sendMyNewEmails(emails);
}catch(err){
throw err;
}
};
const sendMyNewEmails = tab => {
try{
tab.map(entry => {
Email.sendMail(entry);
});
}catch(err){
throw err;
}
}
const sendMail = async payload => {
try{
const mailOptions = {
from: '[email protected]',
to: payload.to,
subject: payload.subject,
text: payload.text,
html: payload.html
};
const info = await transporter.sendMail(mailOptions)
}catch(err){
throw err;
}
}