# E-Mail Setup Optionen für uLoad
## Übersicht
Dieser Bericht analysiert verschiedene Möglichkeiten zur E-Mail-Integration in der uLoad-Anwendung, von kostenlosen bis zu selbst-gehosteten Lösungen.
---
## 1. Aktuelle Situation
### PocketBase E-Mail System
- **Status**: Integriert, aber nicht konfiguriert
- **Verwendung**: Password Reset, E-Mail-Verifikation, Benachrichtigungen
- **Konfiguration**: Über PocketBase Admin Panel → Settings → Mail settings
### Benötigte E-Mail-Typen
1. **Transaktionale E-Mails** (kritisch)
- Password Reset
- E-Mail-Verifikation
- Account-Benachrichtigungen
2. **Marketing E-Mails** (optional)
- Newsletter
- Feature-Ankündigungen
- Nutzer-Engagement
---
## 2. E-Mail Service Provider Optionen
### A. Kostenlose/Günstige Services
#### **Resend** ⭐ Empfohlen für Start
- **Kosten**: 100 E-Mails/Tag kostenlos, dann $20/Monat für 5.000
- **Vorteile**:
- Moderne API
- Excellent für Entwickler
- React Email Templates
- Gute Deliverability
- **Integration**:
```javascript
// Beispiel: Resend mit SvelteKit
import { Resend } from 'resend';
const resend = new Resend('re_YOUR_API_KEY');
await resend.emails.send({
from: 'noreply@yourdomain.com',
to: user.email,
subject: 'Password Reset',
html: '
Click here to reset...
'
});
```
#### **Brevo (ehem. Sendinblue)**
- **Kosten**: 300 E-Mails/Tag kostenlos
- **Vorteile**:
- SMTP + API
- Marketing-Tools inklusive
- EU-Server (DSGVO)
- **SMTP-Einstellungen**:
```
Host: smtp-relay.brevo.com
Port: 587
Username: Ihre E-Mail
Password: API-Key
```
#### **SendGrid**
- **Kosten**: 100 E-Mails/Tag kostenlos
- **Vorteile**:
- Zuverlässig
- Gute Analytics
- Twilio-Integration
- **Nachteile**: Setup etwas komplexer
#### **Mailgun**
- **Kosten**: 5.000 E-Mails/Monat für 3 Monate kostenlos
- **Vorteile**:
- Entwicklerfreundlich
- Gute API
- E-Mail-Validierung
### B. Premium Services
#### **Amazon SES**
- **Kosten**: $0.10 pro 1.000 E-Mails
- **Vorteile**:
- Extrem günstig bei Volumen
- AWS-Integration
- Hohe Deliverability
- **Nachteile**: Komplexeres Setup
#### **Postmark**
- **Kosten**: Ab $15/Monat für 10.000 E-Mails
- **Vorteile**:
- Beste Deliverability
- Trennung Transaktional/Marketing
- Exzellenter Support
---
## 3. Selbst-Hosting Optionen
### A. Eigener SMTP Server
#### **Postal** ⭐ Empfohlen für Self-Hosting
- **Type**: Open Source Mail Server
- **Features**:
- Web-UI
- API
- Multi-Domain
- Tracking
- **Installation**:
```bash
# Docker Installation
git clone https://github.com/postalserver/postal
cd postal
docker-compose up -d
```
#### **Mail-in-a-Box**
- **Type**: Komplette E-Mail-Lösung
- **Features**:
- SMTP, IMAP, Webmail
- Automatisches SSL
- DNS-Management
- **Voraussetzungen**:
- Dedizierter Server
- Saubere IP (nicht blacklisted)
#### **Mailcow**
- **Type**: Docker-basierte Lösung
- **Features**:
- Modern UI
- Anti-Spam
- Webmail (SOGo)
- **Installation**:
```bash
git clone https://github.com/mailcow/mailcow-dockerized
cd mailcow-dockerized
./generate_config.sh
docker-compose up -d
```
### B. Lightweight SMTP Relay
#### **msmtp**
- Minimaler SMTP Client
- Gut für kleine Projekte
- Konfiguration:
```conf
# ~/.msmtprc
account default
host smtp.gmail.com
port 587
auth on
user your-email@gmail.com
password your-app-password
from your-email@gmail.com
tls on
```
---
## 4. Implementierung: E-Mails selbst versenden
### Option 1: Nodemailer Integration
```typescript
// src/lib/email/mailer.ts
import nodemailer from 'nodemailer';
import { SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASS } from '$env/static/private';
const transporter = nodemailer.createTransport({
host: SMTP_HOST,
port: SMTP_PORT,
secure: false,
auth: {
user: SMTP_USER,
pass: SMTP_PASS
}
});
export async function sendPasswordResetEmail(email: string, token: string) {
const resetUrl = `https://yourdomain.com/reset-password?token=${token}`;
const mailOptions = {
from: '"uLoad" ',
to: email,
subject: 'Password Reset Request',
html: `
Password Reset
You requested a password reset. Click the link below to set a new password:
Reset Password
If you didn't request this, please ignore this email.
This link will expire in 1 hour.
`
};
await transporter.sendMail(mailOptions);
}
```
### Option 2: API Route für E-Mail-Versand
```typescript
// src/routes/api/email/send/+server.ts
import { json } from '@sveltejs/kit';
import { sendEmail } from '$lib/email/mailer';
export async function POST({ request }) {
const { to, subject, template, data } = await request.json();
try {
await sendEmail({
to,
subject,
template,
data
});
return json({ success: true });
} catch (error) {
return json({ error: 'Failed to send email' }, { status: 500 });
}
}
```
### Option 3: Queue-basierter Versand
```typescript
// src/lib/email/queue.ts
import Bull from 'bull';
import { sendEmail } from './mailer';
const emailQueue = new Bull('email', {
redis: {
host: 'localhost',
port: 6379
}
});
emailQueue.process(async (job) => {
const { to, subject, template, data } = job.data;
await sendEmail({ to, subject, template, data });
});
export async function queueEmail(emailData: EmailData) {
await emailQueue.add(emailData, {
attempts: 3,
backoff: {
type: 'exponential',
delay: 2000
}
});
}
```
---
## 5. E-Mail Templates
### React Email (Moderne Lösung)
```tsx
// emails/PasswordReset.tsx
import {
Body,
Button,
Container,
Head,
Html,
Preview,
Section,
Text
} from '@react-email/components';
export default function PasswordResetEmail({ resetUrl }: { resetUrl: string }) {
return (
Reset your password
Password Reset
Click the button below to reset your password:
);
}
const main = { backgroundColor: '#f6f9fc' };
const container = { margin: '0 auto', padding: '20px' };
const heading = { fontSize: '24px', fontWeight: 'bold' };
const paragraph = { fontSize: '16px', lineHeight: '26px' };
const button = { backgroundColor: '#0ea5e9', color: '#fff', padding: '12px 20px' };
```
---
## 6. Empfehlungen nach Projektphase
### 🚀 **MVP/Entwicklung**
1. **Gmail SMTP** mit App-Password
2. Einfach und kostenlos
3. Limitiert auf 500 E-Mails/Tag
### 📈 **Launch/Wachstum**
1. **Resend** oder **Brevo**
2. Kostenlose Stufe ausreichend
3. Einfache Integration
### 🏢 **Produktion/Scale**
1. **Amazon SES** für Kosten-Effizienz
2. **Postmark** für beste Deliverability
3. **Eigener Mail-Server** für volle Kontrolle
---
## 7. Implementierungs-Checkliste
### Sofort (für MVP):
- [ ] Gmail App-Password erstellen
- [ ] PocketBase SMTP konfigurieren
- [ ] Password Reset testen
- [ ] E-Mail-Verifikation aktivieren
### Kurzfristig (vor Launch):
- [ ] E-Mail Service Provider wählen
- [ ] Domain-Verifikation (SPF, DKIM, DMARC)
- [ ] E-Mail Templates erstellen
- [ ] Transaktionale E-Mails implementieren
### Langfristig (Skalierung):
- [ ] E-Mail-Queue implementieren
- [ ] Analytics/Tracking einrichten
- [ ] A/B Testing für Templates
- [ ] Bounce-Handling
---
## 8. Sicherheits-Überlegungen
### Best Practices:
1. **Rate Limiting**: Max 3 Password Resets pro Stunde
2. **Token Expiry**: 1 Stunde für Reset-Links
3. **Keine E-Mail-Enumeration**: Immer gleiche Response
4. **SPF/DKIM/DMARC**: DNS-Records konfigurieren
5. **Unsubscribe**: One-Click Unsubscribe für Marketing
### Beispiel Rate Limiting:
```typescript
// src/lib/rateLimit.ts
const attempts = new Map();
export function checkRateLimit(email: string): boolean {
const key = `reset:${email}`;
const now = Date.now();
const hourAgo = now - 3600000;
const userAttempts = attempts.get(key) || [];
const recentAttempts = userAttempts.filter((time) => time > hourAgo);
if (recentAttempts.length >= 3) {
return false;
}
attempts.set(key, [...recentAttempts, now]);
return true;
}
```
---
## 9. Kosten-Nutzen-Analyse
| Lösung | Kosten/Monat | E-Mails | Setup | Deliverability | Empfohlen für |
| ----------- | ------------ | --------- | ---------- | -------------- | ------------- |
| Gmail SMTP | €0 | 500/Tag | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | MVP |
| Resend | €0-20 | 100-5k | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | Startups |
| Brevo | €0-25 | 300-40k | ⭐⭐⭐ | ⭐⭐⭐⭐ | SMBs |
| Amazon SES | €1-10 | 10k-100k | ⭐⭐ | ⭐⭐⭐⭐⭐ | Scale |
| Self-hosted | €5-20 | Unlimited | ⭐ | ⭐⭐⭐ | Control |
---
## 10. Fazit & Nächste Schritte
### Sofort-Maßnahme für uLoad:
1. **Gmail SMTP** für Development einrichten
2. **Resend** Account erstellen (kostenlos)
3. PocketBase mit Resend SMTP konfigurieren
### Code-Snippet für .env:
```env
# E-Mail Configuration
SMTP_HOST=smtp.resend.com
SMTP_PORT=587
SMTP_USER=resend
SMTP_PASS=re_YOUR_API_KEY
SMTP_FROM=noreply@yourdomain.com
```
### PocketBase Konfiguration:
```javascript
// In PocketBase Admin Panel eintragen
{
"enabled": true,
"host": "smtp.resend.com",
"port": 587,
"username": "resend",
"password": "re_YOUR_API_KEY",
"tls": true,
"authMethod": "PLAIN",
"localName": "yourdomain.com"
}
```
---
_Erstellt am: 15. Januar 2025_
_Autor: Claude für uLoad Projekt_
_Status: Zur Implementierung bereit_