Устранение задержки отправки Mutt

Устранение задержки отправки Mutt

Устранение задержки отправки Mutt

Первоначально я использовал встроенный SMTP MTA от Mutt. Однако после нажатия на send есть значительная пауза. Это можно отключить, используя внешний MTA с set sendmail_wait=-1помощью muttrc.

Однако если я использую msmtpв качестве MTA, то никаких уведомлений об ошибках не появляется (хотя msmtpзапись выполняется logfile, как указано в ~/.msmtprc).

Попытка получить уведомления

Из командной строки я могу запустить команду в случае msmtpсбоя.

</tmp/tosend msmtp -a default [email protected] --read-envelope-from || echo failed

Предположительно, я мог бы отправить уведомление об ошибке на мою локальную почту *nix. Однако, похоже, это не работает в mutt, если я установлю следующее в muttrc.

set sendmail = "/usr/bin/msmtp || date >> /tmp/msmtp.fail"

Это приводит к тому, что все электронные письма не отправляются без предупреждения, и в msmtpфайле 's появляется следующая ошибка logfile.

Nov 05 10:53:09 host=mail.bar.com tls=on auth=on [email protected] [email protected] recipients=||,date,>>,/tmp/msmtp.fail,[email protected] smtpstatus=501 smtpmsg='501 #5.1.1 bad address ' errormsg='recipient address >> not accepted by the server' exitcode=EX_DATAERR

Очевидно, muttчто это разбор дополнительных частей команды в качестве получателей.

Вопрос

Есть ли способ получать уведомления об отправленных письмах, которые не отправляются, при отправке в фоновом режиме? Я не привязан к msmtpобязательно.

решение1

Напишите себе небольшой скрипт оболочки для использования в качестве значения "sendmail". Например, настройте ~/.muttrcс помощью

set sendmail = /home/yourid/bin/mymuttsendmail

и mymuttsendmailвставьте что-то вроде

#!/bin/bash
tmp=$(mktemp /tmp/mymutt.XXXXXX)
cat >$tmp
( if ! msg=$(msmtp "$@" <$tmp 2>&1)
  then zenity --error --text "$msg"
  fi 
  rm $tmp
) &
exit 0

и chmod +xэтот файл. Помните, что этот скрипт будет вызван с получателями в качестве дополнительных аргументов, которые мы передаем в msmtp с помощью "$@", а почта будет на stdin, который мы немедленно копируем во временный файл, чтобы затем передать в msmtp. Любые сообщения об ошибках сохраняются в переменной, msgи если код возврата является ошибкой, вы можете запустить всплывающее диалоговое окно, например, zenity.

решение2

Рассматривали ли вы возможность использования лучшего nullmailer, msmtpнастолько минималистичного, насколько это возможно? Или даже полноценного MTA, например exim или postfix (их не так уж сложно настроить)?

Список других вариантов нульмейлеров можно найти наhttp://linuxmafia.com/faq/Mail/nullmailers.html

решение3

Ответ meuh был очень полезен. Вот более простая версия mymuttsendmail. Замените usernameна свое имя пользователя в следующем коде, чтобы он мог отправить вам локальное письмо в случае ошибки. Переменная $? хранит код выхода msmtp и использует локальную почту для отправки вам письма в случае ошибки отправки вашего письма. Просто не забудьте установить sendmail_wait=-1.

#!/bin/bash
/usr/bin/msmtp "$@" 2>&1
VAL=$?
if (($VAL))
then 
    # message not sent
    echo "Error sending mail to $@, exit code $VAL" | mail -s 'ERROR' username
fi 

Связанный контент