2014-02-21 2 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

Включить в вар 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

удачи !!

+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

, пожалуйста, не предоставляйте ответы только на код, объясните, почему ваш код помогает решить проблему – Unlockedluca

Смежные вопросы