2017-04-26 1 views
2

J'ai essayé d'installer et d'utiliser nodemailer sur mon application MEAN. Voici mail.js ... un chemin que j'utilise pour mon fichier server.js.Erreur: Aucun destinataire défini lors de la tentative d'utilisation de nodemailer mais du destinataire listé

'use strict'; 
const express = require('express'); 
const router = express.Router(); 
const nodemailer = require('nodemailer'); 
const config = require('./config'); 
const Message = require('../models/message'); 

var transporter = nodemailer.createTransport({ 
    service: 'gmail', 
    secure: false, 
    port: 25, 
    auth: { 
    user: config.mailUser, //same as from in mailOptions 
    pass: config.mailPass 
    }, 
    tls: { 
    rejectUnauthorized: false 
    } 
}); 

router.post('/contact', function(req, res){ 
    var mailOptions = new Message({ 
    from: '[email protected]', 
    to: req.body.to, 
    subject: req.body.subject, 
    text: req.body.text 
    //html: req.body.html 
    }); 

    transporter.sendMail(mailOptions, function(error, info){ 
    if(error){ 
     return console.log(error); 
    } 
    return console.log('Message %s sent: %s', info.messageId, info.response); 
    }); 
}); 

module.exports = router; 

et mon fichier config.js ressemble à ceci. J'utilise postman pour faire des appels API au backend mais le résultat est l'erreur indiquée dans le titre. Quelqu'un sait pourquoi? Il semble que le destinataire est défini.

*** Mise à jour

Voici mon application express

const express = require('express'); 
const cookieParser = require('cookie-parser'); 
const bodyParser = require("body-parser"); 
const mongoose = require('mongoose'); 

const appRoutes = require('./routes/app'); 
const keyRoutes = require('./routes/keys'); 
const mailRoutes = require('./routes/mail'); 

const app = express(); 
const uristring = 
    process.env.MONGOLAB_URI || 
    process.env.MONGOHQ_URL || 
    'mongodb://localhost/db'; 


mongoose.connect(uristring, function (err, res) { 
    if (err) { 
    console.log ('ERROR connecting to: ' + uristring + '. ' + err); 
    } else { 
    console.log ('Succeeded connected to: ' + uristring); 
    } 
    }); 

app.use(express.static(__dirname + '/dist')); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({extended: false})); 
app.use(cookieParser()); 

app.use(function (req,res,next) { 
    res.header('Access-Control-Allow-Origin', '*'); 
    res.header('Access-Control-Allow-Headers','Origin, X-Requested-With, Content-Type, Accept'); 
    res.header('Access-Control-Allow-Methods', 'POST, GET, PATCH, DELETE, OPTIONS'); 
    next(); 

}); 

app.use('/mail', mailRoutes); 
app.use('/keys', keyRoutes); 
app.use('/', appRoutes); 

//catch 404 and forward error handler 
app.use(function (req, res, next) { 
    return res.json('src/index'); 
}); 

app.listen(process.env.PORT || 8080); 

module.exports = app; 

et voici la demande que je envoie enter image description here

enter image description here

*** Mise à jour

Voici m y classe de message.

const mongoose = require('mongoose'); 
const Schema = mongoose.Schema; 

const schema = new Schema({ 
    from: {type: String, required: true}, 
    to: {type: String, required: true}, 
    subject: {type: String, required: true}, 
    text: {type: String, required: true}, 
    html: {type: String, required: false} 
}); 

module.exports = mongoose.model('Message', schema); 
+0

montre la demande que vous effectuez, et la configuration rapide s'il vous plaît. –

+0

J'ai édité ma réponse contenant ma demande expresse d'application et de postier –

+0

Vérifiez ma réponse éditée, vérifiez si vous avez placé 'Content-Type: application/json' dans votre demande de facteur. –

Répondre

1

Le problème réside dans le schéma mongoose. Je ne suis pas expert en mangouste, en fait, jamais utilisé dans ma vie, mais lors du débogage de votre code, j'ai trouvé pourquoi vous avez eu des problèmes essayant de se faire:

Lorsque vous imprimez ce schéma à l'aide console.log

let mailOptions = new Message({ 
     from: '[email protected]', 
     to: req.body.to, 
     subject: req.body.subject, 
     text: req.body.text 
    //html: req.body.html 
}); 

il produit ce qui suit:

{ from: '[email protected]', 
    to: '[email protected]', 
    subject: 'My subject', 
    text: 'Email body', 
    _id: 590135b96e08e624a3bd30d2 } 

Ce qui semble être un objet ordinaire. En fait (à l'exception de la partie _id) elle sortie le même que:

let mailOptions = { 
    from: '[email protected]om', 
    to: req.body.to, 
    subject: req.body.subject, 
    text: req.body.text 
    //html: req.body.html 
}; 

Mais les ces derniers travaux lors du passage à nodemailer.

J'ai donc essayé de comprendre l'identité réelle de mailOptions (Comme je suis JSON Bourne ou quelque chose)

utilisant:

console.log(Object.assign({}, mailOptions)); 

Je reçois ce qui suit, ce qui bien sûr doesn » t bien paraître à nodemailer.

{ '$__': 
    InternalCache { 
    strictMode: true, 
    selected: undefined, 
    shardval: undefined, 
    saveError: undefined, 
    validationError: undefined, 
    adhocPaths: undefined, 
    removing: undefined, 
    inserting: undefined, 
    version: undefined, 
    getters: {}, 
    _id: undefined, 
    populate: undefined, 
    populated: undefined, 
    wasPopulated: false, 
    scope: undefined, 
    activePaths: StateMachine { paths: [Object], states: [Object], stateNames: [Object] }, 
    ownerDocument: undefined, 
    fullPath: undefined, 
    emitter: EventEmitter { domain: null, _events: {}, _eventsCount: 0, _maxListeners: 0 } }, 
    isNew: true, 
    errors: undefined, 
    _doc: 
    { _id: 590137d8f8c7152645180e04, 
    text: 'Email body', 
    subject: 'My subject', 
    to: '[email protected]', 
    from: '[email protected]' } } 

En lisant les documents mangouste j'ai trouvé une méthode pour convertir en un simple objet javascript qui fonctionne très bien avec nodemailer. Cette méthode est la suivante:

toObject

somme Donc, vous avez deux possibilités:

1)transporter.sendMail(mailOptions.toObject() //... si vous souhaitez utiliser le schéma de mangouste (je ne sais vraiment pas pourquoi, mais. ..)

2) Laissez tomber le schéma mangouste et il suffit d'utiliser: (Ceci est mon approche recommandée, car mangouste n'a rien à voir avec nodemailer)

let mailOptions = { 
    from: '[email protected]', 
    to: req.body.to, 
    subject: req.body.subject, 
    text: req.body.text 
    //html: req.body.html 
}; 

testé à la fois, et je vous envoie l'e-mail sans problème.

+0

Merci pour la réponse. J'ai déjà des en-têtes sur application/json. Vérifiez mes modifications pour la capture d'écran du facteur –

+0

@JonathanCorrin Avez-vous des valeurs pour 'req.body.to' J'ai copié votre code (seulement la partie express & routeur) et fonctionne bien. –

+0

Montrez-nous votre classe de message, il semble que vous avez un problème là-bas. –