COURIERUUCP(8)

πŸ“¦
version 2.0.6 Β· 3 versions
, in ubuntu stonking

πŸŽ€ NAME πŸŽ€

okay so this is courieruucp(8) β€” the sample Courier mail filter, bestie πŸ’Œ and yeah the page header has S. Varshavchik up in the corner, we'll get to them at the bottom, patience babe ✨

🫢 SYNOPSIS 🫢

makeuucpneighbors

that's it. that's the whole thing. she's minimal, she's iconic πŸ’…

πŸ’– DESCRIPTION πŸ’–

so πŸ’– the Courier mail server can literally send and receive mail over UUCP. But β€” and this is important β€” Courier does not implement UUCP itself. Nope. It uses third-party UUCP software, which you have to install on your own, separately, personally, yourself πŸ™ˆ. The UUCP support comes free from the courieruucp module, and it's compiled and installed by default, so like, slash slay ✨

Courier sends mail via UUCP by issuing a request via uux to execute the rmail command on the remote UUCP node. It hands the message envelope sender to rmail through the -f flag, and then the message envelope recipients go in as the remaining arguments. Message envelope addresses and the E-mail addresses sitting in the message headers both get appropriately rewritten. glow up πŸ’…

Courier will only send mail via UUCP if it knows about the recipient's UUCP node, no cap. The config file /etc/courier/uucpneighbors is a plain text configuration file. The makeuucpneighbors script compiles that config file into a binary database that Courier reads. Changes to /etc/courier/uucpneighbors do not take effect until makeuucpneighbors is executed and Courier is restarted. two steps, don't skip the second one 😭

Also plot twist: /etc/courier/uucpneighbors can be a subdirectory instead of a plain text file πŸ¦‹ and if it is, then the contents of all the text files in that subdirectory get automatically concatenated by the makeuucpneighbors script. automatic. effortless. she did that.

πŸ“ Contents of /etc/courier/uucpme

This config file must be initialized to contain the UUCP node name that this machine is known by to its neighbors. And if /etc/courier/uucpme doesn't exist? No stress β€” Courier falls back to using the first node name of the hostname specified by the /etc/courier/me configuration file. fallback queen πŸ‘‘

🧚 Contents of /etc/courier/uucpneighbors

okay real talk bestie, in addition to creating this config file you also have to configure your UUCP software to appropriately route UUCP mail to the specified nodes β€” and that is a completely separate task. two different chores. don't @ me πŸ™ˆ

Blank lines in this file get ignored. Lines that start with the # character are comments and also get ignored. The remaining lines look exactly like this:

node<TAB>flags

where node is a UUCP node, like "apple" or "food!fruits!apple". <TAB> is a single tab character. And flags is zero or more of the single character flags described below. Oh and the tab character can be ommited if there are no flags β€” yes we're keeping the original's spelling of "ommited", it's part of the lore πŸ’€

If there's an entry for node in /etc/courier/uucpneighbors then Courier will accept mail for any address of the form "node!user", but not "node!nodule!user". So to accept mail for "node!nodule!user" you must enter both "node" and "node!nodule" β€” unless you use the F or the G flag, in which case you're covered 🫢

The flags are as follows:

  • F β€” πŸ“ Unrestricted forwarding. This flag accepts any UUCP path that starts with the specified node. Example:
food<TAB>F

This will accept "food!fruits!apple", "food!fruits!banana", "food!drinks!orangejuice", and so on. You can simply list all your immediate UUCP neighbors using the F flag and accept mail to any address that's reachable via any neighbor. one flag, infinite vibes ✨

  • G β€” 🌈 This is a gateway. Identical to the F flag, except that rmail is executed on the specified node. Normally Courier issues a uux request to run rmail on the last node, for example "uux food!fruits!rmail apple". Using G instead of F runs rmail on the listed node instead, for example "uux food!rmail fruits!apple". same energy, different node πŸ’…
  • R β€” πŸ’œ This is a relay. Used where neither F nor G is appropriate, but you still want to run rmail on this node. Example:
