1

Запустите следующий скрипт:

#!/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:my_mail@abc.com
RCPT TO:my_mail@abc.com
DATA
Subject:Test!

Don't panic. This is only a test.
.
QUIT
_EOF_

происходит сбой при Connection closed by host сообщением хоста , сразу после ответа сервера с escape-символом и перед передачей сообщения 220 .

Выполнение соответствующей последовательности в интерактивном режиме (конечно, без "here-doc") достигает моей цели.

Я подозреваю, что "подача" командных строк на сервер происходит не совсем так, как ожидалось на другом конце линии.

Правильно ли мое предположение? Есть ли способ смягчить эту проблему?

2 ответа2

1

Когда вам нужно написать сценарий интерактивного инструмента командной строки, типичным решением является использование expect(1) .

0

Ради полноты я публикую здесь полное решение «уродливо, но это работает» (с поправками, которые в окончательном виде отправляют электронные письма большему количеству людей, а также предоставляют вложение):

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
cvs_sender=me@mail.org
cvs_recipients=(me@mail.org me@mail.com)
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  

Можно решить поиграть с задержками. И для (что я думаю, может быть) более надежное решение, я бы пошел с expect(1) .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .