README.md

# Bamboo.GmailAdapter

Gmail adapter for [Bamboo](https://github.com/thoughtbot/bamboo)

*Why not just use SMTP?*

Starting in 2020, [Google is deprecating the use of its Gmail API with SMTP usage](https://gsuiteupdates.googleblog.com/2019/12/less-secure-apps-oauth-google-username-password-incorrect.html).
This adapter allows GSuite account holders to use Bamboo in light of this deprecation by using OAuth2 for authentication.

---

## Preconditions

There are a few preconditions that must be met before this adapter can be used to send email:
1. Admin access to a GSuite account
2. Implement [server-side authorization](https://developers.google.com/gmail/api/auth/web-server)
3. Grant the service account domain-wide authority
4. Authorize API client with required scopes

---

## Installation

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

```elixir
def deps do
  [
    {:bamboo_gmail, "~> 0.1.0"}
  ]
end
```

Some application settings must be configured. See the [example section](#example-config) below.

---

## Configuration

  | Setting | Description | Required? |
  | ---------- | ---------- | ---------- |
  | `adapter` | Bamboo adapter in use (`Bamboo.GmailAdapter`). | Yes |
  | `sub` | Email address the service account is impersonating (address the email is sent from).  If impersonation is not needed, then `nil` (it is likely needed). | Yes |
  |`sandbox` | Development mode that does not send email.  Details of the API call are instead output to the elixir console. | No |
  | `json` | Google auth crendentials must be provided in JSON format to the `:goth` app.  These are generated in the [Google Developers Console](https://console.developers.google.com/). | Yes |


---

#### Note: 

*Secrets such as the service account sub, and the auth credentials should not
be commited to version control.*

Instead, pass in via environment variables using a tuple: 
```elixir
{:system, "SUB_ADDRESS"}
```

Or read in from a file: 
```elixir
"creds.json" |> File.read!
```

---

#### Example Config

```elixir
config :app_name, GmailAdapterTestWeb.Mailer,
  adapter: Bamboo.GmailAdapter,
  sub: {:system, "SUB_ADDRESS"},
  sandbox: false

# Google auth credentials must be provided to the `goth` app
config :goth, json: {:system, "GCP_CREDENTIALS"}
```

---

## Documentation

Docs can be found at [https://hexdocs.pm/bamboo_gmail](https://hexdocs.pm/bamboo_gmail).

---

## Contribute

Contribution Guidelines can be found [here](https://github.com/parkerduckworth/bamboo_gmail/blob/master/CONTRIBUTING.md).
Please feel free to use, share, and extend this project. PR's welcome.