シェルスクリプトを介して Telnet を使用する対話型 SMTP コマンド

シェルスクリプトを介して Telnet を使用する対話型 SMTP コマンド

command.txt上記のように、TelnetとそのSMTPサーバーに送信されたコマンドを含むコマンドファイルを使用して、リモートシェルを介してSMTPリモートサーバーにアクセスしようとします。https://tecadmin.net/ways-to-send-email-from-linux-command-line/#(注:上記のWebサイトではこれは対話的に行われました。)しかし、ここではコマンドファイル(黄色/赤(ユーザー入力)をコピーしました)からコマンドファイルにこれを行いたいと思います。

HELO yahoo.com
mail from: [email protected]
rcpt to: [email protected]
data

Hey
This is test email only

Thanks
.

quit

その後、Alwaysを使用してtelnet IP smtp < command.txt次を返します。

Trying 1.1.65.49...
Connected to 1.1.65.49.
Escape character is '^]'.
Connection closed by foreign host.

そして私が対話するとき:

perlhook@bbis:~/temp_25$ telnet 1.1.65.49 smtp
Trying 1.1.65.49...
Connected to 1.1.65.49.
Escape character is '^]'.
220 miraino-manabi.jp ESMTP Postfix
HELO yahoo.com
250 miraino-manabi.jp
mail from: [email protected]
250 2.1.0 Ok
rcpt to: [email protected]
554 5.7.1 <[email protected]>: Relay access denied
^]
telnet> quit

戻りコードを受け取りました220 250 554

私はまた、次のhere-docシェルスクリプトでそれを試しました。

telnet 1.1.65.49 smtp <<END_SCRIPT
HELO yahoo.com
mail from: [email protected]
rcpt to: [email protected]
data

Hey
This is test email only

Thanks
.

quit
END_SCRIPT

同じ結果が得られます。

この問題を解決し、スクリプトが対話型で動作するようにするにはどうすればよいですか?

ベストアンサー1

telnetさまざまな理由で失敗しました。まず、標準入力にTTYが必要ですが(リダイレクトのため)、TTYがないというstrace関連エラーが見つかると失敗します。telnettelnet

$ strace telnet mx.example.edu 25 < input
...
ioctl(0, SNDCTL_TMR_STOP or TCSETSW, {B0 -opost -isig -icanon -echo ...}) = -1 ENOTTY (Inappropriate ioctl for device)
ioctl(0, SNDCTL_TMR_START or TCSETS, {B0 -opost -isig -icanon -echo ...}) = -1 ENOTTY (Inappropriate ioctl for device)

nc代わりに、ORを使用すると、netcat非対話型転送が依然として問題になる可能性があります。一度に多すぎるデータが送信されるか(リモートサーバーを混乱させる)、サーバーはあまりにも多くのデータを過度に拒否します。 SMTPは対話型会話です。一方が爆弾を爆発させると、他方が遅れたり拒否したりする可能性があります(早すぎる場合はスパム送信者になる可能性があります)。あなたがnc支持--delayし、リモートメールサーバーがあなたを許すなら可能送信できます。

$ strace -s 80 nc --crlf --delay 1 mx.example.edu 25 < input
...
recvfrom(3, "220 mx.example.edu ESMTP OpenSMTPD\r\n", 8192, ...
...
sendto(3, "HELO client.example.edu\r\nmail from: [email protected]\r\n...
...
shutdown(3, SHUT_WR)                    = 0
...
recvfrom(3, "500 5.5.1 Invalid command: Pipelining not supported\r\n",

ここでOpenSMTPDは転送を拒否し、他のサーバー(ここでは表示されていません)から上記の転送を許可します。

実際には、SMTPプロトコルを使用するSMTPクライアントを使用する必要があります。expect https://stackoverflow.com/questions/12320592/telnet-smtp-with-expect-or-shell-scriptそれ以外の場合は、TLS、SMTP AUTH、エラー処理などをサポートするさまざまな言語のさまざまなSMTPライブラリがあります。ここでシェルは良い選択ではありません... ZSHなどのシェルのTCP機能を使用しない限り、「ここで発明されていない」他のSMTPクライアントよりも優れた作業がある可能性があります。

おすすめ記事