Produkt

So richten Sie Double-Opt-in über die Mailjet-API ein (sicher und DSGVO-konform)

In diesem Artikel erfahren Sie, wie Sie Double-Opt-in-Abonnementformulare erstellen oder vorhandene Formulare über die Mailjet-API mit Mailjet verknüpfen.
Bild fürSo richten Sie Double-Opt-in über die Mailjet-API ein (sicher und DSGVO-konform)
Juni 4, 2024

Dieser umfassende Leitfaden führt Sie durch den Aufbau eines sicheren, skalierbaren Double-Opt-in-Abonnementprozesses (DOI) mit der E-Mail-API v3.1 von Mailjet.

Sie erfahren, wie Sie signierte Bestätigungslinks, E-Mail-Vorlagen, Webhooks und Kontaktsynchronisierung implementieren, um ein DSGVO-konformes Abonnementsystem zu erstellen, das die Zustellbarkeit und Nutzerinteraktionen verbessert.

Was ist Double-Opt-in und warum ist es wichtig?

Double-Opt-in ist ein zweistufiger Anmeldeprozess, bei dem die Nutzer zunächst Ihr Formular abschicken und dann ihre Anmeldung über einen Link in ihrem E-Mail-Posteingang bestätigen. Erst nach dieser Bestätigung werden sie in Ihre E-Mail-Liste aufgenommen.

Die wichtigsten Vorteile des Double-Opt-in

  • Höhere Zustellbarkeit: Entfernt Tippfehler, Bots und Rollenkonten, bevor sie sich auf Ihre Absender-Reputation auswirken
  • Niedrigere Beschwerdequoten: Nur aktiv bestätigte Abonnenten erhalten E-Mails, sodass weniger Spam-Meldungen eingehen
  • Eindeutiger Zustimmungspfad: Bereitstellung von Zeitstempeln, IP-Adressen und Token als Nachweis der Zustimmung
  • Bessere Interaktionen: Bestätigte Abonnenten weisen in der Regel deutlich höhere Öffnungs- und Klickraten auf

Vergleich zwischen Single- und Double-Opt-in

MethodeSchritteAnmeldevolumenQualitätCompliance
Single-Opt-inEin SchrittHöherNiedriger (Tippfehler, Bots)Grundlegend
Double-Opt-inZwei SchritteNiedrigerViel höherDSGVO-bereit

Das werden Sie entwickeln

Am Ende dieses Leitfadens werden Sie Folgendes implementiert haben:

  • Mailjet Send API v3.1 für Bestätigungs- und Willkommens-E-Mails
  • Mailjet-Kontakt- und Listenressourcen für die Abonnentenverwaltung
  • Mailjet Event API (Webhooks) für das Echtzeit-Tracking
  • Sichere Token-basierte Bestätigung mit Replay-Schutz

Voraussetzungen

Bevor Sie loslegen, vergewissern Sie sich, dass Sie über Folgendes verfügen:

  • Mailjet-Konto mit API-Schlüssel und geheimem Schlüssel für die grundlegende Authentifizierung
  • Verifizierter Absender/Domain für Ihre Von-Adresse
  • Mailjet-Kontaktlisten-ID für bestätigte Abonnenten
  • Bestätigungs-E-Mail-Vorlage (über Template API) oder Inline-Inhalt
  • Server-Endpunkte zur Erstellung/Verifizierung von Token und zur Bearbeitung von Bestätigungen
  • Optional: Mailjet E-Mail-Validierung für die Formularvalidierung

Überblick über die Architektur

So funktioniert das Double-Opt-in-Verfahren:

  1. Der Nutzer sendet das Anmeldeformular (E-Mail + optionale Eigenschaften)
  2. Der Server erstellt ein signiertes, einmalig verwendbares Token und erstellt eine Bestätigungs-URL
  3. Über Send API v3.1 gesendete Bestätigungs-E-Mail mit dem Bestätigungslink
  4. Nutzer klickt auf Bestätigungslink
  5. Der Server überprüft das Token und trägt den Kontakt in die Mailjet-Liste ein.
  6. Die optionale Begrüßungs-E-Mail wird gesendet und Webhooks für das laufende Tracking konfiguriert

Schrittweise Implementierung von Double Opt-in

Hier finden Sie einen Schritt-für-Schritt-Leitfaden für die Verwendung der E-Mail-API von Mailjet.

Schritt 1: Erfassen des Abonnements

Beginnen Sie mit der Validierung und Speicherung der ersten Abonnementanfrage:

  • Serverseitige Validierung des E-Mail-Formats mit Standard-Regex oder Validierungsbibliotheken
  • Optional: Rufen Sie die E-Mail-Validierungs-API von Mailjet ab, um offensichtliche Fehler zu erkennen
  • Speichern Sie ausstehende Datensätze in Ihrer Datenbank mit status=pending und Zeitstempel
                            

                                // Beispiel Validierung
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (!emailRegex.test(email)) {
  return { error: 'Invalid email format' };
}

