第7回NP資料 SMTPクライアントを作ろう

第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フィールドなど追加
 複数の宛先にメールを送るには?