SMMAPD(8)

πŸ’Œ SMMAPD(8) β€” the Sendmail + Postfix socket map daemon, Cyrus IMAP edition

okay bestie, welcome to smmapd(8), aka the little daemon from the Cyrus IMAP docs that answers the question everybody asks before they hand you an email: "does this mailbox even exist tho?" πŸ’…


✨ NAME ✨

smmapd β€” Cyrus IMAP documentation β€” the Sendmail and Postfix socket map daemon 🫢


πŸ¦‹ SYNOPSIS πŸ¦‹

smmapd [ -C config-file ]  [ -U uses ] [ -T timeout ] [ -D ] [-p]

🌸 DESCRIPTION 🌸

okay so smmapd is a Sendmail and Postfix socket map daemon, and its whole job is a vibe check on a Cyrus mailbox. It verifies that:

  • the mailbox exists,
  • it is postable,
  • it is not blocked for the smmapd service in the userdeny database,
  • and it is under quota.

It takes commands on its standard input and replies on its standard output. And it MUST be invoked by master(8) with those descriptors attached to a remote client connection β€” that's not a suggestion, that's the whole deal, no cap. πŸ”₯

The queries it receives contain the map name followed by the mailbox, and smmapd literally just ignores the map name. iconic behavior honestly.

Queries with plus addressing, when -p is not passed, return OK when the user has a mailbox with the name after the plus; otherwise the result is NOTFOUND. The match for the mailbox after the plus is performed case-sensitive, and for the address before the plus it depends on lmtp_downcase_rcpt. πŸŽ€

The use case? Verify in Sendmail or Postfix whether the destination exists before accepting an email. Then β€” and this is the sneaky part β€” if autocreate_sieve_folders is set but the folder doesn't exist yet, smmapd will return NOTFOUND, unless -p is passed. 😭

Another use case is doing something in a Sieve script with emails, based on plus addressing, without delivering them into the correspondent sub-folder. To accept such emails, when the folder with the same name does not exist, -p must be passed. periodt.

smmapd reads its configuration options out of the imapd.conf(5) file unless you say otherwise with -C. 🧚


πŸ’– OPTIONS πŸ’–

  • -C config-file β€” use the specified configuration file config-file rather than the default imapd.conf(5). yes bestie, you can have a whole separate config, main character energy ✨
  • -U uses β€” the maximum number of times the process should be used for new connections before shutting down. the default is 250.
  • -T timeout β€” the number of seconds the process will wait for a new connection before shutting down. note that a value of 0 (zero) will disable the timeout. the default is 60.
  • -D β€” run the external debugger specified in debug_command. πŸ›
  • -p β€” skip plus addressing: everything from + until @. when looking up the userdeny database, plus addressing is always skipped, irrespective of this option. (yes, even if you don't pass -p. the userdeny lookup does not care about your feelings πŸ’€)

🌈 EXAMPLES 🌈

smmapd is commonly included in the SERVICES section of cyrus.conf(5) like so:

SERVICES {
    imap        cmd="imapd -U 30" listen="imap" prefork=0
    imaps       cmd="imapd -s -U 30" listen="imaps" prefork=0 maxchild=100
    lmtpunix    cmd="lmtpd" listen="/var/run/cyrus/socket/lmtp" prefork=0 maxchild=20
    smmap       cmd="smmapd" listen="/var/run/cyrus/socket/smmap" prefork=0
    sieve       cmd="timsieved" listen="sieve" prefork=0
    notify      cmd="notifyd" listen="/var/run/cyrus/socket/notify" proto="udp" prefork=1
    httpd       cmd="httpd" listen=8080 prefork=1 maxchild=20
}

look at that little smmap line living its best life in there πŸ₯Ή


πŸ“ FILES πŸ“

  • /etc/imapd.conf
  • /etc/cyrus.conf

πŸ‘€ SEE ALSO πŸ‘€


πŸ‘‘ AUTHOR πŸ‘‘

The Cyrus Team, Nic Bernstein (Onlight) 🫢


1993–2026, The Cyrus Team


okay that's the whole page bestie, you ate it up, no notes πŸ’…βœ¨

and for the cute little sign-off: this was Cyrus IMAP 3.12.4, dated Sep 09, 2026 β€” so go forth, map those sockets, and remember, NOTFOUND is a valid answer and it's not about you. πŸ¦‹πŸŒΈπŸ’–

πŸ“¦ where this page comes from