[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

How I am handling msmtp queues

From: Jean Louis
Subject: How I am handling msmtp queues
Date: Thu, 10 Mar 2022 09:23:45 +0300

I wish to describe how I use Emacs Lisp to send emails.

msmtp is about sending emails from computer:

Description     : A mini smtp client
URL             :

For longer time I have used msmtp by cron job. However, that somehow
blocked itself, some colliding msmtp processes were in memory and I
had to kill them all before running script

Often I have thousands of emails in the queue, and sending them
reliably is important. Cron job for some unknown reasons did not do

Then I have made this Emacs Lisp function.

;;;; MSMTP

(defun msmtp-count-remaining ()
  "Count and send remaining MSMTP messages in the queue"
  (let ((count (length (directory-files "~/.msmtpqueue" nil "\\.mail"))))
    (if (> count 0)
          (async-shell-command "" "*msmtp*")
          (message "There is %s e-mails in queue." count))
      (message "No emails."))))

And I run the function with timer so that it is repeated every
minute. If there are some emails in the queue, the function will
dispatch them.

;; (run-with-timer 0 60 'msmtp-count-remaining)

Additionally I have adjusted the variable `display-buffer-alist' so
that buffers matching "msmtp" have function `display-buffer-no-window'
so that the buffer does not appear on screen when running the queue.

I can run the above Lisp with M-x msmtp-count-remaining or the timer
will run the script and send any messages in the queue.

And original msmtp script is here:

#!/usr/bin/env bash



# wait for a lock that another instance has set
while [ -e "$LOCKFILE" -a "$WAIT" -lt "$MAXWAIT" ]; do
        sleep 1
        WAIT="`expr "$WAIT" + 1`"
if [ -e "$LOCKFILE" ]; then
        echo "Cannot use $QUEUEDIR: waited $MAXWAIT seconds for"
        echo "lockfile $LOCKFILE to vanish, giving up."
        echo "If you are sure that no other instance of this script is"
        echo "running, then delete the lock file."
        exit 1

# change into $QUEUEDIR 
cd "$QUEUEDIR" || exit 1

# check for empty queuedir
if [ "`echo *.mail`" = '*.mail' ]; then
        echo "No mails in $QUEUEDIR"
        exit 0

# lock the $QUEUEDIR
touch "$LOCKFILE" || exit 1

# process all mails
for MAILFILE in *.mail; do
        MSMTPFILE="`echo $MAILFILE | sed -e 's/mail/msmtp/'`"
        echo "*** Sending $MAILFILE to `sed -e 's/^.*-- \(.*$\)/\1/' 
        if [ ! -f "$MSMTPFILE" ]; then
                echo "No corresponding file $MSMTPFILE found"
                echo "FAILURE"
        msmtp $OPTIONS `cat "$MSMTPFILE"` < "$MAILFILE"
        if [ $? -eq 0 ]; then
                rm "$MAILFILE" "$MSMTPFILE"
                echo "$MAILFILE sent successfully"
                echo "FAILURE"

# remove the lock
rm -f "$LOCKFILE"

exit 0


Take action in Free Software Foundation campaigns:

In support of Richard M. Stallman

reply via email to

[Prev in Thread] Current Thread [Next in Thread]