如何使用nodemailer正确发送gzip格式的MongoDB备份文件附件
修复步骤
- 修正路径和文件名匹配错误
你实际存储的备份文件路径是/public/myfile.gzip,但你脚本里的附件配置存在两个明显问题:
- 文件名不一致:配置里写的是
mygzip.gzip,和实际的myfile.gzip不符 - 路径拼接错误:如果你要访问系统根目录下的
/public路径,不需要加__dirname前缀,__dirname是当前脚本所在目录的路径,拼接后会变成相对脚本的路径,和你实际的绝对存储路径不符。如果你确认文件是存在脚本目录下的public子目录里,要确认文件实际放在对应位置,文件名和脚本里写的一致。
显式指定gzip文件的MIME类型
Nodemailer自动识别二进制文件类型出错时,会把gzip二进制内容当成纯文本传输,就会出现你看到的乱码字符串情况,需要在附件配置里手动指定contentType为application/gzip。修正回调参数名错误
你回调函数里的形参是error,但判断条件里写的是err,会导致发送错误无法正常捕获,你之前可能没看到路径不存在这类的报错提示。
修正后完整代码
const nodemailer = require('nodemailer'); let transporter = nodemailer.createTransport({ service: 'gmail', auth:{ user: 'xyz@gmail.com', // 注意Gmail现在不支持直接用账号密码登录,需要开启两步验证后生成应用专用密码填入此处 pass: 'xxxxxxx' } }); let mailContent={ from: 'Sender Name <xyz@gmail.com>', to: 'Receiver Name <receivername@gmail.com>', subject: 'First Node.js email', text: 'Hi,This is a test mail sent using Nodemailer', html: '<h1>You can send html formatted content using Nodemailer with attachments</h1>', attachments: [ { filename: 'myfile.gzip', // 文件在系统根目录的/public下用这个路径: path: '/public/myfile.gzip', // 如果文件在脚本目录的public子目录下,就用下面这个路径: // path: __dirname + '/public/myfile.gzip', // 显式指定gzip的MIME类型 contentType: 'application/gzip' } ] }; transporter.sendMail(mailContent, function(error, data){ if(error){ console.log('Unable to send mail, error:', error); }else{ console.log('Email send successfully'); } });
内容的提问来源于stack exchange,提问作者Kevin.a
相关产品推荐
相关产品推荐

