telnetでメール送信

しかもシェルスクリプトから…(^_^;


telnet コマンド。
通信を行う上で、避けては通れないコマンドツール。
最近はもっぱら ssh でログインするけれど、Web閲覧やメールのやりとりなど、テキスト(文字列)による対話式の通信を手入力で行いたいときに便利。


で、いくつか検索キーワードでアクセスされることがある様子。
コネタ的だけれど、ツールとして便利なので書いておく。


※ 【前提条件】RedHatLinuxで検証
(SUN SolarisHP-UXだと動かないかも…)

telnetからメール送信する方法

メールは、いまのところ文字列でやりとりする。
RFCで、そういう規格になっている。
そのうち暗号化されるかもだけど…
ということで、telnet コマンドでメールを送る方法がある。

概要
  1. echo コマンドで、手入力する内容を標準出力に流す。
  2. 標準出力から、パイプで telnet に流し込む。

このとき、telnetではメールサーバの25番ポート(smtp)にアクセスする引数を入れておく。

  1. 結果、メールサーバに対して文字列が流れ込み、メールが送付される。


しかしね…
メールサーバによるのか、Linux から Windows 上のメールサーバに流し込んだら、メールが届くときと届かないとき、さらには届いても文字化けしてるときがある。
相手がUNIX(SUN)上のメールサーバだったら、問題なかったのに…(;;

コマンドライン

シェルスクリプトにそのまま引用可能。

(echo "ehlo (メールサーバ名)"; sleep 1
 echo "mail from: (自分のメールアドレス)"; sleep 1
 echo "rcpt to: (相手のメールアドレス)"; sleep 1
 echo "data"; sleep 1
 echo "subject: (メールの件名)"; sleep 1
 echo ""
 echo "以下、メールの内容をつらつら記述..."
 echo "これがメール本文となる。"
 echo ""
 echo "."; sleep 1
 echo ""
 echo "quit") | telnet (メールサーバのホスト名かIPアドレス) 25


sleep をしているのは、メールサーバに送った文字列の反応を待っている。
実際のところ、今発売されてるサーバレベルなら無くても大丈夫だと思う。
反応が返ってきたことをチェックするのが一番賢い実装*1だけど、サーバのヘルスチェック情報を定期的に送るだけなら問題ないはず。
定時に送られてこなかったら「エラーあり」と判断するだけだから。


つか、重要なメールならプロダクトを使うか、きちんとメール送信するプログラムをつくるべき。
上記のスクリプトはメールを送信する必要があるものの sendmail では送信できないという変態的な環境で場当たり的につくったもの。
こんな仕様に誰がした…


こんなでも、MIMEの規格どおりに文字列を追加して uuencode したファイル情報を乗っければ、ファイルの添付もできる。
コーディングがちょっと面倒だけど…

*1:賢い実装というよりは、RFCに準拠した実装