Nerd For Tech
Published in

Nerd For Tech

Coding a Contact Form with Next.js and Nodemailer

Photo by Volodymyr Hryshchenko on Unsplash

Step One: Create Next App

npx create-next-app

Step Two: Add the Form

git on outta here, boilerplate
Remember to use htmlFor when working with labels in React and Next!
<div className={styles.container}>
< form className={styles.main} >
< formGroup className={styles.inputGroup} >
< label htmlFor='name'>Name</label>
< input type='text' name='name' className={styles.inputField} />
</formGroup>
< formGroup className={styles.inputGroup} >
< label htmlFor='email'>Email</label>
< input type='email' name='email' className={styles.inputField} />
</formGroup>
< formGroup className={styles.inputGroup} >
< label htmlFor='message'>Message</label>
< input type='text' name='message' className={styles.inputField} />
</formGroup>
< input type='submit'/>
</form >
</div>
.inputGroup {
height: 50%;
width: 200%;
display: flex;
flex-direction: column;
margin: 10px 0;
}
.inputLabel {
text-align: left;
}
.inputField {
height: 30px;
}

Step Three: Set up front-end functionality

import { useState } from 'react'
const [name, setName] = useState('')
const [email, setEmail] = useState('')
const [message, setMessage] = useState('')
const [submitted, setSubmitted] = useState(false)
< input type='text' name='name' className={styles.inputField} />
< input type='text' onChange={(e)=>{setName(e.target.value)}} name='name' className={styles.inputField} />
Remember to change ‘setName’ to ‘setEmail’ and ‘setMessage,’ respectively

Step Four: Handling Submit

const handleSubmit = (e) => {
[ Code goes here, eventually ]
}
const handleSubmit = (e) => { 
e.preventDefault()
console.log('Sending')
let data = {
name,
email,
message
}
})
const handleSubmit = (e) => { 
e.preventDefault()
console.log('Sending')
let data = {
name,
email,
message
}
fetch('/api/contact', {
method: 'POST',
headers: {
'Accept': 'application/json, text/plain, */*',
'Content-Type': 'application/json'
},
body: JSON.stringify(data)
})
})
const handleSubmit = (e) => { 
e.preventDefault()
console.log('Sending')
let data = {
name,
email,
message
}
fetch('/api/contact', {
method: 'POST',
headers: {
'Accept': 'application/json, text/plain, */*',
'Content-Type': 'application/json'
},
body: JSON.stringify(data)
}).then((res) => {
console.log('Response received')
if (res.status === 200) {
console.log('Response succeeded!')
setSubmitted(true)
setName('')
setEmail('')
setBody('')
}
})
})
< input type='submit' onClick={(e)=>{handleSubmit(e)}}/>

Step Five: Build the API Route

export default function (req, res) {
console.log(req.body)
}

Step Six: But What About Nodemailer

npm i nodemailer
export default function (req, res) {  let nodemailer = require('nodemailer')
const transporter = nodemailer.createTransport({});
console.log(req.body)
}
  const transporter = nodemailer.createTransport({
port: 465,
host: "smtp.gmail.com",
auth: {
user: 'demo@demo.gmail',
pass: 'password',
},
secure: true,
})

Step Seven: Creating the Account

npm i dotenv
touch .env
password=Whatever your account password is
require('dotenv').config()
const PASSWORD = process.env.password

Step Eight: Putting It All Together

  const mailData = {
from: 'demo@demo.com',
to: 'your email',
subject: `Message From ${req.body.name}`,
text: req.body.message,
html: <div>{req.body.message}</div>
}
transporter.sendMail(mailData, function (err, info) {
if(err)
console.log(err)
else
console.log(info)
})
res.status(200)
export default function (req, res) {
require('dotenv').config()

let nodemailer = require('nodemailer')
const transporter = nodemailer.createTransport({
port: 465,
host: "smtp.gmail.com",
auth: {
user: 'demo email',
pass: process.env.password,
},
secure: true,
})
const mailData = {
from: 'demo email',
to: 'your email',
subject: `Message From ${req.body.name}`,
text: req.body.message + " | Sent from: " + req.body.email,
html: `<div>${req.body.message}</div><p>Sent from:
${req.body.email}</p>`
}
transporter.sendMail(mailData, function (err, info) {
if(err)
console.log(err)
else
console.log(info)
})
res.status(200)
}

--

--

NFT is an Educational Media House. Our mission is to bring the invaluable knowledge and experiences of experts from all over the world to the novice. To know more about us, visit https://www.nerdfortech.org/.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store