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");
});
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!!
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.
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'
}
]
}
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.
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
}
}
});
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
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;