第7回ネットワークプログラミング 中村 修
今日のお題 講義 ---------休憩-------------------------------- SMTPプロトコル 練習1: telnetを用いてSMTPを体験しよう 練習2: smtp clientを書こう ---------休憩-------------------------------- 実習: smtp clientをかっこよくする 練習1で書いたコードを改造して、いろいろな機能を付加しよう。
SMTP (RFC821) Simple Mail Transfer Protocol 電子メールの配信に用いられるプロトコル TCP 25番ポート 送信リクエスト入力 (あて先、本文 etc) センダ レシーバ センダ レシーバ 人 SMTPサーバ (mail.sfc.keio.ac.jp) SMTPサーバ (sfc.wide.ad.jp) ファイル へ書き込み SMTPクライアント SMTP SMTP インターネット ファイルシステム SMTPクライアント(メールクライアント)は SMTPサーバ(メールサーバ)にアクセスすれば 後はサーバ間で自動的に配信してくれる 但し、運用上IPアドレスによる制限をかける場合が多い
メッセージフォーマット: RFC822 ヘッダとボディの二つの部分からなる 二つの部分の区別は「空行」 ヘッダ ボディ 例: 送信の日付(Date)、宛先(To、Cc)、件名(Subject)、送信者アドレス(From) などメッセージの属性に当たる情報を記載する部分 ボディ 本文を記載する部分 二つの部分の区別は「空行」 例: From: Masaki Minami minami@wide.ad.jp Date: Fri, 30 May 2003 02:36:27 +0900 To: masaki@minami.org Subject: Alphabet Only Cc: np-staff@minami.org X-Mailer: MyMailClient v0.01
SMTPの書式 コマンド<スペース>引数<改行> 例:HELO sfc.keio.ac.jp 但し:<改行は>CR+LF なので、コード中では \r\nで表記 例:HELO sfc.keio.ac.jp
SMTPのコマンド(1) HELO MAIL RCPT センダがレシーバにセンダ側のホスト名を伝える 例: HELO zux000.sfc.keio.ac.jp MAIL センダが送ろうとしている送信者のメールアドレスをレシーバに伝える 例: MAIL FROM: osamu@sfc.keio.ac.jp RCPT 受信者のメールアドレスをレシーバに伝える 1つのメッセージに対して100まで指定可能 連続する場合にはRCPT TO: foo@bar.net のような行は複数にわたって発行する 例: RCPT TO: kaizaki@sfc.keio.ac.jp RCPT TO: irino@sfc.keio.ac.jp
SMTPのコマンド(2) DATA ヘッダ・本文の送信開始を伝える メッセージ終了は「 . 」(ピリオド)のみの行を送信することで伝えられる 「 . 」(ピリオド)で始まる行がある場合には、センダ側でもう一つ「 . 」を挿入しなければいけない 例: DATA To: osamu@sfc.keio.ac.jp Subject: Test ここから本文…. .
SMTPのコマンド(3) QUIT NOOP RSET SMTPコネクションを終了 何もしない 処理中のトランザクションを破棄(レシーバ側を初期化) DATAコマンドを発行する前まで有効 1回のSMTPコネクションで複数のメールを送信する際に利用
SMTPのリプライコード 3桁の数字で始まる文字列が各コマンド毎に必ず返信される 2xx 3xx 4xx、5xx メールクライアントはこのコードで次の処理を考えなければならない メールサーバは状況にあわせて最低限でもこの3桁の数字だけはメールクライアントに返さなければならない 2xx 成功した場合には「2」で始まる3桁の数字を返す 3xx DATAコマンドでメッセージ入力OKの意味(継続可を意味) 4xx、5xx 失敗またはエラーの場合
SMTP状態遷移 接続待ちうけ connect 接続確立 HELO MAIL FROM待ち受け MAIL FROM RCPT TO待ちうけ ヘッダ情報入力モード:DATA待ちうけ DATA 本文入力モード:QUIT待ちうけ QUIT 終了
練習1: SMTPを話してみよう! 挨拶 コマンドラインでメールを送る SMTPポートにアクセス 送信者の決定 受信者の決定 練習1: SMTPを話してみよう! コマンドラインでメールを送る SMTPポートにアクセス ex. telnet 133.27.4.120 25 挨拶 HELO hoge.net 送信者の決定 ex. MAIL FROM: hoge@hoge.net 受信者の決定 ex. RCPT TO: kaizaki@sfc.keio.ac.jp メールの内容を開始 ex. DATA メールの内容を終了 ex. . メールの送信 ex. QUIT
練習2: メールクライアントの雛形 コピーしてコンパイルして使って、読んでみよう。 練習2: メールクライアントの雛形 コピーしてコンパイルして使って、読んでみよう。 推奨ホスト:zux???.sfc.keio.ac.jp ソースコード中のメールアドレスを自分のメールアドレスに変更しよう コードは以下にあります /home/kaizaki/osamuNP/7/smtpclient_sample.c
練習2:ポイント connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)); strnum = sizeof(sendmessage) / sizeof(char *) ; for (i = 0; i < strnum; i++){ if( write(sockfd, sendmessage[i], strlen(sendmessage[i])) < 0){ perror("write()"); continue; }
実習:SMTPクライアント作成 練習2のsmtpクライアントは最低限の機能しかありません。 改造して格好よくしましょう。 必須事項 MAIL FROM, RCPTなどコマンドラインから入力 SUBJECTなど入力できるように オプション 本文をファイルから読み込む IPv6でも使える X-MAILERフィールドなど追加 複数の宛先にメールを送るには?