This text should not be displayed if everything goes well: use left/right arrow keys to browse the presentation.

Éric Faurot

AsiaBSDCon 2013 - March 17, Tokyo, Japan

Plan

SMTP

SMTP

SMTP

image/svg+xml

SMTP

Next relay is found using:
$ dig -t mx poolp.org
 ... some stuff...
 ;; ANSWER SECTION:
 poolp.org.  3589  IN   MX   200  poolp.no-ip.org.
 poolp.org.  3589  IN   MX     0  mx1.poolp.org.
 poolp.org.  3589  IN   MX    50  mx2.poolp.org.
 poolp.org.  3589  IN   MX   100  mx3.poolp.org.
 ... more stuff...

SMTP Protocol

SMTP Protocol

Transaction: foo@bar.com mails gilles@poolp.org

SMTP server

OpenSMTPD

OpenSMTPD

Configuration

Minimalist setup

listen on lo0

table aliases db:/etc/mail/aliases.db

accept for local alias <aliases> deliver to mbox
accept for any relay

Configuration

Primary domain

listen on egress

table aliases db:/etc/mail/aliases.db

accept from any for domain "example.org" \
		 alias <aliases> deliver to mbox
accept for local alias <aliases> deliver to mbox
accept for any relay

Configuration

Configuration

Using a smarthost

listen on lo0

# format:  "label   login:password"
table secrets file:/etc/mail/secrets
table aliases db:/etc/mail/aliases.db

accept for local alias <aliases> deliver to mbox
accept for any relay                    \
    via smtps+auth://label@smtps.my.isp \
    auth <secrets>

Configuration

Backup server

listen on egress

table poolp { poolp.org, opensmtpd.org }

accept for local deliver to mbox

accept from any for domain example.org relay \
    backup mx4.example.org
	
accept from any for domain <poolp> relay \
    backup mx2.poolp.org

Configuration

Signing outgoing mail with DKIM proxy

listen on lo0
listen on lo0 port 10029 tag DKIM

accept for local deliver to mbox
accept tagged DKIM for any relay
accept for any relay via smtp://127.0.0.1:10028

Configuration

Authenticating relay

listen on egress port submission tls \
                 certificate my.cert auth

accept from any for domain "opensmtpd.org" \
                 deliver to maildir

accept for any relay

Configuration

Deliver to virtual users

listen on egress

table usr { "alice" = "100:100:/var/vusers/alice",
            "bob" = "100:100:/var/vusers/bob" }
			   
accept from any for domain "wonderland.org" \
       userbase <usr> deliver to maildir
	   
accept for any relay

Configuration

Tables

Queue

Queue

# find -f /var/spool/smptd/queue
/var/spool/smtpd/queue/90/90fa32a2/90fa32a23acab696
/var/spool/smtpd/queue/90/90fa32a2/90fa32a273da3247
/var/spool/smtpd/queue/90/90fa32a2/message
/var/spool/smtpd/queue/34/3475fa58/3475fa584b7239a9
/var/spool/smtpd/queue/34/3475fa58/message

Queue

# cat /var/spool/smtpd/queue/34/3475fa58/3475fa584b7239a9
version: 1
helo: shear.ucar.edu
hostname: lists.openbsd.org
sockaddr: 192.43.244.163
sender: owner-misc+M130340=mailing=poolp.org@openbsd.org
rcpt: mailing@poolp.org
dest: mailing@poolp.org
ctime: 1363275217
expire: 345600
type: mda
mda-method: mda
mda-usertable: <getpwnam>
mda-buffer: /home/mailing/archiver.py
mda-user: mailing
last-bounce: 1363289617
retry: 113
errorline: "Exception: 403"

Administration

Internals

Design

Process layout

Process layout

SMTP

Process layout

FILTER

Process layout

TRANSFER

Process layout

DELIVERY

Process layout

CONTROL

Process layout

LOOKUP

Process layout

PARENT

Process layout

SCHEDULER

Process layout

QUEUE

Enqueueing

image/svg+xml

Enqueueing

image/svg+xml

Enqueueing

image/svg+xml

Enqueueing

Envelope expansion

Scheduling

On temporary failure:
  • Quadratic delay: d = \frac{k.n^2}{2}
  • May bounce a warning

Relaying

Delivering

Bouncing

Bouncing

Bouncing

Bouncing

Backends

Backends: queue API

enum queue_op {
  QOP_CREATE,
  QOP_DELETE,
  QOP_UPDATE,
  QOP_WALK,
  QOP_COMMIT,
  QOP_LOAD,
  QOP_FD_RW,
  QOP_FD_R,
  QOP_CORRUPT,
};

struct queue_backend {
  int (*init)(int);
  int (*message)(enum queue_op, uint32_t *);
  int (*envelope)(enum queue_op, uint64_t *, char *, size_t);
};

Backends: scheduler API

struct scheduler_backend {
  void   (*init)(void);
  void   (*insert)(struct scheduler_info *);
  size_t (*commit)(uint32_t);
  size_t (*rollback)(uint32_t);
  void   (*update)(struct scheduler_info *);
  void   (*delete)(uint64_t);
  void   (*batch)(int, struct scheduler_batch *);

  size_t (*messages)(uint32_t, uint32_t *, size_t);
  size_t (*envelopes)(uint64_t, struct evpstate *, size_t);
  void   (*schedule)(uint64_t);
  void   (*remove)(uint64_t);
};

Backends

General remarks

Security

Reliability

Nobody likes to lose mails

Reliability

Performances

Good and ba^Wless good

Portability

Roadmap

Thank you!
Questions?

#

1 / 62