food!fruits
food<TAB>R

In this example, mail to "food!fruits!apple" is sent by executing "uux food!rmail fruits!apple". If the R flag is not specified, then Courier will request "uux food!fruits!rmail apple". subtle but make it make sense 😌

🌸 Contents of /etc/courier/module.uucp

This is the standard Courier module configuration file. the usual, with three settings:

  • MAXDELS β€” πŸŽ€ Maximum simultaneous UUCP deliveries. Lowkey this setting is a bit misleading. From Courier's viewpoint, a delivery consists only of running uux to queue up the message via UUCP. Once uux returns, as far as Courier is concerned, the message is delivered. UUCP is responsible for getting the message the rest of the way. So UUCP deliveries tend to be fairly quick 🌬️ and it is not necessary to configure a large number of concurrent courieruucp processes, since each one will terminate quickly. Once uux terminates, the UUCP software is on the hook for queueing and sending the message. not me doing one (1) job and dipping 😭
  • MAXHOST β€” ✨ Maximum simultaneous UUCP deliveries to the same UUCP node. Since UUCP deliveries tend to be fairly quick, it's not usually necessary to use MAXHOST to limit concurrent deliveries to the same UUCP node β€” so MAXHOST should generally be set to the same value as MAXDELS. twin settings, matched outfits 🫢
  • MAXRCPT β€” πŸ’Œ Maximum recipients per message. When the same message goes to multiple recipients on the same UUCP node, Courier can ask to run rmail only once and list all the recipients together. MAXRCPT specifies the upper limit on the number of recipients batched together. You want to set a limit based on any limitations on the length of command lines that's imposed by the operating system. And sending the same message to different UUCP nodes is always handled as separate deliveries β€” no batching across nodes, periodt πŸ’…

🌈 HEADER AND ADDRESS REWRITING 🌈

Courier is certainly capable of relaying mail between the Internet β€” via ESMTP β€” and UUCP-land, rewriting headers and addresses appropriately πŸ¦‹ The address rewriting rules are fixed, but they're expected to work in nearly every case. And if you find yourself in some oddball situation? bestie, you'll just have to invest the time to add custom header rewriting code. no shortcuts, go off πŸ‘‘

So say you're example.com and your UUCP node is example β€” then <user@example.com> gets rewritten as example!user. clean. gorgeous. iconic ✨

Internet mail may be sent via ESMTP to your UUCP neighbor apple!john by sending it to <apple!john@example.com>. When that's forwarded via UUCP, the return address of <someone@domain.com> will be rewritten as example!domain.com!someone. glow up in transit πŸ’«

apple!john will get the mail with this return address, which should be repliable back to the sender. Then Courier's UUCP module receives the UUCP address domain.com!someone, and translates it back as <someone@domain.com>. round trip, baby, she came back different but the same 🫢

πŸ’€ BUGS πŸ’€

Courier does not support defining multiple UUCP node names in /etc/courier/uucpme. one node name only. that's the rule 😭

πŸ‘‘ SEE ALSO πŸ‘‘

✨ AUTHOR ✨

Sam Varshavchik

  • Author πŸ‘‘

πŸ“Ž NOTES πŸ“Ž

  1. esmtpd(8) β€” https://www.courier-mta.org/esmtpd.html
  2. couriertcpd(8) β€” https://www.courier-mta.org/couriertcpd.html
  3. courier(8) β€” https://www.courier-mta.org/courier.html

and that's the whole page bestie πŸ’– this manual is from the Courier Mail Server, dated 01/10/2026, and honestly? reading a manpage has never been this fun. go configure your UUCP neighbors, run makeuucpneighbors, restart Courier, and drink some water πŸ«ΆπŸ’…βœ¨

πŸ“¦ where this page comes from
  • ubuntu stonking: courier-mta 2.0.6-1 Β· GPL-3+~with-OpenSSL-exception
  • πŸ’– girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms