7件のコメント

コマンドプロンプトだけでメールを送信する

メール送信の仕組みを知りたい方はこの記事をどうぞ。コマンドプロンプト、バッチファイル等から自動的にメールを送信したい方はこちらをどうぞ。

 

今回は電子メールのお話です。メールはインターネット経由で世界中と送受信できるすばらしい仕組みなのですが、基本的な仕組みはかなりシンプルになっています。それを実感するために、メールクライアントを使用せずに、コマンドプロンプトだけでメールを送信してみましょう。仕組みを体感できますし、トラブルシュートの際にも有効に使えますよ。

ここでは、例として私のgmailのアドレスであるebibibi@gmail.comにメールを送ってみようと思います。(自分のメールアドレスで実験してみてください)

メールサーバーを探す

まずはじめにメールサーバーを探します。メールをどこに送ればとどくか、ということですね。これはDNSにMXレコードとして記述されています。

「set type=mx」として、MXレコードを指定した上で「gmail.com」というドメインのMXレコードを検索します。

image

コマンドの実行結果から以下の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番ポートに接続します。

image

SMTPでのメール送信

接続できたらSMTPプロトコルでメールを送信します。SMTPプロトコルは人間が手でメールを送れるくらいシンプルなものです。

以下の例はRFC的に正しくない部分も含まれていますが、メールの送信自体はできます。まずはまねをして体感してみてください。

image

以下のようにきちんとgmailに届きました。

image

SMTPプロトコルの詳細はRFCで定義されていますので、興味がある人は見てみるとよいでしょう。

かんたんな説明

やり取りの中身をもう少し詳しく見てみます。

まず接続すると相手のSMTPサーバーのバナーが表示されます。

220 mx.google.com ESMTP 5si10391978ywl.28

次にこちらから相手のサーバーに挨拶をします。

helo test

ここで、testの部分には本当は接続元のホスト名を名乗ります。この情報はメールのヘッダにも書かれますし、偽の情報だった場合によってはこの時点で接続を切られてしまうこともあります。

250 mx.google.com at your service

上記のメッセージは相手サーバーからの応答メッセージです。250というのは「成功」を意味する応答コードです。

次にメールの送信元のメールアドレスを名乗ります。

mail from:<ebi@ebi.dyndns.biz>
250 2.1.0 OK 5si10391978ywl.28

ここでは例として私のメールアドレスを書いていますが、もちろん皆さんは皆さん自身の本当のアドレスを記述するようにしてください。

次にメールの受信アドレスを指定します。

rcpt to:<ebibibi@gmail.com>
250 2.1.5 OK 5si10391978ywl.28

ここでは例としてebibibi@gmai.comのみに送ることを指定しているわけです。複数の宛先にメールを送信したい場合には、このrcpt toコマンドを複数回実行しjます。

次にメールデータ本体を送信することを伝えるためにdataコマンドを送ります。

data
354  Go ahead 5si10391978ywl.28

この後で、メールヘッダとボディを入力します。メールヘッダとボディの間には空の行を1行いれて区別し、最後に.のみを入力して終了します。

From:ebi@ebi.dyndns.biz
To:ebibibi@gmail.com
Subject:test mail

This is test mail.
.
250 2.0.0 OK 1239712353 5si10391978ywl.28

最後にquitコマンドで送信を終了します。

quit
221 2.0.0 closing connection 9si2298877yws.35

 

非常に簡単ではありますが、コマンドプロンプトだけでメールを送信することがこれでできるようになりました。もちろん「日本語入力はどうするんだ」「嘘のFromアドレスでも届いちゃったんだけど・・・」など色々と疑問はあるだろうと思います。より詳細に関しては追々書いていきたいと思いますが、まずは、大きな仕組みとして

  1. メールを投げたいドメインのメールサーバーをDNSで調べる
  2. 25番ポートに接続してSMTPでメールを投げる

ということを認識してもらえればと思います。

子供3人。家族優先。都内SIer勤務。Windows系中心のインフラよりの何でも屋。脱原発。 Microsoft MVP for Cloud and Datacenter Management.

7件のコメント

  1. >名無し君
    メールサーバー構築中ですか。メールはとても奥深いものです。正直なところ極めれば、メール関連だけで飯をずっと食べていけると思いますよ。

    楽しみながらがんばってください。

    もしも、何か質問等あれば、いただければ、できる範囲で答えますのでお気軽にどうぞ!

  2. ありがとうございます。
    本を読んでメールサーバを構築している途中です。
    メールだけでもだいぶ奥が深いですね。

  3. >名無し君さん
    コメントありがとうございます。
    その状態ですと、おそらくお使いのネットワーク(プロバイダ)から外部へのメール送信(25番での接続)が禁止されているものと思います。詳細は”Outbound port25 blocking”という単語で検索してみてください。

    残念ですが、このエントリに書かれている内容はお使いのネットワークからはできないようになっていますので諦めてもらうしかないです。

    本来の目的は勉強目的でしょうか?もしもそうであれば、ついでに自分でメールサーバーを構築し、そのサーバーに対してメールをコマンドプロンプトから送信するようなことを試してみると雰囲気がつかめるのではないかと思います。

  4. telnet gmail-smtp-in.l.google.com 25
    とコマンドを打つと、ホストとの接続が切断されました。
    と出ます。
    どうすればいいのでしょうか?
    教えてください。

コメントを残す

メールアドレスが公開されることはありません。