Skip to content

An elixir SMTP server that makes message inspection easier

License

Notifications You must be signed in to change notification settings

maxneuvians/pique

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Pique

This project is an elixir wrapper around the excellent gen_smtp server that makes SMTP inspection easier through the registration of handlers.

Rational or Why do I need this?

The internet is awesome - sending emails is ok. Email is made more awesome by services like Amazon SES and Mailgun that allow you to send emails using APIs - especially if you allow you customers to send email on your behalf through your own API. It gives you an opportunity to scan those emails before they go out for content that should not be in there (ex. personal identifiable information).

However, some customers only use SMTP and can not use your awesome API, what then? How do you have the same level of introspection into the emails that are sent through SMTP as through your API? Simple, build your own SMTP server that then pipes the message to that API.

This package uses the server provided by gen_smtp, and allows you to register handlers with various SMTP actions, so that you don't have to deal with all the SMTP stuff, but can focus on what matters.

Usage

Using your Mix.Config files you can specify a number of handlers and a sender whose behaviour is defined in lib/behaviours/handler.ex and lib/behaviours/sender.ex respectively. There exist default handlers that just pass through the data and a default sender that logs the SMTP message to the console. Best to use an example:

If I wanted to block all SMTP messages being sent from a specific email address before they get sent I might write a handler like this:

defmodule MyApp.MailHander do
  @behaviour Pique.Behaviours.Handler

  def handle("nefarious.fellow@canada.org"), do: {:error, "Go away nefarious fellow"}
  def handle(email), do: {:ok, email}

end

and register that handler using my config:

config :pique,
  mail_handler: MyApp.MailHander

Similary if I actually wanted to send my email through AWS SES I could create a new sender:

defmodule MyApp.SESSender do
  @behaviour Pique.Behaviours.Sender
  alias ExAws.{SES}

  def send(state) do
    SES.send_raw_email(state[:data])
    |> ExAws.request
    {:ok, state[:data], state}
  end

end

and register that handler using my config:

config :pique,
  sender: MyApp.SESSender

I have thereby created some amorphous monster of SMTP->SES with custom logic.

Below is a table of each available handler and what it does:

Type Config Name Default Description
Auth auth_handler lib/handlers/auth.ex Handles any authentication requests
Data data_handler lib/handlers/data.ex Handles the body of the email to be sent
Mail mail_handler lib/handlers/mail.ex Handles the from address
Rcpt rcpt_handler lib/handlers/rcpt.ex Handles any recipients of the email, including bcc
Send sender lib/senders/logger.ex Handles the sending of the message, by default logs instead of sending it

Installation

The package can be installed by adding pique to your list of dependencies in mix.exs:

def deps do
  [
    {:pique, "~> 0.1.0"}
  ]
end

Documentation

Documentation can be found at https://hexdocs.pm/pique.

License

MIT

About

An elixir SMTP server that makes message inspection easier

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages