process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = 0; const express = require('express'); const nodemailer = require("nodemailer"); const request = require('sync-request'); const randomstring = require("randomstring"); const validator = require('validator'); const app = express(); let transporter = nodemailer.createTransport({ host: "mail.email.radio", port: 587, secure: false, // true for 465, false for other ports auth: { user: process.env.SYSTEM_USERNAME, // generated ethereal user pass: process.env.SYSTEM_PASSWORD, // generated ethereal password }, }); app.get('/signup', async (req, res) => { var { email, callsign } = req.query res.set("Access-Control-Allow-Origin", "*") if (!email) return res.json({ success: false, error: "Please provide an error" }) if (!callsign) return res.json({ success: false, error: "Please provide a callsign" }) if (!validator.isEmail(email)) return res.json({ success: false, error: "Please provide a (valid) email" }) if (callsign.length > 7 || callsign.length < 3) return res.json({ success: false, error: "Please provide a (valid) callsign" }) callsign = callsign.toLowerCase() var a = request('GET', 'https://mail.email.radio/api/v1/get/mailbox/all/email.radio', { headers: { 'Content-Type': "application/json", 'X-API-Key': process.env.MAILCOW_API_KEY, }}).getBody("utf8") var boxes = JSON.parse(a) if (boxes.find(box=>box.local_part == callsign.toLowerCase())) return res.json({ success: false, error: "There is already someone using this callsign. If someone is using your callsign, please email postmaster@email.radio" }) await transporter.sendMail({ from: process.env.SYSTEM_USERNAME, // sender address to: email, // list of receivers subject: "Signup recieved!", // Subject line text: `Thanks for signing up for email.radio! Please note, this service is only for licensed amateur radio operators. You'll get a reply once we have verified that you are a licensed amateur radio operator. (Not you? You can safely ignore this email.) `, // plain text body html: `

Thanks for signing up for email.radio!

Please note, this service is only for licensed amateur radio operators. You'll get a reply once we have verified that you are a licensed amateur radio operator.

(Not you? You can safely ignore this email.)

`, // html body }); await transporter.sendMail({ from: process.env.SYSTEM_USERNAME, // sender address to: process.env.ADMIN_EMAIL, // list of receivers subject: "New application from "+callsign, // Subject line text: `New signup from ${callsign}! ${callsign} has signed up for ${callsign}@email.radio. The normal email is ${email} Follow this link to approve: https://signup.email.radio/approve?email=${encodeURIComponent(email)}&callsign=${encodeURIComponent(callsign)} `, // plain text body html: `

New signup from ${callsign}!

${callsign} has signed up for ${callsign}@email.radio. The normal email is ${email}

Click here to approve this user.`, // html body }); res.json({ success: true }) }); app.get('/approve', async (req, res) => { const { email, callsign } = req.query res.set("Access-Control-Allow-Origin", "*") const password = randomstring.generate(24); if (!email || !callsign) return res.json({ success: false }) await transporter.sendMail({ from: process.env.SYSTEM_USERNAME, // sender address to: email, // list of receivers subject: "Signup approved!", // Subject line text: `Thanks for signing up for email.radio! We approved your application to email.radio! Please login using the following credentials: Email: ${callsign}@email.radio Password: ${password} (On 1st login, you'll be prompted to change your password) IMAP: Host: mail.email.radio Port: 143 SSL: STARTTLS Password: ${password} SMTP: Host: mail.email.radio Port: 587 SSL: STARTTLS Password: ${password} User Dashboard: https://mail.email.radio Online E-Mail Client: https://mail.email.radio/SOGo (Not you? Please email admin@email.radio to have this issue solved!) `, // plain text body html: `

Thanks for signing up for email.radio!

We approved your application to email.radio! Please login using the following credentials:

Email: ${callsign}@email.radio

Password: ${password} (On 1st login, you'll be prompted to change your password)

IMAP:

Username: ${callsign}@email.radio

Host: mail.email.radio

Port: 143

SSL: STARTTLS

Password: ${password}

SMTP:

Username: ${callsign}@email.radio

Host: mail.email.radio

Port: 587

SSL: STARTTLS

Password: ${password}

User Dashboard: https://mail.email.radio

Online E-Mail Client: https://mail.email.radio/SOGo

(Not you? Please email admin@email.radio to have this issue solved!)

`, // html body }); var a = request('POST', 'https://mail.email.radio/api/v1/add/mailbox', { headers: { 'Content-Type': "application/json", 'X-API-Key': process.env.MAILCOW_API_KEY, }, json: { force_pw_update: 1, sogo_access: ["0", "1"], protocol_access: ["0", "imap", "pop3", "smtp", "sieve"], local_part: callsign, domain: "email.radio", name: callsign, password: password, password2: password, tags: "", quota: 1024, quarantine_notification: "hourly", quarantine_category: "reject", acl: [ "spam_alias", "tls_policy", "spam_score", "spam_policy", "delimiter_action", "eas_reset", "pushover", "quarantine", "quarantine_attachments", "quarantine_notification", "quarantine_category", "app_passwds", ], rl_value: "", rl_frame: "s", active: 1, }}); console.log(a.getBody('utf8')) res.send("Approval successful!") }) app.listen(3000, () => { console.log('server started'); });