# Plánování a rušení e-mailů

> Odešlete e-mail později pomocí scheduled_at, změňte čas odeslání, nebo zrušte naplánovaný, přijatý či znovu doručovaný e-mail přes API nebo ve webovém rozhraní.

Tato stránka vysvětluje, jak přes e-mailové API naplánovat e-mail na později, jak ho přesunout na jiný čas a jak e-mail zrušit, než odejde. Zrušení funguje i u e-mailů, které naplánované nebyly, pokud ještě nebyly doručeny.

## Naplánujte e-mail

Přidejte `scheduled_at` do [požadavku na odeslání](/cs/docs/email-api/send-email/). Odpověď obsahuje `"status": "scheduled"` a normalizovaný čas v `scheduled_at` a e-mail každého příjemce vyvolá místo `email.accepted` událost [`email.scheduled`](/cs/docs/webhooks/events/email/scheduled/).

`scheduled_at` přijímá tyto formáty:

| Formát | Příklad | Poznámky |
| --- | --- | --- |
| ISO 8601 s časovým pásmem | `2026-10-05T09:00:00Z`, `2026-10-05T09:00:00+02:00` | Doporučeno. Vždy uveďte `Z` nebo posun. |
| Přirozený jazyk (anglicky) | `tomorrow at 9am`, `in 2 hours`, `next monday 10:00`, `friday 5pm` | Interpretuje se v UTC, takže `tomorrow at 9am` znamená 9:00 UTC. |

Čas, který je teď nebo v minulosti, odešle e-mail okamžitě se stavem `accepted`.

> **Zkontrolujte stav v odpovědi:** Pokud Emailit hodnotu `scheduled_at` nedokáže přečíst, požadavek neodmítne: e-mail se odešle hned. Zkontrolujte, že odpověď obsahuje `"status": "scheduled"` a očekávané `scheduled_at`. Unixová časová razítka se nerozpoznávají; nejdřív je převeďte na ISO 8601.

**cURL**

```bash
curl https://api.emailit.com/v2/emails \
  -H "Authorization: Bearer $EMAILIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "from": "Acme <reminders@acme.com>",
    "to": "ada@example.com",
    "subject": "Your appointment is tomorrow",
    "text": "See you at 14:00.",
    "scheduled_at": "2026-10-05T09:00:00Z"
  }'
```

**Node.js**

```javascript
const email = await emailit.emails.send({
  from: 'Acme <reminders@acme.com>',
  to: 'ada@example.com',
  subject: 'Your appointment is tomorrow',
  text: 'See you at 14:00.',
  scheduled_at: '2026-10-05T09:00:00Z',
});
```

**Python**

```python
email = client.emails.send({
    "from": "Acme <reminders@acme.com>",
    "to": "ada@example.com",
    "subject": "Your appointment is tomorrow",
    "text": "See you at 14:00.",
    "scheduled_at": "2026-10-05T09:00:00Z",
})
```

**PHP**

```php
$email = $emailit->emails()->send([
    'from' => 'Acme <reminders@acme.com>',
    'to' => 'ada@example.com',
    'subject' => 'Your appointment is tomorrow',
    'text' => 'See you at 14:00.',
    'scheduled_at' => '2026-10-05T09:00:00Z',
]);
```

Emailit naplánovaný e-mail připraví už při požadavku, ne v čase odeslání. Šablona se vykreslí, přílohy z URL se stáhnou a kredity se strhnou předem. Pokud chcete změnit obsah, e-mail zrušte a odešlete nový.

## Změňte čas odeslání

Použijte [Úpravu naplánovaného e-mailu](/cs/docs/api-reference/emails/update/) (`POST /emails/{id}`) s novým `scheduled_at`. Přijímají se stejné formáty.

- E-mail musí být ve stavu `scheduled`.
- Do jeho aktuálního času odeslání musí zbývat víc než 3 minuty.
- Nový čas odeslání musí být víc než 3 minuty v budoucnosti.

**cURL**

```bash
curl https://api.emailit.com/v2/emails/em_33VtK8mRq1xZp7LwN4cY2bHsDfa \
  -H "Authorization: Bearer $EMAILIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "scheduled_at": "2026-10-05T15:00:00Z" }'
```

**Node.js**

```javascript
await emailit.emails.update('em_33VtK8mRq1xZp7LwN4cY2bHsDfa', {
  scheduled_at: '2026-10-05T15:00:00Z',
});
```

**Python**

```python
client.emails.update("em_33VtK8mRq1xZp7LwN4cY2bHsDfa", {
    "scheduled_at": "2026-10-05T15:00:00Z",
})
```

**PHP**

```php
$emailit->emails()->update('em_33VtK8mRq1xZp7LwN4cY2bHsDfa', [
    'scheduled_at' => '2026-10-05T15:00:00Z',
]);
```

```json
{
  "object": "email",
  "id": "em_33VtK8mRq1xZp7LwN4cY2bHsDfa",
  "status": "scheduled",
  "scheduled_at": "2026-10-05T15:00:00.000Z",
  "updated_at": "2026-10-01T10:02:44.193027Z",
  "message": "Email schedule has been updated successfully"
}
```

