Eliminando el retraso de envío de Mutt
Originalmente utilicé el MTA SMTP integrado de mutt. Sin embargo, hay una pausa considerable después de presionar enviar. Esto se puede desactivar utilizando un MTA externo con set sendmail_wait=-1
formato muttrc
.
Sin embargo, si lo uso msmtp
como MTA, no hay notificación de errores (aunque msmtp
escribo logfile
como se especifica en ~/.msmtprc
).
Intenta recibir notificaciones
Desde la línea de comando, puedo activar un comando cuando msmtp
falla.
</tmp/tosend msmtp -a default [email protected] --read-envelope-from || echo failed
Posiblemente podría enviar una notificación de error a mi correo *nix local. Sin embargo, esto no parece funcionar en mutt, si configuro lo siguiente en muttrc
.
set sendmail = "/usr/bin/msmtp || date >> /tmp/msmtp.fail"
Esto hace que todos los correos electrónicos no se envíen de forma silenciosa, con el siguiente error en 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
Obviamente, mutt
se trata de analizar las partes adicionales del comando como destinatarios.
Pregunta
¿Hay alguna manera de recibir notificaciones de correos electrónicos enviados que fallan mientras se envían en segundo plano? No estoy atado msmtp
necesariamente.
Respuesta1
Escriba usted mismo un pequeño script de shell para utilizarlo como valor de "sendmail". Por ejemplo, configurar
~/.muttrc
con
set sendmail = /home/yourid/bin/mymuttsendmail
y en mymuttsendmail
poner algo como
#!/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
y chmod +x
este archivo. Recuerde que este script se llamará con los destinatarios como argumentos adicionales, que pasaremos a msmtp con "$@"
, y el correo estará en stdin, que copiaremos inmediatamente en un archivo temporal para luego entregarlo a msmtp
. Cualquier mensaje de error se captura en una variable msg
y si el código de retorno es un error, puede ejecutar un cuadro de diálogo emergente como zenity, por ejemplo.
Respuesta2
¿Has considerado usar un nullmailer mejor, msmtp
que sea lo más minimalista posible? ¿O incluso un MTA completo como exim o postfix (no son muy difíciles de configurar)?
Hay una lista de otras opciones de nullmailer enhttp://linuxmafia.com/faq/Mail/nullmailers.html
Respuesta3
La respuesta de Meuh fue muy útil. Aquí hay una versión más simple de mymuttsendmail. Reemplace username
con su nombre de usuario en el siguiente código para que pueda enviarle un correo electrónico localmente en caso de que haya un error. La variable $? almacena el código de salida de msmtp y utiliza el correo local para enviarle un correo electrónico si hay un error al enviar su correo electrónico. Solo recuerda configurar 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