Guide til integration på hjemmesider og systemer. Nu med HTML-emails og templates!
Version v1.2.0 – HTML Templateshttps://mailer.junkerne.dk
Endpoint til mailafsendelse: POST /api/send
Alle kald til /api/send skal have en API nøgle i header:
X-API-Key: mk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
API nøglen oprettes i adminpanel eller brugerpanel.
POST /api/send
Content-Type: application/json
X-API-Key: mk_...
{
"to": "kunde@eksempel.dk",
"subject": "Emne",
"body": "Beskedtekst"
}
to (påkrævet): modtager email
subject (valgfri): emne, default bruges hvis tom
body (valgfri): beskedtekst
is_html (valgfri): sæt til true hvis body er HTML-formateret
template (valgfri): navn på template (transactional, newsletter, alert, custom)
templateOptions (valgfri): objekt med template-konfiguration
Afsendernavn styres centralt og sættes altid til Fra hjemmesiden.
from_name, from_email, sender_name og from fra request ignoreres.
Afsender-email styres centralt via serverens DEFAULT_FROM_EMAIL / UPSTREAM_FROM_EMAIL.
200 OK
{"ok":true,"message":"Mail sendt"}
401 Unauthorized
{"ok":false,"error":"Unauthorized"}
400 Bad Request
{"ok":false,"error":"Missing field: to"}
429 Too Many Requests
{"ok":false,"error":"Rate limit exceeded"}
curl -X POST "https://mailer.junkerne.dk/api/send" \
-H "Content-Type: application/json" \
-H "X-API-Key: mk_INDSAET_DIN_NOEGLE" \
-d '{"to":"mail@domæne.dk","subject":"Test","body":"Hej fra API"}'
const res = await fetch("https://mailer.junkerne.dk/api/send", {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-API-Key": process.env.MAILER_API_KEY
},
body: JSON.stringify({
to: "mail@domæne.dk",
subject: "Velkommen",
body: "Tak for din tilmelding"
})
});
const data = await res.json();
console.log(data);
Vigtigt: Kør dette på server/backend, ikke direkte i browser med synlig API nøgle.
Aktivér HTML-emails ved at sætte is_html: true eller brug indbyggede templates.
curl -X POST "https://mailer.junkerne.dk/api/send" \
-H "Content-Type: application/json" \
-H "X-API-Key: mk_INDSAET_DIN_NOEGLE" \
-d '{
"to": "mail@domæne.dk",
"subject": "Pæn besked",
"is_html": true,
"body": "<h1>Hej!</h1><p>Dette er en <strong>pæn</strong> HTML-email</p>"
}'
Brug indbyggede templates for pænt formaterede emails med farver, rammer og styling:
POST /api/send
Content-Type: application/json
X-API-Key: mk_...
{
"to": "kunde@eksempel.dk",
"subject": "Ordrebekræftelse",
"template": "transactional",
"templateOptions": {
"title": "Ordrebekræftelse #12345",
"heading": "Tak for din ordre!",
"message": "Din ordre er modtaget og behandles snart.",
"actionUrl": "https://eksempel.dk/orders/12345",
"actionText": "Se din ordre",
"details": {
"Ordrenummer": "12345",
"Total": "599 kr.",
"Leveringstid": "2-3 arbejdsdage"
}
}
}
{
"to": "subscriber@eksempel.dk",
"subject": "Junkernes Nyhedsbrev - Maj 2026",
"template": "newsletter",
"templateOptions": {
"heading": "Hvad er der nyt?",
"items": [
{
"title": "Ny feature: API rate limiting",
"content": "Vi har tilføjet intelligente rate limits for at beskytte systemet.",
"link": "https://junkerne.dk/news/1",
"linkText": "Læs mere"
},
{
"title": "Sikkerhedsopdatering",
"content": "Vigtig patch udgivet. Alle brugere opdateres automatisk.",
"link": "https://junkerne.dk/news/2",
"linkText": "Se detaljer"
}
]
}
}
{
"to": "admin@junkerne.dk",
"subject": "Alert: Usædvanlig aktivitet opdaget",
"template": "alert",
"templateOptions": {
"level": "warning",
"title": "Sikkerhedsadvarsel",
"heading": "Usædvanlig aktivitet påvist",
"message": "Der blev registreret 150 login-forsøg fra én IP-adresse i løbet af 1 minut.",
"details": {
"ip": "192.168.1.1",
"attempts": 150,
"time_window": "1 min",
"action": "Account temporary locked"
}
}
}
| Template | Use case | Key options |
|---|---|---|
transactional |
Ordrer, bekræftelser, receipts | title, heading, message, actionUrl, details |
newsletter |
Nyhedsbreve, annoncementer | heading, items (title, content, link) |
alert |
Advarsler, fejl, notifikationer | level (info/warning/error/success), title, heading, details |
custom |
Tilpassede emails med HTML | headerColor, headerText, content, footerText |
const res = await fetch("https://mailer.junkerne.dk/api/send", {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-API-Key": process.env.MAILER_API_KEY
},
body: JSON.stringify({
to: "kunde@eksempel.dk",
subject: "Din ordre er bekræftet",
template: "transactional",
templateOptions: {
title: "Ordrebekræftelse",
heading: "Tak for din ordre!",
message: "Din bestilling behandles nu. Du modtager tracking når den afsendes.",
actionUrl: "https://eksempel.dk/track/order123",
actionText: "Sporet ordre",
details: {
"Ordrenummer": "ORD-2026-12345",
"Samlet pris": "1.299 kr.",
"Skipped dato": "4. maj 2026"
}
}
})
});
const data = await res.json();
console.log(data);
<?php
$payload = json_encode([
'to' => 'kunde@eksempel.dk',
'subject' => 'Velkommen!',
'template' => 'transactional',
'templateOptions' => [
'title' => 'Velkommen til Junkerne',
'heading' => 'Din konto er oprettet',
'message' => 'Velkommen til vores platform. Start ved at oprette din første API-nøgle.',
'actionUrl' => 'https://junkerne.dk/dashboard',
'actionText' => 'Gå til dashboard',
'details' => [
'Email' => 'kunde@eksempel.dk',
'Oprettet' => date('d. M Y'),
'Status' => 'Aktiv'
]
]
]);
$ch = curl_init('https://mailer.junkerne.dk/api/send');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'X-API-Key: ' . getenv('MAILER_API_KEY')
],
CURLOPT_POSTFIELDS => $payload,
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
<?php
$customHtml = '
<h2>Kampagne resultat</h2>
<p>Din kampagne blev afsendt til <strong>1.250 personer</strong></p>
<div style="background: #e8f8ee; padding: 15px; border-radius: 5px; margin: 15px 0;">
<strong style="color: #0f7a37;">✓ 94% open rate</strong><br/>
<strong style="color: #0f7a37;">✓ 12% click rate</strong><br/>
<strong style="color: #0f7a37;">✓ 2 konverteringer</strong>
</div>
';
$payload = json_encode([
'to' => 'marketer@eksempel.dk',
'subject' => 'Kampagne rapport',
'is_html' => true,
'body' => $customHtml
]);
// ... rest af curl setup
1. Sanitering: Templates saniterer automatisk al brugerinput (XSS-beskyttelse).
2. Del aldrig API nøgler i frontend. Templates skal genereres på backend/server.
3. Valider alle detaljer. Brug templateOptions til struktureret data.
4. Tester emails. Brug mail preview før udsendelse til mange.
5. Overvåg bounce rates. Se mail-logs i adminpanel.
Hvis du får 400: Template error, tjek templateOptions syntax.
Hvis du får 400: Missing field: to, husk at `to` er altid påkrævet.
Hvis HTML ikke vises i email-klient, kontakt support - det kan være clientens HTML-support.
Se mail-logs i adminpanel under "Mailhistorik" for fejldetaljekontakt og forbedring.