メール送信の仕組みを知りたい方はこの記事をどうぞ。コマンドプロンプト、バッチファイル等から自動的にメールを送信したい方はこちらをどうぞ。
今回は電子メールのお話です。メールはインターネット経由で世界中と送受信できるすばらしい仕組みなのですが、基本的な仕組みはかなりシンプルになっています。それを実感するために、メールクライアントを使用せずに、コマンドプロンプトだけでメールを送信してみましょう。仕組みを体感できますし、トラブルシュートの際にも有効に使えますよ。
ここでは、例として私のgmailのアドレスであるebibibi@gmail.comにメールを送ってみようと思います。(自分のメールアドレスで実験してみてください)
メールサーバーを探す
まずはじめにメールサーバーを探します。メールをどこに送ればとどくか、ということですね。これはDNSにMXレコードとして記述されています。
「set type=mx」として、MXレコードを指定した上で「gmail.com」というドメインのMXレコードを検索します。
コマンドの実行結果から以下の5台のメールサーバーが存在していることがわかりました。
- gmail-smtp-in.l.google.com
- alt1.gmail-smtp-in.l.google.com
- alt2.gmail-smtp-in.l.google.com
- alt3.gmail-smtp-in.l.google.com
- alt4.gmail-smtp-in.l.google.com
どのサーバーに送信してもメールは届くはずですが、MX preferenceの値が低いものほど優先的に送信するという決まりになっていますので、ここではMX preferenceがいちばん低い5になっている「gmail-smtp-in.l.google.com」にメールを送ることにします。
メールサーバーへの接続
メールサーバーにメールを送信するにはまずTCPのコネクションを張らなくてはいけません。ポートはSMTPプロトコルの25番ポートです。
telnetコマンドで25番ポートに接続します。
SMTPでのメール送信
接続できたらSMTPプロトコルでメールを送信します。SMTPプロトコルは人間が手でメールを送れるくらいシンプルなものです。
以下の例はRFC的に正しくない部分も含まれていますが、メールの送信自体はできます。まずはまねをして体感してみてください。
以下のようにきちんとgmailに届きました。
SMTPプロトコルの詳細はRFCで定義されていますので、興味がある人は見てみるとよいでしょう。
- http://www.ietf.org/rfc/rfc2821.txt
かんたんな説明
やり取りの中身をもう少し詳しく見てみます。
まず接続すると相手のSMTPサーバーのバナーが表示されます。
次にこちらから相手のサーバーに挨拶をします。
ここで、testの部分には本当は接続元のホスト名を名乗ります。この情報はメールのヘッダにも書かれますし、偽の情報だった場合によってはこの時点で接続を切られてしまうこともあります。
上記のメッセージは相手サーバーからの応答メッセージです。250というのは「成功」を意味する応答コードです。
次にメールの送信元のメールアドレスを名乗ります。
ここでは例として私のメールアドレスを書いていますが、もちろん皆さんは皆さん自身の本当のアドレスを記述するようにしてください。
次にメールの受信アドレスを指定します。
ここでは例としてebibibi@gmai.comのみに送ることを指定しているわけです。複数の宛先にメールを送信したい場合には、このrcpt toコマンドを複数回実行しjます。
次にメールデータ本体を送信することを伝えるためにdataコマンドを送ります。
この後で、メールヘッダとボディを入力します。メールヘッダとボディの間には空の行を1行いれて区別し、最後に.のみを入力して終了します。
最後にquitコマンドで送信を終了します。
非常に簡単ではありますが、コマンドプロンプトだけでメールを送信することがこれでできるようになりました。もちろん「日本語入力はどうするんだ」「嘘のFromアドレスでも届いちゃったんだけど・・・」など色々と疑問はあるだろうと思います。より詳細に関しては追々書いていきたいと思いますが、まずは、大きな仕組みとして
- メールを投げたいドメインのメールサーバーをDNSで調べる
- 25番ポートに接続してSMTPでメールを投げる
ということを認識してもらえればと思います。
(2019/01/29追記) 下記の動画は趣旨は違うのですが、コマンドプロンプトからメールを送信する事自体をしているので参考になると思います。よろしければ御覧ください。