きちんとしたWebサーバやSMTPサーバは不要だが、試験的にサーバへのアクセスまで確認したい場合にPythonやncを使って簡易なサーバを構築する手順メモ。
pyhtonのワンライナーで擬似サーバ構築
pythonのモジュールを使うと簡単に試験サーバが構築できる。
擬似HTTPサーバの場合
なんちゃってHTTPサーバ。アクセスするとサーバのフォルダ一覧を返す。
サーバ側
pythonのhttpモジュールを使って実現。
$ python3 -m http.server 8080 # サーバポートは任意の数値を指定可能
Python2系の場合
$ python -m SimpleHTTPServer 8080
クライアント側
ブラウザやcurlでアクセス。
[~ ]# curl http://[サーバのIP]:8080
擬似SMTPサーバの構築
サーバ側
アクセスする端末を制限しないで、どの端末からでもメールの受け付けを許可する場合の例。ローカルからのアクセスに制限する場合、IP部分をlocalhost
にする。
$ python3 -m smtpd -c DebuggingServer 0.0.0.0:25
クライアント側からのメール送信
その1:mailコマンドで送信
mailがインストールされている場合、シェルから以下の形式で送信可能。
echo "メールメッセージ" | mail -s "Subject" -S smtp=smtp://<サーバIP:ポート> -r <from_user> <to_user>
$ echo "This is a tes mail!" |mail -s "Hello!" -S smtp=smtp://localhost:25 -r from_user@local.domain to_user@abc.com
クライアントからメール送信すると、サーバ側に以下のメッセージが表示される。
# python3 -m smtpd -c DebuggingServer 0.0.0.0:25
---------- MESSAGE FOLLOWS ----------
b'Date: Sat, 30 Jan 2021 04:08:46 +0900'
b'From: from_user@local.domain'
b'To: to_user@abc.com'
b'Subject: Hello!'
b'Message-ID: <60145d3e.QT30D9OKMb04CKyL%from_user@local.domain>'
b'User-Agent: Heirloom mailx 12.5 7/5/10'
b'MIME-Version: 1.0'
b'Content-Type: text/plain; charset=us-ascii'
b'Content-Transfer-Encoding: 7bit'
b'X-Peer: 127.0.0.1'
b''
b'This is a tes mail!'
------------ END MESSAGE ------------
ちなみにメール本文に日本語を入れると文字化けした。なんか設定あるのかな?
$ echo "日本語" |mail -s "Hello!" -S smtp=smtp://localhost:25 -r from_user@local.domain to_user@abc.com
(一部省略)
b'Content-Type: text/plain; charset=utf-8'
b'Content-Transfer-Encoding: 8bit'
b'X-Peer: 127.0.0.1'
b''
b'\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e'
------------ END MESSAGE ------------
その2:pythonスクリプトで送信
mailコマンドが使えない場合Pythonスクリプトで対応。ベタなスクリプト例は以下。
import smtplib
from email.mime.text import MIMEText
# メール送信に必要な情報を定義
from_user = 'from_user@local'
to_user = 'to_user@abc.com'
subject = 'Hello!'
message = 'Hello, World!\nThis is a test mail\n'
smtp_sv = 'localhost'
# 情報を詰め込む
msg = MIMEText(message)
msg['Subject'] = subject
msg['From'] = from_user
msg['To'] = to_user
# 送信
server = smtplib.SMTP(smtp_sv)
server.sendmail(from_user, [to_user], msg.as_string())
server.quit()
これを実行すると、mailコマンド同様の結果がサーバに出力される。
$ python3 send_mail.py
ncコマンドを使って擬似サーバを構築
もしnmapが利用可能ならncコマンド
を利用して擬似サーバを立てる。
ncコマンドで擬似サーバを立てた場合、クライアントとサーバで接続を確立するところまでなので、httpやsmtp処理はできず、クライアントもしくはサーバで入力した文字列がそのまま相手先に出力されるだけだが、ルーティングとポートの確認をするだけならこれで十分。
$ nc -kl 8081 #ポート番号は任意
ちなみにkオプションつけると複数クライアントからの受付を可能とする。
続いてクライアントからサーバにアクセスして文字列を投入する。
$ nc <サーバIP> 8081
Hello!
$ nc -kl 8081
Hello! #クライアントからの入力した文字列がサーバ側に表示される
クライアントからcurlコマンドでアクセスしても、サーバ側で何かしてくれるわけでなく、単にメッセージを表示するだけ。
$ curl http://<サーバIP>:8081
$ nc -kl 8081
Hello!
GET / HTTP/1.1 #クライアントからのHTTPリクエストをそのまま表示するだけ
Host: ap01:8081
User-Agent: curl/7.64.1
Accept: */*