Search code examples
htmlnode.jsexpressundefinednodemailer

Error when sending emails using Nodemailer


server.js:

app.post('/game',(req,res,next)=>{
    //if(!emailValidator(req.body.email)){
      // I would do email validations client side to but if you
      // want to do server side send some html saying the email is invalid
      //res.sendFile(invalidEmail.html)
    //}
    //else{
      //I assume you have some script for sending email. I'll use nodemailer cuz its the first
      //module I found
      let sender = 'myemail@gmail.com'
      let transporter = nodemailer.createTransport({
        service:'gmail',
        auth:{
          user:sender,
          pass:'Mypassword'
        }
      })
      let mailOptions = {
        from: sender,
        to: req.body.email,
        subject:'New sign up',
        text:'Thanks for subscribing'
      }
      transporter.sendMail(mailOptions,function(error,info){
        if(error){
          // do somehting
          console.log(error)
        }
        else{
          console.log('Sent new user email')
          req.next()
        }
      })
    }
    //}
    )

index.html:

<form action="game" method="post" size="30">
    <input type="text" name="email"/>
    <input type="submit" />
</form>

I'm having this error:

TypeError: Cannot read property 'email' of undefined

So there is this error with my code, I'm trying to send an email with Nodemailer from a form in HTML, can someone help me fix this?

Also there is a part for email validation but I removed it as it says "emailValidator" is undefined.


Solution

  • Inside the main folder, create a public folder, inside it create an index.html file

    <!DOCTYPE html>
    <html>
    
    <head>
        <title>Simple page</title>
    </head>
    
    <body>
       <form action="game" method="post" size="30">
            <input type="text" name="email"/>
            <input type="submit" />
        </form>
    </body>
    
    </html>
    

    Inside the main folder, create a server.js file

    const express = require('express')
    const app = express()
    const path = require('path')
    const bodyParser = require('body-parser')
    const nodemailer = require('nodemailer')
    
    
    app.use(bodyParser.urlencoded({ extended: false }));
    
    app.use('/public', express.static(path.join(__dirname, 'public')));
    
    app.get('/', (req, res) => {
        res.sendFile(path.join(__dirname, 'public', 'index.html'))
    });
    
    
    app.post('/game', (req, res) => {
        let senderUsername = 'example@gmail.com' // sender email address
        let senderPassword = 'password'; // senders password
    
        const transporter = nodemailer.createTransport({
             service: 'Gmail',
             auth: {
                    user: senderUsername,
                    pass: senderPassword
                }
            });
    
            const mailOptions = {
              from: senderUsername, // sender address
              to: req.body.email, // list of receivers
              subject: 'New sign up', // Subject line
              html: '<p>Thanks for subscribing.</p>'// plain text body
            };
    
            transporter.sendMail(mailOptions, function (err, info) {
               if(err)
                 console.log(err)
               else {
                console.log('Sent new user email')
                console.log(info);
                req.next() 
               }
        });
    })
    
    const PORT = 5000;
    
    app.listen(PORT, ()=>{
        console.log(`server running on PORT ${PORT}`)
    })
    

    Note : You may also need to follow these steps while using a google account.

    Enable the settings to allow less secure apps for the Gmail account that you are using. Here is the link: Google less secure apps

    Allow access for "Display Unlock captcha option" (Allow access to your Google account) Here is the link: Google unlock captcha

    You can also explore MailJet or SendGrid for sending emails.