Automatización del envío de correo electrónico mediante telnet y FTP en OS X CLI

Automatización del envío de correo electrónico mediante telnet y FTP en OS X CLI

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 hostmensaje, justo después de que el servidor responde con el carácter de escape y antes de entregar el 220mensaje.

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).

información relacionada