第7回ネットワークプ ログラミング 中村 修 今日のお題 講義 SMTPプロトコル 練習1: telnetを用いてSMTPを体験しよう 練習2: smtp clientを書こう ---------休憩------------------------------- 実習: smtp clientをかっこよくする 練習1で書いたコードを改造して、いろいろな機能 を付加しよう。 SMTP (RFC821) Simple Mail Transfer Protocol 電子メールの配信に用いられるプロトコル TCP 25番ポート センダ レシーバ SMTPサーバ レシーバ SMTPサーバ ファイル (sfc.wide.ad.jp) へ書き込み SMTPクライアント (mail.sfc.keio.ac.jp) SMTP センダ 送信リクエスト入力 (あて先、本文 etc) 人 SMTP インターネット ファイルシステム SMTPクライアント(メールクライアント)は SMTPサーバ(メールサーバ)にアクセスすれば 後はサーバ間で自動的に配信してくれる 但し、運用上IPアドレスによる制限をかける場合が多い メッセージフォーマット: RFC822 ヘッダとボディの二つの部分からなる ヘッダ ボディ 送信の日付(Date)、宛先(To、Cc)、件名(Subject)、送信者アドレス(From) などメッセージの属性に当たる情報を記載する部分 本文を記載する部分 二つの部分の区別は「空行」 例: From: Masaki Minami [email protected] Date: Fri, 30 May 2003 02:36:27 +0900 To: [email protected] Subject: Alphabet Only Cc: [email protected] 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: [email protected] RCPT 受信者のメールアドレスをレシーバに伝える 1つのメッセージに対して100まで指定可能 連続する場合にはRCPT TO: [email protected] のような行は複数に わたって発行する 例: RCPT TO: [email protected] RCPT TO: [email protected] SMTPのコマンド(2) DATA ヘッダ・本文の送信開始を伝える メッセージ終了は「 . 」(ピリオド)のみの行を送信することで 伝えられる 「 . 」(ピリオド)で始まる行がある場合には、センダ側でもう 一つ「 . 」を挿入しなければいけない 例: DATA To: [email protected] 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. DATA メールの内容を終了 ex. RCPT TO: [email protected] メールの内容を開始 ex. MAIL FROM: [email protected] 受信者の決定 HELO hoge.net 送信者の決定 ex. telnet 133.27.4.120 25 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フィールドなど追加 複数の宛先にメールを送るには?
© Copyright 2025 ExpyDoc