# Sendr
[](https://hex.pm/packages/sendr)
[](https://hexdocs.pm/sendr/)
A Gleam email library to unify sending emails.
## Installation
```sh
gleam add sendr
```
## Usage
```gleam
import sendr
import sendr/message
import sendr/message/mailbox
import sendr/message/attachment
import sendr/backend
// Build a message
let msg =
message.new()
|> message.set_from(mailbox.new("Sender", "sender@example.com"))
|> message.set_to([mailbox.new("Recipient", "recipient@example.com")])
|> message.set_subject("Hello")
|> message.set_body_text("Hello, World!")
// Send the message
let assert Ok(req) = backend.request(msg, backend.config())
// Make the HTTP request with your HTTP client of choice:
// let resp = http_client.send(req)
// let result = backend.response(resp)
```
## Backends
Sendr uses a backend architecture so you can use different mail providers. Available backends:
- [sendr_lettermint](https://tangled.org/wommm.nl/sendr_lettermint) - Send emails using [lettermint](https://lettermint.co).
- [sendr_scaleway](https://tangled.org/wommm.nl/sendr_scaleway) - Send emails using [Scaleway](https://www.scaleway.com).
- [sendr_sweego](https://tangled.org/wommm.nl/sendr_sweego) - Send emails using [sweego](https://www.sweego.io).
- [sendr_smtp](https://tangled.org/wommm.nl/sendr_smtp) - Send emails via SMTP.
### Creating your own backend
A backend is expected to have a `request`-function which takes a `sendr/message.Message` and transforms this to a `http.Request`, which can be passed to the backend using any HTTP-client.
In addition the backend should provide a `response`-function which takes in the returned `http.Response` and transforms it to a `Result(String, SendrError(backend_error))` for further processing.
For examples look at the backends listed above.
## Concepts
### Message
A message contains all the standard email fields:
- `from` - The sender
- `reply_to` - Where replies should be sent
- `to` - Primary recipients
- `cc` - Carbon copy recipients
- `bcc` - Blind carbon copy recipients
- `subject` - The email subject line
- `body` - The message body (plain text and/or HTML)
- `attachments` - Files to attach
### Mailbox
A mailbox represents a recipient with a display name and email address. Both are trimmed of whitespace.
### Attachment
Attachments can be created from files or raw data. The content type is automatically detected from the filename extension.
## Development
```sh
gleam test # Run the tests
gleam run -m devutils/glinter -- --stats # Run the code style checks
```