Building a Simple Email Sending API with Express and Node.js
Tags: webdev, javascript, programming, beginners
Published: 2023-12-28 08:15:00

In this blog post, we'll walk through creating a simple email sending API using Express and Node.js.

## Setting Up the Environment

To get started, let's set up a basic Express server that will handle API requests for sending emails. Here's an overview of the project structure:

### Project Structure

```
project-root
│   index.js
│
├── routes
│   └── email.js
│
├── controllers
│   └── email.js
│
└── utils
    └── sendEmails.js
```

## Getting Started with Code

### 1. Setting Up the Server (index.js)

Our index.js file initializes the Express server, sets up middleware, and defines routes for handling email-related requests.

```jsx
const express = require("express");
const cors = require("cors");
const PORT = process.env.PORT || 3000;

require("dotenv").config();

const app = express();

app.use(express.json());

app.use(cors({
    origin: ['http://localhost:3000'],
    credentials: true,
}));

app.use("/api", require("./routes/email"));

app.listen(PORT, () => {
    console.log(`Server started on port ${PORT}`);
});
```

## 2. Creating the Email Route (email.js)

We define an email route in routes/email.js to handle POST requests for sending emails.

```jsx
const express = require('express');
const router = express.Router();
const { sendEmail } = require('../controllers/email.js');

router.post('/data', sendEmail);

module.exports = router;
```

## 3. Handling Email Sending Logic (controllers/email.js)

The controllers/email.js file contains the logic to handle email sending based on the received request.

```jsx
const sendEmail = require("../utils/sendEmails");

require("dotenv").config();

exports.sendEmail = async (req, res) => {
    try {
        const { email, message } = req.body;

        if (!email) {
            return res.status(400).json({ message: "Email is required." });
        }

        const options = {
            to: email,
            subject: "Test",
            message: message,
        };

        await sendEmail(options);

        res.status(200).json({
            message: "Check your mail!",
        });
    } catch (error) {
        console.error(error);
        res.status(500).json({ message: "Internal server error" });
    }
};
```

## 4. Email Sending Utility (utils/sendEmails.js)

The utils/sendEmails.js file contains the function responsible for sending emails using Nodemailer.

```jsx
const nodeMailer = require("nodemailer");

const sendEmail = async (options) => {
    const transporter = nodeMailer.createTransport({
        host: process.env.SMPT_HOST,
        port: process.env.SMPT_PORT,
        service: process.env.SMPT_SERVICE,
        auth: {
            user: process.env.SMPT_MAIL,
            pass: process.env.SMPT_APP_PASS,
        },
    });

    const mailOptions = {
        from: process.env.SMPT_MAIL,
        to: options.to,
        subject: options.subject,
        html: options.message,
    };

    await transporter.sendMail(mailOptions);
};

module.exports = sendEmail;
```

## Configuration and Testing

Before running this application, ensure you have the necessary environment variables set in a .env file containing your SMTP configuration.

```env
SMPT_HOST=your_smtp_host
SMPT_PORT=your_smtp_port
SMPT_SERVICE=your_smtp_service
SMPT_MAIL=your_email_address
SMPT_APP_PASS=your_email_app_password
```

Once configured, start your server using node index.js and test the API using tools like Postman or by sending requests from your frontend application.

## Conclusion

Congratulations! You've now created a basic API using Express and Node.js to facilitate email sending. This simple setup can be expanded and enhanced to suit more complex requirements by adding features like email templates, attachments, or error handling for various scenarios.

## Reference

For detailed implementation, you can refer to the following GitHub repository:

[Node.js Nodemailer Example Repository](https://github.com/manthanank/nodejs-nodemailer)