# Python · Django

Send your first email from a Django view using the Bird Python SDK's sync client. Three steps: install, send, run.

## 1. Install the SDK

```bash
pip install messagebird-sdk django
```

```bash
# or
uv add messagebird-sdk django
poetry add messagebird-sdk django
```

Requires Python 3.10+. The import package is `bird`.

## 2. Send an email

Export your API key. The SDK reads `BIRD_API_KEY` from the environment and infers the region (`us1` or `eu1`) from the `bk_us1_` / `bk_eu1_` prefix, so `Bird()` needs no arguments:

```bash
export BIRD_API_KEY="bk_us1_..."
```

Add a view, e.g. in `myapp/views.py`. Construct one `Bird` at module load and reuse it across requests: it pools connections and is safe to share across threads.

```python
from bird import Bird, APIError
from django.http import JsonResponse

client = Bird()


def send_email(request):
    try:
        message = client.email.send(
            from_="onboarding@messagebird.dev",
            to=["delivered@messagebird.dev"],
            subject="Hello from Bird",
            html="<p>My first Bird email.</p>",
        )
    except APIError as err:
        return JsonResponse({"error": str(err)}, status=502)
    return JsonResponse({"id": message.id, "status": message.status}, status=202)
```

Wire it up in `urls.py`:

```python
from django.urls import path
from myapp.views import send_email

urlpatterns = [path("send/", send_email)]
```

`from_` is the Python spelling of the `from` field (`from` is a reserved word). `onboarding@messagebird.dev` is Bird's shared onboarding sender (no domain verification needed) and `delivered@messagebird.dev` is a [sandbox recipient](/docs/guides/email/testing-sandbox) that always delivers.

Transient failures retry automatically, and a retried send reuses one idempotency key across attempts, so it never double-applies.

## 3. Try it

```bash
python manage.py runserver
curl http://localhost:8000/send/
```

Bird accepts the message with a `202` and delivers it asynchronously; your view returns the `em_` ID and status:

```json
{
  "id": "em_01ky7ma8y2es1s2akzk53tmjn0",
  "status": "accepted"
}
```

Fetch the message by its `em_` ID with `client.email.get(...)` and watch the status move from `accepted` to `delivered`.

## Next steps

- [Python SDK email reference](/docs/sdks/python): every method and option.
- [Send your first email](/docs/get-started/send-your-first-email): the same flow with curl and the full sandbox address list.
- [Sending domains](/docs/guides/email/sending-domains): verify your own domain for production sending.
- [Email API reference](/docs/api/reference/create-email-message): the full request and response schema.