Как подключить файл к письму с помощью nodemailer

У меня есть код, который отправляет электронное письмо с nodemailer в nodejs, но я хочу прикреплять файл к электронной почте, но я не могу найти способ сделать это, я ищу в сети но я не мог найти что-то полезное. Есть ли способ, с помощью которого я могу прикреплять файлы к этому или любому ресурсу, который может помочь мне подключить файл с помощью 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

Включите в 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 GitHub

Удачи!!

Ответ 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>");

Почта приходит успешно, но без вложения. Даже если я установил привязку строки или буфера, вы получите тот же результат.

Ответ 3

Если вы передаете объект параметров в конструкторе mail composer, а вложение находится на http-сервере, оно должно выглядеть следующим образом:

const options = {
    attachments = [
      { // use URL as an attachment
        filename: 'xxx.jpg',
        path: 'http:something.com/xxx.jpg'
      }
    ]
}

Ответ 4

Альтернативным решением является размещение ваших изображений в Интернете с использованием CDN и ссылка на источник онлайн-изображений в вашем HTML, например. <img src="list_image_url_here">.

(У меня были проблемы с вложением изображений nodemailer с использованием nodemailer версии 2.6.0, поэтому я понял это обходное решение.)

Дополнительным преимуществом этого решения является то, что вы не отправляете вложения в nodemailer, поэтому процесс отправки более оптимизирован.

Ответ 5

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;

Ответ 6

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
        }

    }
});

Ответ 7

Ваш код почти правильный, просто нужно добавить свойство "attachments" для вложения файлов в вашу почту,

ВАША почтаОпция:

var mailOption = {от: от, до: до, тема: тема, текст: текст, html: html}

Просто добавьте вложения вроде

var mailOption = {от: от, до: до, тема: тема, текст: текст, html: html, вложения: [имя файла: изменить с именем файла, путь: изменить с путем файла}]}

Вложения также предоставляют другой способ прикрепления файла для получения дополнительной информации. Проверьте документацию сообщества nodemailer ЗДЕСЬ.