README.md

# Elixir MailSlurp Library
Official Elixir library for MailSlurp. Create email accounts then send and receive email from Elixir, Erlang, Phoenix and more.

## Quick links

- [Hex Package](https://hex.pm/packages/mailslurp)
- [Hex Docs](https://hexdocs.pm/mailslurp/)
- [GitHub Source](https://github.com/mailslurp/mailslurp-client-elixir)
- [Documentation](https://www.mailslurp.com/docs/elixir/)

## Install
There are multiple ways to install MailSlurp. 

> **Note:** replace the version shown with the [latest version on hex.pm](https://hex.pm/packages/mailslurp).

### Mix.exs

```elixir
{:mailslurp, "~> 11.6"}
```

### Rebar.config

```text
{mailslurp, "11.6.0"}
```

### Erlang.mk

```text
dep_mailslurp = hex 11.6.0
```

### Recommended extras
MailSlurp uses Tesla client and httpc by default. Hackney is recommended as it handles some MailSlurp POST methods with empty bodies. 

```elixir
defp deps do
[
  {:hackney, "~> 1.17.4"},
  {:mailslurp, "~> 11.6.1"}
]
end
```

## Configure client

### Get API KEY
Create a [MailSlurp account](https://app.mailslurp.com/login/) to obtain a free API KEY.

![find api key](https://www.mailslurp.com/assets/guides/find-api-key.png)

### Configure Tesla
The MailSlurp REST API is split into controllers. Each method accepts a Tesla client as the first parameter.
```elixir
# create a tesla client for MailSlurp controllers
middleware = [
  # set x-api-key header with MailSlurp API Key
  {Tesla.Middleware.Headers, [{"x-api-key", "your-mailslurp-api-key-here"}]},
  {Tesla.Middleware.BaseUrl, "https://api.mailslurp.com"},
  {Tesla.Middleware.EncodeJson, engine: Poison}
]
# use hackney adapter instead of httpc
adapter = {Tesla.Adapter.Hackney, [recv_timeout: 30_000]}
# create a connection
connection = Tesla.client(middleware, adapter)
```

### Use controllers
Controller method return values can be matched against `:ok, T` or `:error, :info`.

```elixir
# handle ok result and response
{ :ok, inbox } = MailSlurpAPI.Api.InboxController.create_inbox(connection)
# handle error
{ :error, info } = MailSlurpAPI.Api.InboxController.create_inbox(connection)
```

## Examples
Here are some common use cases. See the [documentation](https://www.mailslurp.com/docs/elixir/) or [examples](https://www.mailslurp.com/tags/elixir/) pages for more information.

### Create inbox
Inboxes have an `emailAddress` and `id`.

```elixir
# create test email address
{ :ok, inbox } = MailSlurpAPI.Api.InboxController.create_inbox(connection)
assert inbox.emailAddress =~ "@mailslurp."
```

### Receive email
```elixir
{:ok, email} = MailSlurpAPI.Api.WaitForController.wait_for_latest_email(connection, [
    :inboxId = inbox.id,
    :timeout = 30_000,
    :unreadOnly = true
])
```

### Send email
```elixir
MailSlurpAPI.Api.InboxController.send_email(connection, inbox.id, [
    to: [inbox.emailAddress],
    subject: "test",
    body: "Hello"
])
```