docs: add README and register it in Cargo.toml
This commit is contained in:
@@ -6,6 +6,7 @@ authors = ["Antfroze"]
|
|||||||
description = "Async Rust client for the Plunk transactional email API"
|
description = "Async Rust client for the Plunk transactional email API"
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
repository = "https://git.coldspire.com/Antfroze/plunk-rs"
|
repository = "https://git.coldspire.com/Antfroze/plunk-rs"
|
||||||
|
readme = "README.md"
|
||||||
keywords = ["plunk", "email", "transactional", "api"]
|
keywords = ["plunk", "email", "transactional", "api"]
|
||||||
categories = ["api-bindings", "email"]
|
categories = ["api-bindings", "email"]
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,121 @@
|
|||||||
|
<div align="center">
|
||||||
|
|
||||||
|
# plunk-rs
|
||||||
|
|
||||||
|
**An async Rust client for [Plunk](https://www.useplunk.com/) transactional email.**
|
||||||
|
|
||||||
|
*Send HTML, templates, and template variables (the `data` object) with validation, typed errors, and a small dependency footprint (reqwest + rustls).*
|
||||||
|
|
||||||
|
[](./LICENSE)
|
||||||
|
[](https://crates.io/crates/plunk-rs)
|
||||||
|
[](https://docs.rs/plunk-rs)
|
||||||
|
|
||||||
|
[Repository](https://git.coldspire.com/Antfroze/plunk-rs) · [Plunk API](https://docs.useplunk.com)
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Why this crate
|
||||||
|
|
||||||
|
| | |
|
||||||
|
| :--- | :--- |
|
||||||
|
| **Focused** | Covers `POST /v1/send`—HTML and template sends, with optional `from`, `reply`, headers, and `data` for template variables. |
|
||||||
|
| **Validates early** | `Email` and `EmailAddress` are built with checks so bad requests fail before the wire. |
|
||||||
|
| **Clean boundary** | Wire DTOs stay internal; your code uses `Email`, `SendResponse`, and `Error`. |
|
||||||
|
| **TLS** | [reqwest](https://crates.io/crates/reqwest) with **rustls**—no OpenSSL at build time. |
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
Add to `Cargo.toml`:
|
||||||
|
|
||||||
|
```toml
|
||||||
|
[dependencies]
|
||||||
|
plunk-rs = "0.1"
|
||||||
|
tokio = { version = "1", features = ["rt-multi-thread", "macros"] }
|
||||||
|
```
|
||||||
|
|
||||||
|
Or:
|
||||||
|
|
||||||
|
```text
|
||||||
|
cargo add plunk-rs
|
||||||
|
cargo add tokio --features rt-multi-thread,macros
|
||||||
|
```
|
||||||
|
|
||||||
|
## Quick start
|
||||||
|
|
||||||
|
```rust
|
||||||
|
use plunk_rs::{Client, Email, EmailAddress};
|
||||||
|
|
||||||
|
#[tokio::main]
|
||||||
|
async fn main() -> Result<(), plunk_rs::Error> {
|
||||||
|
let client = Client::new("sk_your_plunk_api_key")?;
|
||||||
|
|
||||||
|
let email = Email::html("user@example.com", "Welcome", "<h1>Hello</h1>")?
|
||||||
|
.from(EmailAddress::named("My app", "hello@yourdomain.com")?)?
|
||||||
|
.reply_to("support@yourdomain.com")?;
|
||||||
|
|
||||||
|
let response = client.send(&email).await?;
|
||||||
|
|
||||||
|
for delivery in response.deliveries() {
|
||||||
|
println!("{} → {}", delivery.contact().email(), delivery.id());
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Template send** (with data for the template):
|
||||||
|
|
||||||
|
```rust
|
||||||
|
use plunk_rs::{Client, Email};
|
||||||
|
use serde_json::json;
|
||||||
|
|
||||||
|
#[tokio::main]
|
||||||
|
async fn main() -> Result<(), plunk_rs::Error> {
|
||||||
|
let client = Client::new("sk_your_plunk_api_key")?;
|
||||||
|
|
||||||
|
let email = Email::template("user@example.com", "tpl_xxxxxxxx")?
|
||||||
|
.with_data(json!({ "first_name": "Ada" }))?;
|
||||||
|
|
||||||
|
client.send(&email).await?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Self-hosted or custom base URL
|
||||||
|
|
||||||
|
```rust
|
||||||
|
let client = Client::builder("sk_xxx")
|
||||||
|
.base_url("https://plunk.example.com/api")?
|
||||||
|
.build()?;
|
||||||
|
```
|
||||||
|
|
||||||
|
`base_url` is normalized: if the path does not end with `/`, one is added so `v1/send` joins correctly.
|
||||||
|
|
||||||
|
## API surface
|
||||||
|
|
||||||
|
- **`Client` / `ClientBuilder`** — Bearer API key, optional `reqwest::Client` injection.
|
||||||
|
- **`Email`**, **`EmailAddress`**, **`Recipients`** — Construction helpers for HTML vs template, headers, and JSON `data` (must serialize to a JSON object for templates).
|
||||||
|
- **`SendResponse`**, **`Delivery`**, **`Contact`** — Parsed success payload from the send response.
|
||||||
|
- **`Error`**, **`ApiError`**, **`Result<T>`** — Transport, validation, and Plunk error bodies (with status and raw body preserved).
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
Rust **2024** edition (use a current stable toolchain that supports it). Async code assumes a runtime such as **Tokio**.
|
||||||
|
|
||||||
|
## Docs
|
||||||
|
|
||||||
|
- [**docs.rs** — plunk-rs](https://docs.rs/plunk-rs)
|
||||||
|
- [Plunk documentation](https://docs.useplunk.com)
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
[MIT](LICENSE)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
|
||||||
|
Made for sending mail through [Plunk](https://www.useplunk.com/) without the ceremony.
|
||||||
|
|
||||||
|
</div>
|
||||||
Reference in New Issue
Block a user