// Ausstehendes Abonnement speichern
await db.subscriptions.create({
  email: email,
  status: 'pending',
  created_at: new Date(),
  ip_address: req.ip
});
                            
                        

Sicherheit ist entscheidend; verwenden Sie niemals MD5 oder einfache Hashes. Implementieren Sie stattdessen eine angemessene Token-Sicherheit:

Token-Anforderungen

  • Kurze Ablaufzeit (30–60 Minuten)
  • Nur zur einmaligen Verwendung mit Replay-Schutz
  • Kryptografisch signiert (HMAC-SHA256 oder JWT)
  • Enthaltene Angaben: email, issued_at, expires_at, nonce/jti

Beispiel einer Token-Erstellung

                            

                                const jwt = require('jsonwebtoken');
const crypto = require('crypto');

function createConfirmationToken(email) {
  const nonce = crypto.randomBytes(16).toString('hex');
  const payload = {
  email: email,
  nonce: nonce,
  iat: Math.floor(Date.now() / 1000),
  exp: Math.floor(Date.now() / 1000) + (60 * 60) // 1 Stunde
  };

  return jwt.sign(payload, process.env.JWT_SECRET);
}

const token = createConfirmationToken('user@example.com');
const confirmUrl = `https://yourapp.com/confirm?token=${token}`;
                            
                        

Schritt 3: Senden der Bestätigungs-E-Mail

Verwenden Sie die Mailjet Send API v3.1, um die Bestätigungs-E-Mail zu versenden. Sie haben zwei Möglichkeiten:

Option A: Verwendung einer gespeicherten Vorlage (empfohlen)

Erstellen Sie zunächst Ihre Vorlage in Mailjet und senden Sie dann:

                            

                                curl -s -X POST \
  --user "$MJ_APIKEY_PUBLIC:$MJ_APIKEY_PRIVATE" \
  https://api.mailjet.com/v3.1/send \
  -H 'Content-Type: application/json' \
  -d '{
  "Messages":[
 {
  "From":{"Email":"no-reply@yourdomain.com","Name":"Ihre Marke"},
  "To":[{"Email":"recipient@example.com","Name":"Empfänger"}],
  "TemplateID": 123456,
  "TemplateLanguage": true,
  "Subject": "Bitte bestätigen Sie Ihr Abonnement",
  "Variables": {
  "confirm_url": "https://yourapp.com/confirm?token=...signed...",
  "first_name": "Alex"
 }
 }
  ]
  }'

                            
                        

Option B: Inline-Inhalt (keine Vorlage)

                            

                                curl -s -X POST \
  --user "$MJ_APIKEY_PUBLIC:$MJ_APIKEY_PRIVATE" \
  https://api.mailjet.com/v3.1/send \
  -H 'Content-Type: application/json' \
  -d '{
  "Messages":[
 {
  "From":{"Email":"no-reply@yourdomain.com","Name":"Ihre Marke"},
  "To":[{"Email":"recipient@example.com"}],
  "Subject":"Bestätigen Sie Ihr Abonnement",
  "TextPart":"Tippen zum Bestätigen: {{var:confirm_url}}",
  "HTMLPart":"<p>Fast geschafft! <a href="%5C%22%7B%7Bvar:confirm_url%7D%7D%5C%22">Bestätigen Sie Ihr Abonnement</a>.</p>",
  "TemplateLanguage": true,
  "Variables":{"confirm_url":"https://yourapp.com/confirm?token=..."}
 }
  ]
  }'
                            
                        

Schritt 4: Handhabung von Bestätigungsklicks

Ihr Bestätigungsendpunkt muss die Token sicher verifizieren:

                            

                                app.get('/confirm', async (req, res) => {
  const { token } = req.query;

  try {
  // Überprüfen der Token-Signatur und des Ablaufzeitpunkts
  const decoded = jwt.verify(token, process.env.JWT_SECRET);

  // Prüfen, ob das Token bereits verwendet wurde
  const existingUse = await db.used_tokens.findOne({  
  token_hash: crypto.createHash('sha256').update(token).digest('hex')  
  });

  if (existingUse) {
  return res.status(400).send('Token already used');
 }

  // Token als verwendet markieren
  await db.used_tokens.create({
  token_hash: crypto.createHash('sha256').update(token).digest('hex'),
  used_at: new Date()
  });

  // Fortfahren mit der Anmeldung
  await subscribeToMailjet(decoded.email);

  res.send('Abonnement erfolgreich bestätigt!');

  } catch (error) {
  res.status(400).send('Ungültiger oder abgelaufener Bestätigungslink");
 }
});
                            
                        

Schritt 5: Mailjet-Liste abonnieren

Sobald das Token verifiziert ist, fügen Sie den Kontakt zu Ihrer Mailjet-Liste hinzu:

Kontakt erstellen oder aktualisieren

                            

                                curl -s -X POST \
  --user "$MJ_APIKEY_PUBLIC:$MJ_APIKEY_PRIVATE" \
  https://api.mailjet.com/v3/REST/contact \
  -H 'Content-Type: application/json' \
  -d '{
  "Email":"recipient@example.com",
  "Name":"Empfängername"
  }'

                            
                        

