Ejecutando el siguiente script:
#!/bin/bash
cvs_domain=abc.com
cvs_mail_server=mail.${cvs_domain}
cvs_port=25
telnet $cvs_mail_server $cvs_port<<_EOF_
EHLO $cvs_domain
MAIL FROM:[email protected]
RCPT TO:[email protected]
DATA
Subject:Test!
Don't panic. This is only a test.
.
QUIT
_EOF_
falla con un Connection closed by host
mensaje, justo después de que el servidor responde con el carácter de escape y antes de entregar el 220
mensaje.
Ejecutar la secuencia correspondiente en modo interactivo (por supuesto, sin el "aquí-doc") logra mi objetivo.
Sospecho que "alimentar" las líneas de comando al servidor no ocurre exactamente como se esperaba en el otro extremo de la línea.
¿Es correcta mi suposición? ¿Hay alguna manera de mitigar este problema?
Respuesta1
Cuando necesita crear un script para una herramienta de línea de comandos interactiva, la solución típica es utilizar expect(1)
.
Respuesta2
Para que esté completo, publico aquí la solución completa "fea, pero funciona" (con las modificaciones de que, en su forma final, envía correos electrónicos a más personas, además de proporcionar un archivo adjunto):
cd "$(dirname "$0")"
working_dir=$(pwd) # switching to the folder this script has been started from
cvs_domain=mail.org
cvs_mail_server=mail.${cvs_domain}
cvs_port=25
[email protected]
cvs_recipients=([email protected] [email protected])
cvs_delimiter=-----nEXt_paRt_frontier!!VSFCDVGGERHERZZ@$%^zzz--- # MIME multi-part delimiter, do not change
{ echo HELO $cvs_domain; sleep 1
# set up the email (sender, receivers):
echo MAIL FROM:$cvs_sender; sleep 1
for r in ${cvs_recipients[@]}; do
echo RCPT TO:$r; sleep 1
done
echo DATA; sleep 1
echo From:$cvs_sender; sleep 1
for r in ${cvs_recipients[@]}; do
echo To:$r; sleep 1
done
echo Subject:Test for build; sleep 1
# build the mail structure, according to the MIME standard:
echo MIME-Version: 1.0; sleep 1
echo "Content-Type: multipart/mixed; boundary=\"$cvs_delimiter\""; sleep 1
echo --${cvs_delimiter}; sleep 1
echo Content-Type: text/plain; sleep 1
echo; sleep 1
echo Don\'t panic. This is only a test.; sleep 1
echo; sleep 1
echo --${cvs_delimiter}; sleep 1
echo "Content-Type: text/plain; name=\"test.txt\""; sleep 1
echo "Content-Disposition: attachment; filename=\"test.txt\""; sleep 1
echo "Content-Transfer-Encoding: base64"; sleep 1
echo; sleep 1
encoded_file=$( base64 ./change.log ) # encoding the contents of the file, according to the declaration above
echo "$encoded_file"; sleep 1
echo; sleep 1
echo --${cvs_delimiter}; sleep 1
echo .; sleep 1
echo QUIT
sleep 1; } | telnet $cvs_mail_server $cvs_port
Uno puede optar por jugar con los retrasos. Y, para (lo que creo que puede ser) una solución más sólida, elegiría expect(1)
.