140 likes | 364 Views
第 7 回ネットワークプログラミング. 中村 修. 今日のお題. 講義 SMTP プロトコル 練習 1 : telnet を用いて SMTP を体験しよう 練習 2 : smtp client を書こう --------- 休憩 -------------------------------- 実習: smtp client をかっこよくする 練習 1 で書いたコードを改造して、いろいろな機能を付加しよう。. SMTP サーバ (mail.sfc.keio.ac.jp). SMTP サーバ (sfc.wide.ad.jp). 人. センダ. センダ.
E N D
第7回ネットワークプログラミング 中村 修
今日のお題 • 講義 • SMTPプロトコル • 練習1: telnetを用いてSMTPを体験しよう • 練習2: smtp clientを書こう ---------休憩-------------------------------- • 実習: smtp clientをかっこよくする • 練習1で書いたコードを改造して、いろいろな機能を付加しよう。
SMTPサーバ (mail.sfc.keio.ac.jp) SMTPサーバ (sfc.wide.ad.jp) 人 センダ センダ レシーバ レシーバ SMTPクライアント SMTP SMTP ファイルシステム SMTP(RFC821) • Simple Mail Transfer Protocol • 電子メールの配信に用いられるプロトコル • TCP 25番ポート 送信リクエスト入力 (あて先、本文 etc) ファイル へ書き込み インターネット 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の書式 • コマンド<スペース>引数<改行> • 但し:<改行は>CR+LF • なので、コード中では \r\nで表記 • 例:HELO sfc.keio.ac.jp
SMTPのコマンド(1) • HELO • センダがレシーバにセンダ側のホスト名を伝える • 例: 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 • SMTPコネクションを終了 • NOOP • 何もしない • RSET • 処理中のトランザクションを破棄(レシーバ側を初期化) • DATAコマンドを発行する前まで有効 • 1回のSMTPコネクションで複数のメールを送信する際に利用
SMTPのリプライコード • 3桁の数字で始まる文字列が各コマンド毎に必ず返信される • メールクライアントはこのコードで次の処理を考えなければならない • メールサーバは状況にあわせて最低限でもこの3桁の数字だけはメールクライアントに返さなければならない • 2xx • 成功した場合には「2」で始まる3桁の数字を返す • 3xx • DATAコマンドでメッセージ入力OKの意味(継続可を意味) • 4xx、5xx • 失敗またはエラーの場合
SMTP状態遷移 接続待ちうけ connect 接続確立 HELO MAIL FROM待ち受け MAIL FROM RCPT TO待ちうけ RCPT TO ヘッダ情報入力モード:DATA待ちうけ DATA 本文入力モード:QUIT待ちうけ QUIT 終了
練習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: メールクライアントの雛形 • コピーしてコンパイルして使って、読んでみよう。 • 推奨ホスト: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フィールドなど追加 • 複数の宛先にメールを送るには?