Skip to content

SnowdogApps/pigeon

master
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Code

Latest commit

 

Git stats

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
 
 
src
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Pigeon

Simple open-source serverless API for sending emails and building forms effortlessly.

Features

  • Simple - Designed to remove the necessity of using Wordpress or another big backend just to have a contact form on the landing page
  • Fast and lightweight - Serverless oriented, no framework, no database or other system-wide requirements
  • Form fields config - You don't have to hardcode your form fields on front-end anymore, get them from API and build UI on the fly.
  • All well-knows SMTP services support - Under the hood, we are using nodemailer and it supports a bunch of well-known SMTP services
  • No Admin Panel - You are not limited by the UI or poor UX, just you and one JS config file
  • Front-end agnostic - Simple REST API can be used by any application

Demo

Demo

Source code

API

POST /

Endpoint used to handle form submits

const form = document.querySelector('#form')
const bodyFormData =  new FormData(form)
axios({
  method: 'post',
  url: '/',
  data: bodyFormData,
  headers: { 'Content-Type': 'multipart/form-data' },
  params: { id: 'myFormId' }
})

GET /

Get configuration of form fields

const { data } = axios.get('/', { params: { id: 'myFormId' } })
console.log(data)
// [
//   {
//     id: 'email',
//     type: 'email',
//     name: 'email',
//     label: 'Email',
//     required: true
//   }
// ]

Config file

Defaults

{
  locale: 'en-US',
  dev: {
    port: 8080
  },
  cors: {
    allowedOrigins: []
  },
  transport: {
    service: SERVICE,
    secure: true,
    auth: {
      user: USER,
      pass: PASS
    }
  },
  forms: {
    default: {
      mail: (params) => ({
        from: 'noreply@test.dev',
        to: 'noreply@test.dev',
        subject: 'Default subject',
        text: Object.keys(params).map(key => `${key}: ${params[key]}\n`).join('')
      }),
      fields: []
    }
  }
}

You can overwrite each part of this config by creating pigeon.config.js.

transport is nodemailer's SMTP transport config object. By default, we are taking ENV variables SERVICE, USER and PASS to hydrate it.

cors is used to set Access-Control-Allow-Origin header acordingly to the settings.

forms object keys are used as IDs in requests params.

For security reasons you shouldn't keep user and password directly in the config file, but for example, keep them as a secret variables if you are using Vercel.

Local testing

To test and expose mailer locally on your machine run yarn dev / npm run dev Development emails are send via ethereal.email service, instead of your desired SMTP transport, to preview sent messages.

About

Simple open-source serverless API for sending emails and building forms effortlessly

Resources

Stars

Watchers

Forks

Packages

No packages published