diff --git a/demo/payload.config.json b/demo/payload.config.json index 6de4253283..6e0ed3faeb 100644 --- a/demo/payload.config.json +++ b/demo/payload.config.json @@ -45,6 +45,14 @@ "height": 16 } ], + "email": { + "provider": "smtp", + "host": "smtp.ethereal.email", + "port": 587, + "secure": false, + "fromName": "John Doe", + "fromAddress": "john.doe@payloadcms.com" + }, "graphQL": { "path": "/graphql", "graphiql": true diff --git a/package.json b/package.json index 0ab0f44884..fc13bbe385 100644 --- a/package.json +++ b/package.json @@ -38,6 +38,7 @@ "method-override": "^3.0.0", "mkdirp": "^0.5.1", "mongoose-autopopulate": "^0.9.1", + "nodemailer": "^6.1.1", "passport": "^0.4.0", "passport-jwt": "^4.0.0", "passport-local": "^1.0.0", diff --git a/src/index.js b/src/index.js index b388880170..fb07ea4b80 100644 --- a/src/index.js +++ b/src/index.js @@ -7,6 +7,7 @@ import jwtStrategy from './auth/jwt'; import User from '../demo/User/User.model'; import fileUpload from 'express-fileupload'; import mediaRoutes from './routes/media.routes'; +import emailRoutes from './routes/email.routes'; import config from '../demo/payload.config'; import locale from './middleware/locale'; import expressGraphQL from 'express-graphql'; @@ -58,6 +59,8 @@ module.exports = { options.app.use(locale(options.config.localization)); options.app.use(options.router); + options.router.use('/forgot', emailRoutes(options.config.email)); + if (options.config.graphQL && options.graphQLSchema) { options.app.use( options.config.graphQL.path, diff --git a/src/routes/email.routes.js b/src/routes/email.routes.js new file mode 100644 index 0000000000..53761eda31 --- /dev/null +++ b/src/routes/email.routes.js @@ -0,0 +1,49 @@ +import express from 'express'; +import passport from 'passport'; +import * as nodemailer from 'nodemailer'; + +const router = express.Router(); +const emailRoutes = emailConfig => { + + router + .route('') + .post( + passport.authenticate('jwt', { session: false }), + (req, res, next) => smtpEmailHandler(req, res, next, emailConfig) + ); + + return router; +}; + +const smtpEmailHandler = async (req, res, next, emailConfig) => { + try { + let testAccount = await nodemailer.createTestAccount(); + + // create reusable transporter object using the default SMTP transport + let transporter = nodemailer.createTransport({ + host: emailConfig.host, + port: emailConfig.port, + secure: emailConfig.secure, // true for 465, false for other ports + auth: { + user: testAccount.user, // generated ethereal user + pass: testAccount.pass // generated ethereal password + } + }); + + // send mail with defined transport object + let info = await transporter.sendMail({ + from: `"${emailConfig.fromName}" <${emailConfig.fromAddress}>`, + to: req.body.toAddress, + subject: req.body.subject || 'Password Reset', + text: req.body.text || '', + }); + + res.sendStatus(200); + } catch (e) { + console.log(e); + res.status(500).json({success: false, error: 'Unable to send e-mail'}); + } + +}; + +export default emailRoutes;