2014-02-21 24 views
7

我有与nodemailer的NodeJS发送电子邮件的代码,但我想文件附加到电子邮件,但我不能找到办法做到这一点我上搜索网,但我找不到有用的东西。有什么方法可以将文件附加到该文件或可以帮助我将文件附加到nodemailer的资源?如何文件附加到电子邮件nodemailer

var nodemailer = require('nodemailer'); 
var events = require('events'); 
var check =1; 
var events = new events.EventEmitter(); 
var smtpTransport = nodemailer.createTransport("SMTP",{ 
    service: "gmail", 
    auth: { 
     user: "[email protected]", 
     pass: "pass" 
    } 
}); 
function inputmail(){ 
    ///////Email 
    const from = 'example<[email protected]>'; 
    const to = '[email protected]'; 
    const subject = 'example'; 
    const text = 'example email'; 
    const html = '<b>example email</b>'; 
    var mailOption = { 
     from: from, 
     to: to, 
     subject: subject, 
     text: text, 
     html: html 
    } 
    return mailOption; 
} 
function send(){ 
     smtpTransport.sendMail(inputmail(),function(err,success){ 
     if(err){ 
      events.emit('error', err); 
     } 
     if(success){ 
      events.emit('success', success); 
     } 
    }); 
} 
/////////////////////////////////// 
send(); 
events.on("error", function(err){ 
    console.log("Mail not send"); 
    if(check<10) 
     send(); 
    check++; 
}); 
events.on("success", function(success){ 
    console.log("Mail send"); 
}); 
+1

你看看http://stackoverflow.com/questions/4672903/sending-mails-with-attachment-via-nodejs? – Spork

+0

是的,我读过它,但我完全不明白答案。 – DanialV

回答

28

包括在var mailOption关键附件,如下:

var mailOptions = { 
... 
attachments: [ 
    { // utf-8 string as an attachment 
     filename: 'text1.txt', 
     content: 'hello world!' 
    }, 
    { // binary buffer as an attachment 
     filename: 'text2.txt', 
     content: new Buffer('hello world!','utf-8') 
    }, 
    { // file on disk as an attachment 
     filename: 'text3.txt', 
     path: '/path/to/file.txt' // stream this file 
    }, 
    { // filename and content type is derived from path 
     path: '/path/to/file.txt' 
    }, 
    { // stream as an attachment 
     filename: 'text4.txt', 
     content: fs.createReadStream('file.txt') 
    }, 
    { // define custom content type for the attachment 
     filename: 'text.bin', 
     content: 'hello world!', 
     contentType: 'text/plain' 
    }, 
    { // use URL as an attachment 
     filename: 'license.txt', 
     path: 'https://raw.github.com/andris9/Nodemailer/master/LICENSE' 
    }, 
    { // encoded string as an attachment 
     filename: 'text1.txt', 
     content: 'aGVsbG8gd29ybGQh', 
     encoding: 'base64' 
    }, 
    { // data uri as an attachment 
     path: 'data:text/plain;base64,aGVsbG8gd29ybGQ=' 
    } 
] 

}

选择与调整到您需要的选项。

链接:Nodemailer Repository GitHub

GOOD LUCK !!

+0

感谢您展示所有这些不同的方式! “作为附件的磁盘上的文件”方法(您评论过)为我工作。 –

+0

磁盘上的文件作为附件为我工作! – emaxsaun

2

我测试了这些附件的每一个方法,但对我而言没有问题。这里是没有SMTP传输配置我的邮件功能代码:

function mailer(from, to, subject, attachments, body) { 

    // Setup email 
    var mailOptions = { 
     from: from, 
     to: to, 
     subject: subject, 
     attachments: attachments, 
     html: body 
    }; 

    // send mail with defined transport object 
    smtpTransport.sendMail(mailOptions, function(error, response){ 
     if(error) console.log(error); 
     else console.log("Message sent: " + response.message); 
     // shut down the connection pool, no more messages 
     smtpTransport.close(); 
    }); 
} 

然后调用:

var attachments = [{ filename: 'test.pdf', path: __dirname + '/pdf/test.pdf', contentType: 'application/pdf' }]; 
mailer("[email protected]", "[email protected]", "Test", attachments, "<h1>Hello</h1>"); 

邮件附带成功,但没有附着物。即使我设置了字符串或缓冲区附件,它也是相同的结果。

0

另一种解决方案是使用CDN在线托管图像并链接到HTML中的在线图像源,例如, <img src="list_image_url_here">

(我曾与nodemailer的形象使用nodemailer 2.6.0版,这就是为什么我想通了,这种解决方法嵌入的问题。)

另外一个这种解决方案的好处是,你不发送附件nodemailer,所以发送过程更加简化。

0
var express = require('express'); 
var router = express(), 
multer = require('multer'), 
upload = multer(), 
fs = require('fs'), 
path = require('path'); 
nodemailer = require('nodemailer'), 

directory = path.dirname(""); 
var parent = path.resolve(directory, '..'); 
// your path to store the files 
var uploaddir = parent + (path.sep) + 'emailprj' + (path.sep) + 'public' + (path.sep) + 'images' + (path.sep); 
/* GET home page. */ 
router.get('/', function(req, res) { 
res.render('index.ejs', { 
    title: 'Express' 
}); 
}); 

router.post('/sendemail', upload.any(), function(req, res) { 

var file = req.files; 
console.log(file[0].originalname) 
fs.writeFile(uploaddir + file[0].originalname, file[0].buffer,  function(err) { 
    //console.log("filewrited") 
    //console.log(err) 
}) 
var filepath = path.join(uploaddir, file[0].originalname); 
console.log(filepath) 
    //return false; 
nodemailer.mail({ 
    from: "yourgmail.com", 
    to: req.body.emailId, // list of receivers 
    subject: req.body.subject + " ✔", // Subject line 
    html: "<b>" + req.body.description + "</b>", // html body 
    attachments: [{ 
     filename: file[0].originalname, 
     streamSource: fs.createReadStream(filepath) 
    }] 
}); 
res.send("Email has been sent successfully"); 
}) 
module.exports = router; 
+2

解释你的答案。 – Mistalis

+0

获取不能属性'0'的undefined.Because这个文件[0] .originalname.If我用于循环这个我得到错误。我可以如何解决? –

0
var mailer = require('nodemailer'); 
mailer.SMTP = { 
    host: 'host.com', 
    port:587, 
    use_authentication: true, 
    user: '[email protected]', 
    pass: 'xxxxxx' 
}; 

Then read a file and send an email : 

fs.readFile("./attachment.txt", function (err, data) { 

    mailer.send_mail({  
     sender: '[email protected]', 
     to: '[email protected]', 
     subject: 'Attachment!', 
     body: 'mail content...', 
     attachments: [{'filename': 'attachment.txt', 'content': data}] 
    }), function(err, success) { 
     if (err) { 
      // Handle error 
     } 

    } 
}); 
+1

请不要提供代码唯一的答案,解释OP为什么你的代码正在帮助他/她的问题 – Unlockedluca