Zur Liste hinzufügen

                            

                                curl -s -X POST \
  --user "$MJ_APIKEY_PUBLIC:$MJ_APIKEY_PRIVATE" \
  https://api.mailjet.com/v3/REST/listrecipient \
  -H 'Content-Type: application/json' \
  -d '{
  "ContactAlt":"recipient@example.com",
  "ListID": 123456
  }'

                            
                        

Kontakteigenschaften speichern

                            

                                curl -s -X PUT \
  --user "$MJ_APIKEY_PUBLIC:$MJ_APIKEY_PRIVATE" \
  https://api.mailjet.com/v3/REST/contactdata/recipient@example.com \
  -H 'Content-Type: application/json' \
  -d '{
  "Data":[
  {"Name":"first_name","Value":"Alex"},
  {"Name":"city","Value":"Musterstadt"}
  ]
  }'
                            
                        

Hinweis: Definieren Sie zunächst benutzerdefinierte Kontakteigenschaften mit dem contactmetadata-Endpunkt, wenn diese noch nicht vorhanden sind.

Schritt 6: Willkommens-E-Mail senden (optional)

Nach erfolgreicher Anmeldung senden Sie eine Begrüßungs-E-Mail mit demselben Send API v3.1-Muster wie in Schritt 3.

Schritt 7: Webhooks für die Ereignisverfolgung konfigurieren

Richten Sie Webhooks ein, um Echtzeit-Ereignisse für die laufende Listenhygiene zu erhalten:

                            

                                curl -s -X POST \
  --user "$MJ_APIKEY_PUBLIC:$MJ_APIKEY_PRIVATE" \
  https://api.mailjet.com/v3/REST/eventcallbackurl \
  -H 'Content-Type: application/json' \
  -d '{
  "EventType": "sent",
  "Url": "https://yourapp.com/webhooks/mailjet"
  }'
                            
                        

Verfolgen Sie diese Ereignisse:

  • sent, open, click für Interaktionsmetriken
  • bounce, blocked, spam für Zustellbarkeitsprobleme
  • unsub für Compliance und Listenhygiene

Best Practices für Sicherheit und Compliance

Hier finden Sie einige der häufigsten Best Practices.

Datenprotokollierung zur Einhaltung der Vorschriften

Speichern Sie die folgenden Informationen zur Einhaltung der DSGVO:

  • Zeitstempel der Formularübermittlung und IP-Adresse
  • Zeichenfolge des Benutzer-Agenten
  • Eingegebene E-Mail-Adresse
  • Zeitstempel der Bestätigung und IP-Adresse
  • Verwendete Token-ID (niemals das rohe Token)

Empfehlungen zur Sicherheit

  • Verwenden Sie niemals MD5, sondern HMAC-SHA256 oder JWT mit korrektem Ablaufdatum
  • Implementieren Sie eine Ratenbegrenzung, um automatische Anmeldungen zu verhindern
  • Fügen Sie CAPTCHA für zusätzlichen Bot-Schutz hinzu
  • Überprüfen Sie Ihre Domain mit SPF/DKIM-Einträgen für eine bessere Zustellbarkeit
  • Speichern Sie nur Token-Hashes und protokollieren Sie niemals rohe Token

Fehlerbehebung und FAQ

Haben Sie weitere Fragen zu diesem Prozess? Lesen Sie unsere FAQ.

Kann ich Bestätigungs-E-Mails erneut versenden?

Ja! Erstellen Sie einen „resend“-Endpunkt, der das alte Token ungültig macht und ein neues mit neuem Ablaufdatum ausstellt.

Was ist, wenn ein Kontakt bereits existiert?

Sie können Bestätigungen erneut senden. Verwenden Sie beim Klick den Endpunkt listrecipient, um sicherzustellen, dass sie sich in der richtigen Liste befinden.

Wo soll ich das Token eingeben: Abfragezeichenfolge oder Pfad?

Die Abfragezeichenfolge ist typisch und leichter zu parsen. Loggen Sie niemals rohe Token in Analysen.

Sollte ich stattdessen den Form-Editor von Mailjet verwenden?

Der Form-Editor eignet sich hervorragend für den schnellen Einsatz. Nutzen Sie diese API-Methode für personalisierte Erlebnisse in großem Maßstab.

Zusätzliche Ressourcen

Mit dieser Implementierung verfügen Sie über ein robustes, sicheres und gesetzeskonformes Double-Opt-in-System, das Ihre Absender-Reputation schützt und gleichzeitig einen hochwertigen Abonnentenstamm aufbaut.

D