DisposableGuard

Phoenix (Elixir)

defmodule DisposableGuard.Plug do
  import Plug.Conn

  def init(opts), do: opts

  def call(conn, _opts) do
    email = conn.params["email"] || conn.body_params["email"]

    if email && disposable?(email) do
      conn
      |> put_resp_content_type("application/json")
      |> send_resp(400, Jason.encode!(%{error: "Please use a real email address."}))
      |> halt()
    else
      conn
    end
  end

  defp disposable?(email) do
    api_key = System.get_env("DG_KEY")
    url = "https://api.disposableguard.com/v1/check?email=#{URI.encode(email)}"

    try do
      case HTTPoison.get(url, [{"Authorization", "Bearer #{api_key}"}]) do
        {:ok, %HTTPoison.Response{status_code: 200, body: body}} ->
          Jason.decode!(body)["is_disposable"] == true
        _ -> false
      end
    rescue
      _ -> false # fail-open
    end
  end
end

Notes

Add to your router: `plug DisposableGuard.Plug`. Requires `httpoison` and `jason` packages.