Automatisieren des E-Mail-Versands mithilfe von Telnet und FTP auf der OS X-Befehlszeilenschnittstelle

Automatisieren des E-Mail-Versands mithilfe von Telnet und FTP auf der OS X-Befehlszeilenschnittstelle

Ausführen des folgenden Skripts:

#!/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_

schlägt mit einer Connection closed by hostMeldung fehl, direkt nachdem der Server mit dem Escape-Zeichen geantwortet hat und bevor die 220Nachricht übermittelt wird.

Durch Ausführen der entsprechenden Sequenz im interaktiven Modus (natürlich ohne das „Here-Doc“) erreiche ich mein Ziel.

Ich vermute, dass das „Übermittlung“ der Befehlszeilen an den Server am anderen Ende der Leitung nicht genau wie erwartet erfolgt.

Ist meine Annahme richtig? Gibt es eine Möglichkeit, dieses Problem zu mildern?

Antwort1

Wenn Sie ein interaktives Befehlszeilentool skripten müssen, besteht die typische Lösung darin, zu verwenden expect(1).

Antwort2

Der Vollständigkeit halber veröffentliche ich hier die vollständige „hässliche, aber funktionierende“ Lösung (mit der Änderung, dass sie in ihrer endgültigen Form E-Mails an mehr Personen sendet und auch einen Anhang bereitstellt):

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  

Man kann mit den Verzögerungen herumspielen. Und für (was meiner Meinung nach) eine robustere Lösung wäre, würde ich mich für entscheiden expect(1).

verwandte Informationen