Automatizando o envio de e-mail usando telnet e FTP no OS X CLI

Automatizando o envio de e-mail usando telnet e FTP no OS X CLI

Executando o seguinte 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_

falha com uma Connection closed by hostmensagem, logo após o servidor responder com o caractere de escape e antes de entregar a 220mensagem.

Executar a sequência correspondente no modo interativo (é claro, sem o "here-doc") atinge meu objetivo.

Suspeito que "alimentar" as linhas de comando para o servidor não acontece exatamente como esperado do outro lado da linha.

Minha suposição está correta? Existe uma maneira de mitigar esse problema?

Responder1

Quando você precisa criar scripts para uma ferramenta de linha de comando interativa, a solução típica é usar o expect(1).

Responder2

Para completar, estou postando aqui a solução completa "feio-mas-funciona" (com a ressalva de que, em sua forma final, envia e-mails para mais pessoas, além de fornecer um anexo):

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  

Pode-se optar por lidar com os atrasos. E, para (o que eu acho que pode ser) uma solução mais robusta, eu escolheria expect(1).

informação relacionada