nodemailer:无法发送 pdf 附件
nodemailer: cannot send pdf attachment
我刚刚开始学习 javascript,我想尝试构建一些小项目来开始学习。作为我第一次尝试的一部分,我正在构建一个将发送 pdf 附件的命令行工具。该脚本应根据传递给 javascript 的参数发送带有 pdf 附件的电子邮件。我通过谷歌搜索找到了一些 code 并对其进行了调整以满足我的需要,因为我想接受来自命令行的参数。我在下面包含了我正在使用的代码。它应该将 pdf 文件名 (test.pdf) 作为参数,然后将附加该文件的电子邮件发送给指定的收件人。如果我 运行 它和我的代码如图所示,我会收到电子邮件,但收到的附件显示 "undefined.pdf" 并且无法打开。
它只有在我将 path: '/home/user/attachments/' + myArgs[3],
行更改为 path: '/home/user/attachments/test.pdf',
时才有效,这破坏了脚本的要点,因为我不想在 [=24= 中对文件名进行硬编码] 附上 pdf 文件。
(为了测试,我 运行 从与附件 \home\user\attachments 相同的目录中安装脚本。)
谁能指出我做错了什么?我是 javascript 的新手,所以我猜我遗漏了一些明显的东西 :]...
var nodemailer = require('nodemailer');
var myArgs = process.argv.slice(2);
console.log('myArgs: ', myArgs);
// create reusable transporter object using SMTP transport
var transporter = nodemailer.createTransport({
service: 'Gmail',
auth: {
user: 'somebody@gmail.com',
pass: 'secret'
}
});
// NB! No need to recreate the transporter object. You can use
// the same transporter object for all e-mails
// setup e-mail data with unicode symbols
var mailOptions = {
from: 'Somebody <somebody@gmail.com>', // sender address
to: 'you@random.org, dude@blahblah.com', // list of receivers
subject: 'Hello', // Subject line
text: 'Hello world', // plaintext body
html: '<b>Hello world</b>', // html body
attachments: [
{ // filename and content type is derived from path
filename: myArgs[3],
path: '/home/user/attachments/' + myArgs[3],
contentType: 'application/pdf'
}
]
};
// send mail with defined transport object
transporter.sendMail(mailOptions, function(error, info){
if(error){
return console.log(error);
}
console.log('Message sent: ' + info.response);
});
TIA,
克里斯
让我们假设,您从控制台运行这样的命令:
node script.js file.pdf
process.argv
returns 包含命令行参数的数组。所以,它将是:
process.argv[0] = 'node'
process.argv[1] = 'path/to/script.js'
process.argv[2] = 'file.pdf
通过应用 slice(2)
,process.argv
转换为只有一个元素的数组:
process.argv[0] = 'file.pdf';
因此,您很可能应该将 myArgs[3]
更改为 myArgs[0]
。
或您应该添加更多参数,以便file
arg成为第六个。例如:
node script.js to@email.com from@email.com email subject file.pdf
我刚刚开始学习 javascript,我想尝试构建一些小项目来开始学习。作为我第一次尝试的一部分,我正在构建一个将发送 pdf 附件的命令行工具。该脚本应根据传递给 javascript 的参数发送带有 pdf 附件的电子邮件。我通过谷歌搜索找到了一些 code 并对其进行了调整以满足我的需要,因为我想接受来自命令行的参数。我在下面包含了我正在使用的代码。它应该将 pdf 文件名 (test.pdf) 作为参数,然后将附加该文件的电子邮件发送给指定的收件人。如果我 运行 它和我的代码如图所示,我会收到电子邮件,但收到的附件显示 "undefined.pdf" 并且无法打开。
它只有在我将 path: '/home/user/attachments/' + myArgs[3],
行更改为 path: '/home/user/attachments/test.pdf',
时才有效,这破坏了脚本的要点,因为我不想在 [=24= 中对文件名进行硬编码] 附上 pdf 文件。
(为了测试,我 运行 从与附件 \home\user\attachments 相同的目录中安装脚本。)
谁能指出我做错了什么?我是 javascript 的新手,所以我猜我遗漏了一些明显的东西 :]...
var nodemailer = require('nodemailer');
var myArgs = process.argv.slice(2);
console.log('myArgs: ', myArgs);
// create reusable transporter object using SMTP transport
var transporter = nodemailer.createTransport({
service: 'Gmail',
auth: {
user: 'somebody@gmail.com',
pass: 'secret'
}
});
// NB! No need to recreate the transporter object. You can use
// the same transporter object for all e-mails
// setup e-mail data with unicode symbols
var mailOptions = {
from: 'Somebody <somebody@gmail.com>', // sender address
to: 'you@random.org, dude@blahblah.com', // list of receivers
subject: 'Hello', // Subject line
text: 'Hello world', // plaintext body
html: '<b>Hello world</b>', // html body
attachments: [
{ // filename and content type is derived from path
filename: myArgs[3],
path: '/home/user/attachments/' + myArgs[3],
contentType: 'application/pdf'
}
]
};
// send mail with defined transport object
transporter.sendMail(mailOptions, function(error, info){
if(error){
return console.log(error);
}
console.log('Message sent: ' + info.response);
});
TIA, 克里斯
让我们假设,您从控制台运行这样的命令:
node script.js file.pdf
process.argv
returns 包含命令行参数的数组。所以,它将是:
process.argv[0] = 'node'
process.argv[1] = 'path/to/script.js'
process.argv[2] = 'file.pdf
通过应用 slice(2)
,process.argv
转换为只有一个元素的数组:
process.argv[0] = 'file.pdf';
因此,您很可能应该将 myArgs[3]
更改为 myArgs[0]
。
或您应该添加更多参数,以便file
arg成为第六个。例如:
node script.js to@email.com from@email.com email subject file.pdf