Na rozdíl od nového odeslání se tady nečitelný čas odmítne s `422 Invalid scheduled_at`. Požadavek, který porušuje pravidlo 3 minut nebo míří na e-mail, který není naplánovaný, selže s `422 Cannot update email`. Požadavek s několika příjemci vytvoří jeden e-mail pro každého příjemce, takže přeplánujte každé ID `em_` z mapy `ids`. Přeplánování ve webovém rozhraní dostupné není.

## Zrušte e-mail

Odchozí e-mail můžete zrušit, dokud je v jednom z těchto stavů:

| Stav | Lze zrušit? | Poznámky |
| --- | --- | --- |
| `scheduled` | Ano | Jen dokud do času odeslání zbývá víc než 3 minuty. |
| `accepted` | Ano, bez záruky | E-mail čeká v odesílací frontě, nebo ji právě opouští. |
| `attempted` | Ano, bez záruky | Pokus o doručení dočasně selhal. Zrušení zastaví zbývající opakování. |
| Jakýkoli jiný stav | Ne | E-maily, které byly doručeny, nedoručeny, selhaly, byly odmítnuty, zablokovány, zadrženy nebo už zrušeny, zrušit nelze. |

**Webové rozhraní**

  1. Otevřete **Email API → Emails**.
  2. V řádku e-mailu vyberte **Cancel delivery**, nebo e-mail otevřete a nahoře na stránce vyberte **Cancel delivery**.
  3. Potvrďte. Pokud už pokus o doručení začal, webové rozhraní vás upozorní, že se pokus ještě může dokončit a že zbývající opakování byla zastavena.

**API**

  Zavolejte [Zrušení e-mailu](/cs/docs/api-reference/emails/cancel/) (`POST /emails/{id}/cancel`). Funguje s klíči s oprávněním **Full Access** i **Sending Only**.

```bash
curl -X POST https://api.emailit.com/v2/emails/em_33VtK8mRq1xZp7LwN4cY2bHsDfa/cancel \
  -H "Authorization: Bearer $EMAILIT_API_KEY"
```

```json
{
  "object": "email",
  "id": "em_33VtK8mRq1xZp7LwN4cY2bHsDfa",
  "status": "canceled",
  "in_flight": false,
  "message": "Email has been canceled and removed from the send queue."
}
```

Když je `in_flight` `true`, e-mail byl zrušen, ale pokus o doručení už možná probíhá, a zpráva zní „The current delivery attempt may still complete; remaining retries were stopped.“ Stav, který nelze zrušit, nebo naplánovaný e-mail, kterému do času odeslání zbývají méně než 3 minuty, vrátí `422 Cannot cancel email`.

Zrušení nevrací kredity účtované při odeslání e-mailu přes API.

### Jak zrušení funguje

Zrušení vyjme e-mail z odesílací fronty. Nejde o stažení zprávy ze schránky příjemce.

1. Emailit zkontroluje, že e-mail lze ještě zrušit.
2. Nastaví stav na `canceled`, přidá do historie doručení e-mailu záznam „Canceled“ a odebere e-mail z odesílací fronty.
3. Pokud už e-mail převzal doručovací proces, zkontroluje stav znovu těsně před předáním zprávy serveru příjemce, a když uvidí `canceled`, e-mail přeskočí.
4. Emailit vyvolá `email.canceled` s `previous_status`.

Pokud už zpráva byla na cestě k serveru příjemce, tento pokus ještě může uspět. Emailit ponechá stav `canceled`, i když se souběžný pokus doručí nebo se nedoručí, ale příjemce zprávu přesto může dostat. Berte zrušení jako „zastavit, než to odejde“, ne jako „vzít odeslání zpět“.

## Stavy a události

| Okamžik | Stav | Událost webhooku |
| --- | --- | --- |
| Požadavek s `scheduled_at` v budoucnosti | `scheduled` | [`email.scheduled`](/cs/docs/webhooks/events/email/scheduled/) |
| Nastane čas odeslání | `delivered`, `attempted`, `bounced` atd. | Odpovídající událost doručení, například [`email.delivered`](/cs/docs/webhooks/events/email/delivered/) |
| Zrušeno | `canceled` | `email.canceled` se `status` a `previous_status` |

Naplánovaný e-mail nevyvolá `email.accepted`, když nastane jeho čas odeslání. Úplný seznam najdete na stránce [Stavy e-mailů](/cs/docs/logs/email-statuses/).

## Související

- [Úprava naplánovaného e-mailu](/cs/docs/api-reference/emails/update/)
- [Zrušení e-mailu](/cs/docs/api-reference/emails/cancel/)
- [Odeslání e-mailu](/cs/docs/email-api/send-email/)
- [Stavy e-mailů](/cs/docs/logs/email-statuses/)
- [Proč e-mail zůstal ve stavu Accepted nebo Scheduled?](/cs/docs/kb/email-stuck-in-scheduled-or-accepted/)

---
Zdroj: https://emailit.com/cs/docs/email-api/scheduling/
