Packages

Compose, deliver and test your emails easily in Elixir. Supports SMTP, Sendgrid, Mandrill, Postmark, Mailgun and many more out of the box. Preview your emails in the browser. Test your email sending code.

Security advisory: This version has known vulnerabilities. View advisories

Current section

Files

Jump to
swoosh lib swoosh api_client finch.ex
Raw

lib/swoosh/api_client/finch.ex

defmodule Swoosh.ApiClient.Finch do
@moduledoc """
Finch-based ApiClient for Swoosh.
config :swoosh, :api_client, Swoosh.ApiClient.Finch
In order to use `Finch` API client, you must start `Finch` and provide a :name.
Often in your supervision tree:
children = [
{Finch, name: Swoosh.Finch}
]
Or, in rare cases, dynamically:
Finch.start_link(name: Swoosh.Finch)
If a name different from `Swoosh.Finch` is used, or you want to use an existing Finch instance,
you can provide the name via the config.
config :swoosh,
api_client: Swoosh.ApiClient.Finch,
finch_name: My.Custom.Name
"""
require Logger
@behaviour Swoosh.ApiClient
@user_agent {"User-Agent", "swoosh/#{Swoosh.version()}"}
@impl true
def init do
unless Code.ensure_loaded?(Finch) do
Logger.error("""
Could not find finch dependency.
Please add :finch to your dependencies:
{:finch, "~> 0.8"}
Or set your own Swoosh.ApiClient:
config :swoosh, :api_client, MyAPIClient
""")
raise "missing finch dependency"
end
_ = Application.ensure_all_started(:finch)
:ok
end
@impl true
def post(url, headers, body, %Swoosh.Email{} = email) do
url = IO.iodata_to_binary(url)
request = Finch.build(:post, url, [@user_agent | headers], body)
options = email.private[:client_options] || []
case Finch.request(request, finch_name(), options) do
{:ok, response} ->
{:ok, response.status, response.headers, response.body}
{:error, reason} ->
{:error, reason}
end
end
defp finch_name do
Application.get_env(:swoosh, :finch_name, Swoosh.Finch)
end
end