23

On my laptop, I have set up a cron that performs a weekly job. If there is something to report, I would like to get an e-mail for it. Right now I am using KMail as MUA which is able to read mail from the Maildir directory at ~/.local/share/local-mail. Thus, I want local mail to be delivered to that folder (with a Maildir structure).

I was hoping that a dead simple program already exist that has a sendmail interface (such that echo "$REPORT" | mail -s "$SUBJECT" "$ME" can work with it). Installing exim or forwarding mail to my remote mailserver is considered overkill.

The question Simplest way of forwarding all mail from server? seems to target remote forwarding which does not suit my needs (I need local delivery). This old Gentoo thread ended up in crafting an old script in Perl. Surely there must exist a well-thought, dead-simple program?

Any recommendations? I am using Arch Linux.

Lekensteyn
  • 20,173
  • 18
  • 71
  • 111
  • Presuming whatever MTA Arch uses by default is installed and running, you could just use `[email protected]` and the stuff should end up in `/var/spool/mail/userX`; you can check this yourself or create a new account to check with your MUA. – goldilocks Jul 07 '13 at 16:44
  • 3
    Some googling brought me to https://github.com/corecode/dma aka Dragonfly Mail Agent. – tripleee Jul 07 '13 at 17:05
  • @goldilocks Arch being a minimal distribution does not have a MTA installed by default. `/usr/bin/sendmail` does not exist and cron output end up in `/dev/null`. – Lekensteyn Jul 07 '13 at 20:17
  • @tripleee I encountered that but ignored it once I saw SMTP and TLS being mentioned. Thanks for mentioning, I will have a look again. *does not listen on port 25* sounds good to me. – Lekensteyn Jul 07 '13 at 20:18
  • @tripleee Unfortunately, dma does not support Maildir, only spool dirs in `/var/spool/mail`. – Lekensteyn Jul 08 '13 at 13:40

1 Answers1

8

Since I could not find an existing, small program, I decided to write my own one. Originally, I came up with:

#!/bin/bash
# Simple sendmail
# filename per spec at http://cr.yp.to/proto/maildir.html
rand=$((RANDOM % 1000))
msgname=$(date +%s).P$$R$rand.$(hostname | tr '/:' '\057\072')

# Safety measure: do not overwrite existing mail
set -o noclobber

cat > ~peter/".local/share/local-mail/inbox/new/$msgname"

That worked... except if the user executing the script is not "peter". The successor of this idea is a "small" C program, femtomail. From its README:

femtomail - minimal MDA with Maildir support

femtomail is a minimal Mail Delivery Agent (MDA) for local mail. Mail is accepted from standard input and placed in a Maildir box of a user. This software is intended for use on a single-user machine.

Remote delivery, daemonizing, sender verification, etc. is not implemented and won't be implemented due to its complexity. femtomail is not written because mail software did not exist, but because existing software were too large for the simple task of delivering cron mail to the local user.

The workflow of femtomail:

  1. Change the process user and group.
  2. Create a new file with a unique filename in the mail directory.
  3. Write a Received header to the file.
  4. Pass data from standard input to the file.
  5. Exit.

The source code and installation instructions are available at https://git.lekensteyn.nl/femtomail/.

Lekensteyn
  • 20,173
  • 18
  • 71
  • 111
  • 1
    it would be great if femtomail could: read user@localhost (or hostname of local host) and setuid that user, write the email either in home dir or somewhere standard. would require setuid bits. – gauteh Nov 20 '14 at 17:25
  • @gauteh That is already more advanced and probably not for use on a single-user machine. More features means larger code and a greater chance of bugs. What is your use case? – Lekensteyn Nov 20 '14 at 22:03
  • definetely, to use it as a complete local mail delivery agent, between users - without hardcoded stuff. – gauteh Nov 22 '14 at 10:19
  • @gauteh I think you are better off with a more complete MDA such as Dovecot for that use case. You are free to patch femtomail for your use case though, and maybe even send a PR in case others are interested. – Lekensteyn Nov 22 '14 at 11:07
  • I miss the reason for step 1, because cron already runs your job as your UID and GID. – q.undertow Nov 16 '21 at 17:13
  • @Lekensteyn I get that you're trying to keep the code simple, but specifying only one username at compile time seems a little excessive. Surely a username could be specified in a `-u username` cmdline argument and put into a username string instead of the `USERNAME` constant. This is likely to replace `/usr/bin/sendmail` and whilst missing out many features makes sense, that is intended to be a system-wide program allowing for the sending of mail to any user's mailbox. If it can only send mail to one user it would make more sense to advise installing it in that user's home directory. – Jez Jan 21 '22 at 13:07