UNPKG

create-emails

Version:

A Node.js API to create email accounts using cPanel’s API. This package automates email account creation, making it useful for hosting services, SaaS applications, and businesses that need email provisioning.

248 lines (215 loc) 6.72 kB
import axios from "axios"; import express from "express"; import dotenv from "dotenv"; import Imap from "imap"; import { simpleParser } from "mailparser"; dotenv.config(); const cpanelHostUrl = process.env.cpanelHost; const cpanelUsername = process.env.cpanelUsername; const cpanelPassword = process.env.cpanelPassword; const app = express(); app.use(express.json()); app.post("/create-email-cpanel", async (req, res) => { const { domain, email, password, cpanelUser, cpanelPass, cpanelHost } = req.body; const authPanel = { username: cpanelUser || cpanelUsername, password: cpanelPass || cpanelPassword, }; if (!domain || !email || !password) { return res.status(400).json({ error: "Missing required fields" }); } const apiEndpoint = `https://${ cpanelHost || cpanelHostUrl }:2083/execute/Email/add_pop`; const data = { domain, email, password, quota: 100, }; try { const response = await axios.post(apiEndpoint, data, { auth: authPanel, headers: { "Content-Type": "application/x-www-form-urlencoded", }, }); if (response.data.status == 1) { return res.json(response.data); } return res.status(405).json(response.data); } catch (error) { res.status(500).json({ error: error.message }); } }); //create to delete email app.post("/delete-email-cpanel", async (req, res) => { const { domain, email, cpanelUser, cpanelPass, cpanelHost } = req.body; const authPanel = { username: cpanelUser || cpanelUsername, password: cpanelPass || cpanelPassword, }; if (!domain || !email) { return res.status(400).json({ error: "Missing required fields" }); } const apiEndpoint = `https://${ cpanelHost || cpanelHostUrl }:2083/execute/Email/delete_pop`; const data = { domain, email, }; try { const response = await axios.post(apiEndpoint, data, { auth: authPanel, headers: { "Content-Type": "application/x-www-form-urlencoded", }, }); if (response.data.status == 1) { return res.json(response.data); } return res.status(405).json(response.data); } catch (error) { res.status(500).json({ error: error.message }); } }); //read Indox Draft Sent emails app.post("/list-all-emails-cpanel", async (req, res) => { const { domain, email, cpanelUser, cpanelPass, cpanelHost } = req.body; const authPanel = { username: cpanelUser || cpanelUsername, password: cpanelPass || cpanelPassword, }; if (!domain || !email) { return res.status(400).json({ error: "Missing required fields" }); } const apiEndpoint = `https://${ cpanelHost || cpanelHostUrl }:2083/execute/Email/list_pops`; const data = { domain, email, }; try { const response = await axios.post(apiEndpoint, data, { auth: authPanel, headers: { "Content-Type": "application/x-www-form-urlencoded", }, }); if (response.data.status == 1) { return res.json(response.data); } return res.status(405).json(response.data); } catch (error) { res.status(500).json({ error: error.message }); } }); // API Endpoint to fetch emails app.post("/emails", async (req, res) => { const { folder = "INBOX", domain, email, password, cpanelUser, cpanelPass, cpanelHost, } = req.body; console.log(`${email}@${domain}`); // Default to INBOX if no folder is provided const imapConfig = { user: `${email}@${domain}`, password, host: "jamfortetech.com", // Replace with your IMAP server port: 993, tls: true, tlsOptions: { rejectUnauthorized: false }, }; try { // const emails = await getEmails(imapConfig); // console.log("emails",emails) const emails = await fetchEmails(folder, imapConfig); // console.log("emails", emails); res.status(200).json({ success: true, emails }); } catch (error) { console.log(error.message); throw new Error(error.message); // res.status(500).json({ error: error.message }); } }); // Function to fetch emails from the specified folder function fetchEmails(folder = "INBOX", imapConfig) { return new Promise((resolve, reject) => { const imap = new Imap(imapConfig); const emails = []; imap.once("ready", function () { console.log("IMAP connection established"); imap.getBoxes((err, boxes) => { if (err) console.error("Error listing folders:", err); else console.log("Available folders:", boxes); }); imap.openBox(folder, true, function (err, box) { if (err) { reject(`Error opening folder: ${err}`); return; } console.log("Folder opened:", folder); imap.search(["ALL"], function (err, results) { if (err) { reject(`Error searching emails: ${err}`); return; } if (!results || results.length === 0) { console.log("No emails found"); resolve([]); imap.end(); return; } console.log("Found emails:", results.length); const f = imap.fetch(results, { bodies: "" }); f.on("message", function (msg, seqno) { msg.on("body", function (stream) { simpleParser(stream, (err, parsed) => { if (err) { console.error("Error parsing email:", err); return; } const email = { subject: parsed.subject, from: parsed.from?.text, date: parsed.date, textBody: parsed.text, htmlBody: parsed.html, }; console.log("Parsed email:", email); emails.push(email); }); }); }); f.once("error", function (err) { reject(`Fetch error: ${err}`); }); f.once("end", function () { console.log("Done fetching all messages!"); imap.end(); }); }); }); }); imap.once("error", function (err) { reject(`IMAP error: ${err}`); }); imap.once("end", function () { console.log("IMAP connection closed."); resolve(emails); }); imap.connect(); }); } const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(`Server is running on port ${PORT}`); });