# Anhänge

> Hängen Sie Dateien an API-E-Mails als Base64-Inhalt oder über eine URL an, betten Sie Bilder mit Content-ID ein und bleiben Sie innerhalb der erlaubten Dateitypen und Größenlimits.

Diese Seite zeigt, wie Sie Dateien an E-Mails anhängen, die Sie mit `POST /emails` senden, entweder als Base64-kodierten Inhalt oder indem Emailit sie von einer URL herunterlädt. Sie behandelt außerdem eingebettete Bilder, erlaubte Dateitypen und Größenlimits.

## Felder für Anhänge

Übergeben Sie ein Array `attachments`. Jedes Element ist ein Objekt mit diesen Feldern:

- `filename` (string, erforderlich): Dateiname, den der Empfänger sieht. Er muss auf eine [erlaubte Dateiendung](#allowed-file-types) enden.
- `content` (string): Die Datei, Base64-kodiert. Verwenden Sie entweder `content` oder `url`, nicht beides.
- `url` (string): Eine `http://`- oder `https://`-URL, von der Emailit die Datei herunterlädt. Verwenden Sie entweder `content` oder `url`, nicht beides.
- `content_type` (string): Der MIME-Typ, etwa `application/pdf`. Erforderlich mit `content`. Mit `url` ist der Standardwert der `Content-Type`, den der Server zurückgibt.
- `content_id` (string): Eine Content-ID. Ist sie gesetzt, wird der Anhang eingebettet, sodass Ihr HTML ihn mit `cid:` anzeigen kann.
- `encoding` (string): Wie `content` kodiert ist. Lassen Sie den Wert auf `base64`, sofern Sie keinen Grund haben, ihn zu ändern.

## Datei als Base64 anhängen

Lesen Sie die Datei, kodieren Sie sie als Base64 und senden Sie sie mit ihrem MIME-Typ.

**cURL**

```bash
curl https://api.emailit.com/v2/emails \
  -H "Authorization: Bearer $EMAILIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d "{
    \"from\": \"Acme Billing <billing@acme.com>\",
    \"to\": \"ada@example.com\",
    \"subject\": \"Invoice INV-1042\",
    \"text\": \"Your invoice is attached.\",
    \"attachments\": [{
      \"filename\": \"INV-1042.pdf\",
      \"content\": \"$(base64 < INV-1042.pdf | tr -d '\n')\",
      \"content_type\": \"application/pdf\"
    }]
  }"
```

**Node.js**

```javascript
import { readFile } from 'node:fs/promises';
import { Emailit } from '@emailit/node';

const emailit = new Emailit(process.env.EMAILIT_API_KEY);
const pdf = await readFile('INV-1042.pdf');

await emailit.emails.send({
  from: 'Acme Billing <billing@acme.com>',
  to: 'ada@example.com',
  subject: 'Invoice INV-1042',
  text: 'Your invoice is attached.',
  attachments: [
    {
      filename: 'INV-1042.pdf',
      content: pdf.toString('base64'),
      content_type: 'application/pdf',
    },
  ],
});
```

**Python**

```python
import base64
import os
from emailit import EmailitClient

client = EmailitClient(os.environ["EMAILIT_API_KEY"])

with open("INV-1042.pdf", "rb") as f:
    pdf = base64.b64encode(f.read()).decode("ascii")

client.emails.send({
    "from": "Acme Billing <billing@acme.com>",
    "to": "ada@example.com",
    "subject": "Invoice INV-1042",
    "text": "Your invoice is attached.",
    "attachments": [{
        "filename": "INV-1042.pdf",
        "content": pdf,
        "content_type": "application/pdf",
    }],
})
```

**PHP**

```php
$emailit = Emailit::client(getenv('EMAILIT_API_KEY'));

$emailit->emails()->send([
    'from' => 'Acme Billing <billing@acme.com>',
    'to' => 'ada@example.com',
    'subject' => 'Invoice INV-1042',
    'text' => 'Your invoice is attached.',
    'attachments' => [[
        'filename' => 'INV-1042.pdf',
        'content' => base64_encode(file_get_contents('INV-1042.pdf')),
        'content_type' => 'application/pdf',
    ]],
]);
```

## Datei über eine URL anhängen

Statt die Datei selbst zu kodieren, geben Sie Emailit eine `url`. Emailit lädt die Datei herunter, während es die Nachricht erstellt. Die Anfrage dauert also so lange wie der Download.

```json
{
  "from": "Acme Billing <billing@acme.com>",
  "to": "ada@example.com",
  "subject": "Invoice INV-1042",
  "text": "Your invoice is attached.",
  "attachments": [
    {
      "filename": "INV-1042.pdf",
      "url": "https://files.acme.com/invoices/INV-1042.pdf"
    }
  ]
}
```

Die URL muss diese Regeln erfüllen, sonst schlägt die Anfrage mit `422` und `Attachment error` fehl:

- Sie verwendet `http` oder `https` und zeigt auf einen öffentlichen Host. Private und interne Adressen werden abgelehnt.
- Sie liefert die Datei direkt mit einem `2xx`-Status. Weiterleitungen werden nicht verfolgt.
- Der Download ist innerhalb von 30 Sekunden abgeschlossen.
- Die Datei ist nicht größer als 25 MB, laut ihrem Header `Content-Length`.

Emailit erstellt für jeden Empfänger eine eigene Kopie der Nachricht und lädt URL-Anhänge für jede Kopie herunter. Stellen Sie sicher, dass signierte oder ablaufende URLs während der gesamten Anfrage gültig bleiben und dass der Datei-Host einen Download pro Empfänger verkraftet.

## Bilder einbetten

Um ein Bild im HTML-Inhalt statt als separaten Anhang anzuzeigen, geben Sie ihm eine `content_id` und verweisen Sie in einem `img`-Tag mit `cid:` auf diese ID.

```json
{
  "from": "Acme <hello@acme.com>",
  "to": "ada@example.com",
  "subject": "Your weekly report",
  "html": "<p><img src=\"cid:chart-week-40\" alt=\"Weekly signups\" width=\"600\"></p>",
  "attachments": [
    {
      "filename": "chart.png",
      "content": "iVBORw0KGgoAAAANSUhEUgAA...",
      "content_type": "image/png",
      "content_id": "chart-week-40"
    }
  ]
}
```

Die `content_id` im Anhang und der Wert nach `cid:` müssen genau übereinstimmen. Eingebettete Bilder machen die Nachricht für jeden Empfänger größer. Für Logos und andere wiederverwendete Bilder ist eine gehostete Bild-URL im HTML daher meist die bessere Wahl.

## Größenlimits

| Limit | Wert |
| --- | --- |
| Gesamte Nachricht, nach der Kodierung | 40 MB. Größere Nachrichten schlagen mit `413 Message too large` fehl. |
| Ein von `url` heruntergeladener Anhang | 25 MB |
| Download-Timeout für `url` | 30 Sekunden |
| JSON-Anfrage-Body | 50 MB |

Base64-Kodierung macht Dateien etwa ein Drittel größer, und das Limit von 40 MB gilt für die kodierte Nachricht. In der Praxis sollte die Gesamtgröße Ihrer Dateien unter etwa 29 MB bleiben. Laden Sie alles, was größer ist, in Ihren eigenen Speicher hoch und senden Sie einen Link.

## Erlaubte Dateitypen

`filename` muss auf eine dieser Endungen enden. Jede andere Endung oder ein Name ohne Endung schlägt bei der Validierung mit `400` fehl.

| Kategorie | Endungen |
| --- | --- |
| Text | `.txt`, `.csv`, `.log`, `.css`, `.ics`, `.xml` |
| Bilder | `.jpg`, `.jpe`, `.jpeg`, `.gif`, `.png`, `.bmp`, `.psd`, `.tif`, `.tiff`, `.svg`, `.indd`, `.ai`, `.eps` |
| Dokumente | `.doc`, `.docx`, `.rtf`, `.odt`, `.ott`, `.pdf`, `.pub`, `.pages`, `.mobi`, `.epub` |
| Audio | `.mp3`, `.m4a`, `.m4v`, `.wma`, `.ogg`, `.flac`, `.wav`, `.aif`, `.aifc`, `.aiff` |
| Video | `.mp4`, `.mov`, `.avi`, `.mkv`, `.mpeg`, `.mpg`, `.wmv` |
| Tabellen | `.xls`, `.xlsx`, `.ods`, `.numbers` |
| Präsentationen | `.odp`, `.ppt`, `.pptx`, `.pps`, `.key` |
| Archive und Kontakte | `.zip`, `.vcf` |
| E-Mail | `.eml` |
| Signaturen und Verschlüsselung | `.p7c`, `.p7m`, `.p7s`, `.pgp`, `.asc`, `.sig` |

Ausführbare Dateien und Skripte stehen nicht auf der Liste und lassen sich nicht anhängen.

## Anhänge einer gesendeten E-Mail lesen

[Anhänge auflisten](/de/docs/api-reference/emails/attachments/) (`GET /emails/{id}/attachments`) gibt jeden Anhang mit `filename`, `content_type`, `size`, `content_id`, `content_disposition` (`attachment` oder `inline`) und dem Base64-kodierten `content` zurück. Dafür ist ein Schlüssel mit **Full Access** nötig. Anhänge werden zusammen mit den Nachrichteninhalten gelöscht, wenn Ihre [Aufbewahrungsdauer](/de/docs/data-retention/) endet.

## Fehlerbehebung

| Fehler | Was Sie prüfen sollten |
| --- | --- |
| `Attachment at index 0 missing content_type (required when using 'content')` | Fügen Sie jedem Base64-Anhang `content_type` hinzu. |
| `Attachment 'report.exe' has unsupported file type '.exe'` | Verwenden Sie eine erlaubte Endung oder packen Sie die Datei in eine `.zip`. |
| `Attachment at index 0 cannot have both 'content' and 'url'` | Senden Sie nur eines der beiden Felder. |
| `Attachment error` mit `Failed to fetch attachment` | Die URL hat einen Fehlerstatus geliefert, weitergeleitet, ein Timeout erreicht oder ist nicht öffentlich. Öffnen Sie sie zur Prüfung von einem Server außerhalb Ihres Netzwerks. |
| `Attachment error` mit `Attachment too large (max 25MB)` | Hosten Sie die Datei und senden Sie stattdessen einen Link. |
| `413 Message too large` | Verringern Sie die Gesamtgröße der Anhänge. |

## Siehe auch

- [E-Mail senden](/de/docs/email-api/send-email/)
- [E-Mail senden](/de/docs/api-reference/emails/send/) in der API-Referenz
- [Datenaufbewahrung](/de/docs/data-retention/)

---
Quelle: https://emailit.com/de/docs/email-api/attachments/
