Устранение задержки отправки 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