How to create linux account with useradd without creating mail spool

Solution 1:

man useradd

   -K, --key KEY=VALUE
       Overrides /etc/login.defs defaults (UID_MIN, UID_MAX, UMASK, PASS_MAX_DAYS and others).

       Example: -K PASS_MAX_DAYS=-1 can be used when creating system account to turn off password ageing, even though
       system account has no password at all. Multiple -K options can be specified, e.g.: -K UID_MIN=100 -K UID_MAX=499

So, try this:

# useradd -K MAIL_DIR=/dev/null nomailuser

A warning would appear (Creating mailbox file: Not a directory), but you can ignore.

Solution 2:

I'm setting up a Docker image with Alpine and shadow package and got the same error.

To avoid this "Creating mailbox file: No such file or directory" error I had to add the following inline replacement before trying to add user:

RUN sed -i 's/^CREATE_MAIL_SPOOL=yes/CREATE_MAIL_SPOOL=no/' /etc/default/useradd

This is a Dockerfile directive. If you are struggling with an already running host, just edit the /etc/default/useradd file and change the setting accordingly. This change would prevent any other user creation from getting its mailbox created.
It that is not the desired behavior, you can just create the /var/mail folder with

[ -d /var/mail ] || mkdir /var/mail

Or in the Dockerfile:

RUN mkdir /var/mail 

Hope this helped.

Solution 3:

Oddly enough, the answer is no. I just read the sourcecode and there is no option for this, though there is a workaround (sort of): maildirs don't get created for system accounts.

So you can do useradd -r -m. You'll have to specify a UID/GID manually as well though, as they're picked from different ranges.