Wat is een Bounce-adres?
Een bounce adres, ook wel het retour pad of envelop afzender, is het e-mailadres dat niet-levering rapporten (NDR's) ontvangt wanneer een e-mail niet kan worden geleverd. Dit adres is gescheiden van het adres "Vanaf" dat zichtbaar is voor ontvangers en wordt uitsluitend gebruikt voor automatische leveringsmeldingen.
Hoe Bounce adressen werken
E-mailtransmissie maakt gebruik van twee adressen:
Header Van (zichtbaar voor ontvanger):From: John Doe <john@example.com>
Envelop From (SMTP-niveau, gebruikt voor bounces):
MAIL FROM: <bounces@example.com>
Als de levering mislukt, stuurt de ontvangende server de bounce naar de envelope sender, niet de header van het adres.
SMTP-gespreksvoorbeeld
Client: MAIL FROM: <bounces@example.com>
Server: 250 OK
Client: RCPT TO: <invalid@recipient.com>
Server: 550 No such user here
Client: QUIT
# Later, server sends bounce to bounces@example.com
Soorten e-mails
Hard bounces
Permanente leveringsfouten:
- Gebruiker bestaat niet: 550 Gebruiker bestaat niet
- Domein bestaat niet: 550 Domein niet gevonden
- Verworpen door beleid: 550 Spam geblokkeerd
Soft Bounces
Tijdelijke storingen:
- Mailbox vol: 452 Onvoldoende systeemopslag
- Server tijdelijk niet beschikbaar: 421 Service niet beschikbaar
- Berichten te groot: 552 Berichtgrootte overschrijdt limiet
Block Bounces
Leveringsproblemen:
- IP zwarte lijst: 554 Service niet beschikbaar; Sender IP geblokkeerd
- Content gefilterd als spam: 550 Spam score te hoog
- Rate limiting: 450 Te veel e-mails
Bounce-adresconfiguratie
Terugkeerpad instellen in e-mailkoppen
PHP (mailfunctie):$to = "recipient@example.com";
$subject = "Test Email";
$message = "Email body";
$headers = "From: sender@example.com\r\n";
$headers .= "Return-Path: bounces@example.com\r\n";
mail($to, $subject, $message, $headers, "-f bounces@example.com");
PHPMailer:
$mail = new PHPMailer();
$mail->From = "sender@example.com";
$mail->Sender = "bounces@example.com"; // Return path
$mail->addAddress("recipient@example.com");
$mail->Subject = "Test Email";
$mail->send();
Postfix (SMTP):
# /etc/postfix/main.cf
sender_canonical_maps = hash:/etc/postfix/sender_canonical
# /etc/postfix/sender_canonical
@example.com bounces@example.com
# Apply changes
postmap /etc/postfix/sender_canonical
systemctl reload postfix
Dedicated Bounce Handling Services
De meeste e-mail service providers bieden bounce management:
Amazon SES:{
"Message": {
"Subject": "Test",
"From": "sender@example.com",
"ReturnPath": "bounces@example.com"
}
}
SendGrid:
const msg = {
to: 'recipient@example.com',
from: 'sender@example.com',
replyTo: 'reply@example.com',
return_path: 'bounces@example.com',
subject: 'Test Email',
text: 'Email body'
};
Bounce Adres Naamgevingsverdragen
Subdomeinaanpak
bounces@example.com # General bounces
no-reply@example.com # No-reply emails
returns@example.com # Returns/receipts
Campagnespecifiek
Track bounces per campagne:
bounces-newsletter@example.com
bounces-campaign-123@example.com
bounces-transaction@example.com
Variable Envelop Return Path (VERP)
Codeer ontvanger in bounce adres:
Sending to: user@recipient.com
Return path: bounces+user=recipient.com@example.com
When bounce arrives at bounces+*, parse to identify failed recipient
Bezig met verwerken van Bounce-berichten
Geautomatiseerde uitsparing
Python Voorbeeld:import email
from email import policy
def parse_bounce(raw_email):
msg = email.message_from_string(raw_email, policy=policy.default)
# Extract bounce type
if "550" in msg.get_payload():
return "hard_bounce"
elif "452" in msg.get_payload():
return "soft_bounce"
# Extract failed recipient
for part in msg.walk():
if part.get_content_type() == "message/delivery-status":
# Parse delivery status
pass
return bounce_info
# Integrate with mailing list to remove hard bounces
Webhook-based Bounce Handling
Moderne ESP's bieden webhooks:
SendGrid Webhook:POST /bounce-webhook
{
"email": "recipient@example.com",
"event": "bounce",
"reason": "550 5.1.1 User unknown",
"type": "blocked",
"status": "5.0.0"
}
Actie: Database bijwerken om e-mail te markeren als geweigerd.
Adressen SPF en Bounce
SPF controleert de envelop afzender (bounce adres), niet de From header:
Message:
From: newsletter@example.com (header)
Return-Path: bounces@mail-server.com (envelope)
SPF Check:
Queries: mail-server.com TXT record (not example.com)
Must include sending IP in mail-server.com's SPF
Bounce Domain SPF-configuratie
bounces.example.com. IN TXT "v=spf1 include:_spf.sendgrid.net ~all"
Zorg ervoor dat uw bounce subdomein passende SPF records heeft voor uw verzendende infrastructuur.
Bounce Adres Beste praktijken
Gebruik een specifiek Bounce adres
Gebruik nooit uw primaire e-mail voor bounces:
# Bad
Return-Path: info@example.com
# Good
Return-Path: bounces@example.com
Monitor bounce tarieven
| Bounce rate | Beoordeling | Actie |
|---|---|---|
| < 2% | Gezondheid | Doorgaan met toezicht |
| 2-5% | Betreffende | Kwaliteit audit e-maillijst |
| 5-10% | Slecht | Onmiddellijke schoonmaaklijst nodig |
| > 10% | Kritiek | Bezorgbaarheid tegen risico |
Implementeer Bounce Processing
Automatisch verwijderen van harde bounces:
-- Mark emails with hard bounces
UPDATE mailing_list
SET status = 'bounced', bounce_count = bounce_count + 1
WHERE email IN (SELECT email FROM recent_hard_bounces);
-- Remove after 3 hard bounces
DELETE FROM mailing_list
WHERE bounce_count >= 3;
Aparte Transactionele en Marketing Bounces
transactional-bounces@example.com # Order confirmations, receipts
marketing-bounces@example.com # Newsletters, campaigns
Voor elk type worden verschillende bouncetarieven verwacht.
Opstellen van Bounce Processing Automation
Cron Job Voorbeeld:#!/bin/bash
# Process bounces every hour
# Fetch bounces from IMAP
fetchmail -c /etc/fetchmailrc
# Parse and update database
/usr/local/bin/process-bounces.py
# Clean up processed bounces older than 30 days
find /var/mail/bounces -mtime +30 -delete
Backscatter en Bounce Security
Backscatter Probleem
Wanneer uw server spam accepteert en het vervolgens stuitert, stuurt u naar vervalste adressen:
1. Spammer sends email with forged From
2. Your server accepts it
3. Your server realizes it's spam/invalid
4. Your server bounces to forged From address
5. Innocent party receives bounce (backscatter)
Oplossing: Weigeren op SMTP tijd, niet accepteren dan stuiteren:
# Postfix: Reject unknown users at SMTP time
smtpd_recipient_restrictions = reject_unauth_destination
local_recipient_maps = hash:/etc/postfix/local_recipients
Bounce Forgery
Aanvallers kunnen stuiteren berichten naar:
- Oogst geldige adressen
- Spam vermomd als bounces leveren
- Phish referenties via valse levering rapporten
- Check bounce is afkomstig van MX-server
- Controleer bounce is voor e-mail die je eigenlijk verzonden
- Ontleden levering-status headers zorgvuldig
Veelvoorkomende Bounce Scenarios
Scenario 1: Alle e-mails Bouncing
Cause: SPF storing, IP blacklist, of server reputatie Check: SPF records, afzender IP reputatie, DMARC rapportenScenario 2: niet ontvangen bounces
Cause: Bounce-adres is onjuist geconfigureerd of bestaat niet Check: MX records voor bounce domein, mailbox bestaatScenario 3: High Soft Bounce Rate
Cause: Ontvangerservers overbelast, snelheid beperkend, grote berichten*Check: Verzendsnelheid, berichtgrootte, ontvangersserverfouten
Scenario 4: Bounce Loops
Cause**: Bounce adres triggers automatisch antwoord, die triggers een andere stuiter*Check: Auto-responders uitschakelen op bounce-adressen
Testing Bounce Handling
Stuur test e-mail met ongeldige ontvanger:# Test bounce to invalid address
swaks --to invalid-user@test-domain.com \
--from bounces@example.com \
--server mx.test-domain.com
# Check if bounce arrives at bounces@example.com
Verify SPF for bounce domain**:
dig bounces.example.com TXT
# Should show SPF record with authorized senders
Goed bounce adresbeheer is van cruciaal belang voor het behoud van de reputatie van de afzender, lijsthygiëne en de leverbaarheid.