# Migration from raw Swoosh
This guide is now a subordinate raw-Swoosh migration reference.
The canonical latest-`0.x` to `1.0` path lives in
[`upgrading-to-v1_0.md`](upgrading-to-v1_0.md). Use that guide for the full
compatibility-lane inventory, support matrix, and strict-CI posture. Use this
page when you specifically need the incremental "keep raw `%Swoosh.Email{}` for
parity while adopting mailglass" slice.
This guide helps you move from a raw Swoosh setup to mailglass while preserving your adapter credentials and your ability to deliver plain `%Swoosh.Email{}` values through the mailglass pipeline.
## Prerequisites
- An existing Phoenix app using Swoosh directly
- Your Swoosh adapter config
- Ecto and PostgreSQL configured for the host app
## 1) Install mailglass and keep Swoosh as transport
Add mailglass to your dependencies:
```elixir
def deps do
[
{:mailglass, "~> 0.3"},
{:mailglass_admin, "~> 0.3", only: [:dev]}
]
end
```
Then fetch deps, run the installer, and migrate:
```bash
mix deps.get
mix mailglass.install
mix ecto.migrate
```
## 2) Move adapter configuration under `:mailglass`
Keep your existing Swoosh adapter, but configure it through `Mailglass.Adapters.Swoosh`:
```elixir
# config/runtime.exs
config :mailglass,
repo: MyApp.Repo,
adapter:
{Mailglass.Adapters.Swoosh,
swoosh_adapter: {Swoosh.Adapters.Postmark, api_key: System.fetch_env!("POSTMARK_API_KEY")}}
```
## 3) Replace raw mailer modules with mailables
Instead of `use Swoosh.Mailer`, define mailable modules:
```elixir
defmodule MyApp.UserMailer do
use Mailglass.Mailable, stream: :transactional
def welcome(user) do
new()
|> to(user.email)
|> from({"MyApp", "support@example.com"})
|> subject("Welcome")
|> html_body("<h1>Welcome</h1>")
|> text_body("Welcome")
|> Mailglass.Message.put_function(:welcome)
end
end
```
## 4) Deliver through mailglass
Pipe mailable results into `Mailglass.deliver/1`:
```elixir
MyApp.UserMailer.welcome(%{email: "migrated@example.com"})
|> Mailglass.deliver()
```
Mailglass still accepts a plain `%Swoosh.Email{}` when you need parity during an incremental migration.
That raw-email path is a retained compatibility bridge, not the preferred
`1.x` authoring lane. For the canonical support horizon and replacement story,
defer to [`upgrading-to-v1_0.md`](upgrading-to-v1_0.md) and
[`compatibility-and-deprecations.md`](compatibility-and-deprecations.md).
## End-to-End Example
```elixir
email =
Swoosh.Email.new()
|> Swoosh.Email.to("migrated@example.com")
|> Swoosh.Email.from("system@example.com")
|> Swoosh.Email.subject("Migration test")
assert {:ok, _delivery} = Mailglass.deliver(email)
```