web-dev-qa-db-fra.com

Comment joindre un fichier à un email avec nodemailer

J'ai un code qui envoie un email avec nodemailer in nodejs mais je veux joindre le fichier à un email mais je ne trouve pas le moyen de le faire. Je cherche sur le net mais je ne trouve pas quelque chose d'utile. Est-il possible de joindre des fichiers avec cela ou une ressource qui peut m'aider à joindre un fichier avec 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");
});
12
DanialV

Incluez dans la variable mailOption les pièces jointes clés, comme suit:

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='
    }
]

}

Choisissez l'option qui s'adapte à vos besoins.

Lien: Nodemailer Repository GitHub

Bonne chance!!

41
Harry Martel

J'ai testé chacune de ces méthodes d'attachement et aucune ne me convient. Voici le code de ma fonction mailer sans la configuration de transport 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();
    });
}

Et puis l'appel:

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

Le courrier arrive avec succès mais sans pièce jointe. Même si je mets une chaîne ou un tampon, le résultat est le même.

6
Ben

Si vous passez l'objet options dans le constructeur de composeur de courrier et que la pièce jointe est sur un serveur http, il devrait ressembler à ceci:

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

La solution alternative consiste à héberger vos images en ligne à l'aide d'un CDN et à créer un lien vers la source d'images en ligne dans votre code HTML, par exemple. <img src="list_image_url_here">

(J'ai eu des problèmes d'intégration d'images dans nodemailer à l'aide de nodemailer version 2.6.0, c'est pourquoi j'ai proposé cette solution de contournement.)

Un avantage supplémentaire de cette solution est que vous n'envoyez aucune pièce jointe à nodemailer, ce qui simplifie le processus d'envoi.

0
ginna
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
        }

    }
});
0
esraa ali

Votre code est presque correct, il suffit d’ajouter la propriété "pièces jointes" pour joindre les fichiers à votre courrier, 

VOTRE mailOption:

var mailOption = {
        from: from,
        to:  to,
        subject: subject,
        text: text,
        html: html
}

Il suffit d'ajouter des pièces jointes comme

var mailOption = {
        from: from,
        to:  to,
        subject: subject,
        text: text,
        html: html,
        attachments: [{
            filename: change with filename,
            path: change with file path
        }]
}

les pièces jointes fournissent également un autre moyen de joindre un fichier pour plus d'informations. Consultez la documentation de la communauté Nodemailer ICI

0
Dhawal
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;
0