Node.js 如何使用NodeEmailer模块将Excel文件发送到电子邮件

Node.js 如何使用NodeEmailer模块将Excel文件发送到电子邮件,node.js,nodemailer,Node.js,Nodemailer,我正在使用“nodeEmailer”模块将Excel文件作为附件发送到电子邮件 注意:我在附件中传递给“内容”的是一个对象数组 function sendEmailWithAttachments(recipientEmailId, subject, content, next) { var ormMailerInfo = getORMMailerInfo(); var transporter = nodemailer.createTransport(smtpT

我正在使用“nodeEmailer”模块将Excel文件作为附件发送到电子邮件

注意:我在附件中传递给“内容”的是一个对象数组

 function sendEmailWithAttachments(recipientEmailId, subject, content, next) {

        var ormMailerInfo = getORMMailerInfo();
        var transporter = nodemailer.createTransport(smtpTransport({
            host: ormMailerInfo.orm_mailer_host,
            secure: ormMailerInfo.orm_mailer_secure,
            port: ormMailerInfo.orm_mailer_port,
            auth: {
                user: ormMailerInfo.orm_mailer_user,
                pass: ormMailerInfo.orm_mailer_pass
            }
        }));

        transporter.sendMail({
            from: ormMailerInfo.orm_mailer_user,
            to: recipientEmailId,
            subject: subject,
            attachments: [
                {   /* the uniqueness of my question begins from here */
                    // file being sent is Excel file as '.xlsx' indicates
                    filename: subject + '.xlsx',
                    // content/data being sent an array of objects
                    content: new Buffer(content,'utf-8')
                }
                ]
        }, next);
    }
我已成功发送和接收,但在打开excel文件时,会在下面显示此错误:

“Excel无法打开文件'filename.xlsx',因为文件扩展名的文件格式无效。请验证文件是否已损坏,以及文件扩展名是否与文件格式匹配。”


有什么帮助吗,亲爱的成员?

您可以将内容指定为普通字符串,并将内容转换为
csv
格式,文件扩展名为.csv

要将对象数组转换为csv格式的字符串,您可以使用下面的代码,然后将返回的字符串作为
内容
传递给您的
sendmailwithattachments

var isArray=Array.isArray
,keys=Object.keys;
CSV.CHAR_RETURN=0xd;
CSV.CHAR_NEWLINE=0xa;
CSV.DELIMITER=0x2c;
CSV.CHAR_封装=0x22;
职能主管(a){
返回[0];
}
函数尾部(a){
返回一个[a.length-1];
}
函数char(c){
返回'number'==c的类型
?String.fromCharCode.apply(null,参数)
:c;
}
函数需要封装(字符串){
return!!字符串&&(
string.toString().indexOf(char(CSV.DELIMITER))>=0||
string.toString().indexOf(char(CSV.char\u RETURN))>=0||
string.toString().indexOf(char(CSV.char\u NEWLINE))>=0||
string.toString().indexOf(char(CSV.char\u封装))>=0
);
}
函数封装(字符串){
var wrapperChar=char(CSV.char\u封装)
,replaceWith=“\\”+char(CSV.char\u封装)
,escapedValue=string.toString().replace(新的RegExp(wrapperChar,'g'),replaceWith);
返回wrapperChar+escapedValue+wrapperChar;
}
/**
*将对象数组解析为CSV输出
*/
//尝试{module.exports=CSV;}catch(e){}
函数CSV(对象、选项){
如果('object'!==typeof objects)抛出新的TypeError(“需要数组”);
选项='对象'==选项类型
?选择
: {};
对象=isArray(对象)
?objects.slice()
:[对象];
如果(!objects.length)抛出新错误(“至少需要一个对象”);
变量头=键(头(对象))
,buf=[];
while(objects.length){
var lbuf=[]
,object=objects.shift();
对于(变量i=0;iconsole.log(CSV(数据))
您可以将内容指定为普通字符串,并将内容转换为
csv
格式,文件扩展名为.csv

要将对象数组转换为csv格式的字符串,您可以使用下面的代码,然后将返回的字符串作为
内容
传递给您的
sendmailwithattachments

var isArray=Array.isArray
,keys=Object.keys;
CSV.CHAR_RETURN=0xd;
CSV.CHAR_NEWLINE=0xa;
CSV.DELIMITER=0x2c;
CSV.CHAR_封装=0x22;
职能主管(a){
返回[0];
}
函数尾部(a){
返回一个[a.length-1];
}
函数char(c){
返回'number'==c的类型
?String.fromCharCode.apply(null,参数)
:c;
}
函数需要封装(字符串){
return!!字符串&&(
string.toString().indexOf(char(CSV.DELIMITER))>=0||
string.toString().indexOf(char(CSV.char\u RETURN))>=0||
string.toString().indexOf(char(CSV.char\u NEWLINE))>=0||
string.toString().indexOf(char(CSV.char\u封装))>=0
);
}
函数封装(字符串){
var wrapperChar=char(CSV.char\u封装)
,replaceWith=“\\”+char(CSV.char\u封装)
,escapedValue=string.toString().replace(新的RegExp(wrapperChar,'g'),replaceWith);
返回wrapperChar+escapedValue+wrapperChar;
}
/**
*将对象数组解析为CSV输出
*/
//尝试{module.exports=CSV;}catch(e){}
函数CSV(对象、选项){
如果('object'!==typeof objects)抛出新的TypeError(“需要数组”);
选项='对象'==选项类型
?选择
: {};
对象=isArray(对象)
?objects.slice()
:[对象];
如果(!objects.length)抛出新错误(“至少需要一个对象”);
变量头=键(头(对象))
,buf=[];
while(objects.length){
var lbuf=[]
,object=objects.shift();
对于(变量i=0;iconsole.log(CSV(数据))我最终找到了两种解决方法,两种方法都奏效了
      /*1. using `to-csv` module -> `npm i to-csv`*/
      var toCsv = require('to-csv');
      attachments: [{filename: subject + '.csv',content: toCsv(content)}]

     or

     /* 2. using `json2csv` module -> npm i json2csv*/
     attachments: [{filename: subject + '.csv',content:json2csv(content)}]

       function json2csv(content){
       const { Parser } = require('json2csv');
       var fields = getFields(content);
       return new Parser({ fields }).parse(content);

       function getFields(content){
            var fields = [];
            for(var i = 0; i < content.length; i++){
                fields = Object.keys(content[i]);
                if(fields.length > 0)
                    break;
            };
            return fields;
        }
        }