RFC2822について - メールヘッダー解析ルーチンの作成

このQ&Aのポイント
  • RFC2822をみて、メールヘッダーの解析ルーチンを作っています。コンパイラコンパイラにかけるために以下のように書き直しました。
  • boundary=をターミナルとして扱わないばかりか、上の語句は現れないのです。ヘッダー解析だから必要なくて、bodyの解析では別途必要となるのでしょうか?
  • RFC2822についてのルールとして、メールの本文を含むメッセージを解析する際、メールヘッダーのフィールドとボディを分けて取得することが必要です。
回答を見る
  • ベストアンサー

rfc2822について

RFC2822をみて、メールヘッダーの解析ルーチンを作っています。 コンパイラコンパイラにかけるために 以下のように書き直しました。 ふと気がついたのですが boundary= をターミナルとして扱わないばかりか 上の語句は現れないのです。 ヘッダー解析だから必要なくて body の解析では 別途必要となるのでしょうか? RULES EMail = message. message = (fields ) [CRLF body]. body = {({text} CRLF)} {text}. fields = {(trace {(resentdate | resentfrom | resentsender | resentto | resentcc | resentbcc | resentmsgid)})} {(origdate | from | sender | replyto | to | cc | bcc | messageid | inreplyto | references | subject | comments | keywords | optionalfield)}. 以下省略 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.1

boundaryってMIMEでマルチパートを分割するための境界を指定するものですよね。 optionalfield扱いで具体的な内容は他のRFCに記述しているんじゃありませんか。

uyama33
質問者

補足

ありがとうございます。 確かに他のRFCがあるようです。 ところで、 optionalfield は X-mailer の項目などをさすと理解している のですが、誤りでしょうか?

その他の回答 (1)

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.2

optionalfieldのフィールド名については「SP とコロンとを除く印刷可能な US-ASCII 文字から成る」「optional-field のフィールド名は、この標準で規定されている他のフィールド名と同じであってはならない(MUST NOT)。」以上のことは記載されていません。 X-で始まるものだけがオプションではないと思います。 X-で始まる名称とそうでない名称については、一般的には前者が標準になる前の実験的なもので使う名称で、後者は標準化された名称です。

参考URL:
http://srgia.com/docs/rfc2822j.html
uyama33
質問者

お礼

ありがとうございました。 試しながら 調べてゆきます。

関連するQ&A

  • 拡張BNF文法 メールヘッダー

    メールヘッダーの解析をするための 道具を作っています。 3.7 Specific Repetition nRule A rule of the form: <n>element is equivalent to <n>*<n>element That is, exactly <N> occurrences of <element>. Thus 2DIGIT is a 2-digit number, and 3ALPHA is a string of three alphabetic characters. という説明が rfc2234 にあり、 body = *(*998text CRLF) *998text をコンパイラコンパイラという本のBNF文法で書き換えるのですが、 998text の部分は、 text text ... text (998回) と書くしかないのでしょうか? それとも、 {text} と書いてしまって、 後で長さのチェックをするのが現実的なのでしょうか? アドバイスをお願いします。

  • PHP Windows版のmail()を使用して添付ファイルを送りたい

    はじめて、質問させていただきます。 環境はWindowsXP(Pro)+IIS+PHPです。 PHPのmail()関数を使用して、添付ファイルをメールで送信したいと考えております。 mail("-----@co.jp",$subject,$msg,$headers);を実行します。 $headersは、追加ヘッダということになっています。 $boundary="-*-*-*-*-*-*-*-*-*-Boundary_".uniqid("b"); とセットし、 $headersには、 $headers=Content-Type:multipart/mixed; $headers.=boundary=$boundary; として、実行します。 送られてきたメールのヘッダの内容を確認すると 「Content-Type」が、 Content-Type:text/plain; となってしまいます。 mail()関数のヘッダの指定方法は、これでいいのでしょうか? 実際のコードは、メッセージ部分などいろいろ書き込んでいます。いろいろ書き換えて実験してみましたが、どうも、この問題をクリアできないと添付ファイルメールを送信することができないようです。 ご存知の方があれば、教えていただきたいです。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • 英語の受信メールが文字化けします

    gooのフリーメールを利用しています。 その友人とは何度かメール交換をしていて、今まで文字化けしたことがなかったのですが、突然本文が文字化けするようになりました。件名はちゃんと英語で表示されています。ヘッダの情報を一部載せます。 X-Mailer: Atlas Mailer 2.0 X-AOL-IP: 64.171.177.234 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: base64 base64では最後に“=”がつくと、あるサイトで見ました。そのとおり“=”がついています。 エンコードでヨーロッパ言語などを試してみましたが、うまくいきませんでした。今までは違うヘッダで送られてきてはいたのですが、 それは以下のようなはヘッダです。 Content-Type: multipart/alternative; boundary="part1_1e4.ee8fdd5.2c7d1b26_boundary" X-Mailer: 8.0 for Windows sub 910 とにかくなんとしてでも解読したいのんです。誰か教えてください!

  • Ruby CGI HTTPヘッダ

    Rubyで、 CGIがクライアント(ブラウザ等)から受けたHttpリクエストヘッダとその値を全て取得して表示したいです。(どのようなヘッダが付与されても) 以下を例に教えてください。 #!/usr/bin/ruby require 'cgi' cgi = CGI.new puts "Content-Type:text/html\n\n" puts "<html>\n" puts "<body>\n" #ここにどのように書いたら良いですか? puts "</body></html>\n"

  • 画像ファイルの受信

    ブラウザのフォームから送られたファイルデータを読み取り、保存するプログラムを作成しています。 socket() bind() listen() accept() を用いてブラウザから届いたマルチパートデータ(以下のような) ヘッダ ~ -----------------------------boundary Content-Disposition: form-data; name="~"; filename="~" Content-Type: text/plain ファイル内容 -----------------------------boundary をrecvして、そこからファイル内容を取り出すという方法を考えていたのですが、画像ファイルを受信するとrecvが途中で止まってしまいます。textファイルでの動作は確認しました。 他の方法でも結構ですので、ブラウザから画像ファイルを受信できる方法を伝授いただけるとありがたいです。

  • HTTPのメッセージボディについて質問です。

    HTTPのメッセージボディについて質問です。 決済代行会社との接続で悩んでいます。 要求した決済の結果を、 「ヘッダに「content-type : text/plain;charset=Shift_JIS」、メッセージボディの1、2行目に以下の文字列を返します。」 とあり、 CHECK:OK SID=xxxxxx GOUKEI=nnnnnn や CHECK:NG SID=xxxxxxx (2行目もある場合あり) と仕様書に書いてあります。 どのようにしたら、この中から、CHECK: の結果がNGかOKか、や、SIDの番号や、GOUKEIの額を取り出すことが出来るのでしょうか? mb_・・・・ と色々な関数があるかと思いますが、どのようにしたら、HTTPのメッセージボディの1行目を検索文字列「str」に代入することができるのでしょうか? 自分がHTTPについてあまり理解していなく、知識不足だと思いますが、どなたかご教授お願いします。

    • ベストアンサー
    • PHP
  • PCからデコメ送信

    初心者です、よろしくお願いします。 PCから携帯にデコメールを送ろうとしているのですが、HTMLメール自体は送れるのですが、画像をインラインで表示したい時の記述がわかりません。 <?php /* 送信先 */ $to = "hoge@hoge.com"; /* 題名 */ $subject = "HTML MAIL"; /* メッセージ */ $message = ' <html> <head> <title>テスト</title> </head> <body> <h1>テスト</h1> </body> </html> '; /* ヘッダー */ $headers = "MIME-Version: 1.0\r\n"; $headers .= "Content-type: text/html; charset=iso-2022-jp\r\n"; $headers .= "Content-Transfer-Encoding: 7bit\r\n"; $headers .= "From: hoge@hoge.com\r\n"; mail($to, $subject, $message, $headers); ?> 過去の質問にあったソースを参考にして、色々と試したり、docomoのサイトを見たりしたのですが、まったくわかりません。 boundaryの指定や、content-typeをmultipart/relatedにしなくてはいけない等、疑問に思う事はあるのですが、どうしていいかがよくわかりません。 未熟者なので、ご助力よろしくお願いします。

    • 締切済み
    • PHP
  • FireFox、Operaで出力するとhtmlソースが出てしまう

    http://oshiete1.goo.ne.jp/kotaeru.php3?q=554339 を読んだのですが、きちんと text/htmlで出力しているにも関わらず、FireFox、Operaで開くとhtmlソースが出てしまいます。 (win IE、Mac Safariではhtmlとして(きちんと)開かれる) ソースは以下の通りです。 (テスト用で必ずエラーページを出力するようになっています。) --------------------- #!/usr/local/bin/perl require 'cgi-lib.pl'; require 'jcode.pl'; &ReadParse(*form); $userID = "$form{'id'}"."\n"; open(KEIJI,"<id.dat") || die "File Open Error"; @all = <KEIJI>; close(KEIJI); foreach(@all){ #ワードを配列に追加 push @wordList,$_; } $messageID = 0; foreach(@wordList){ if($userID eq $_){ $messageID = $count; last; } $count = $count + 1; } if($messageID eq 0){ &error_output; exit; } sub error_output{ print "Contest-type:text/html\n\n"; print << "EOM"; <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>404 Not Found</title> </head><body> <h1>Not Found</h1> <p>The requested URL was not found on this server.</p> </body></html> EOM } ------------------------ 要は「このファイルはhtmlです」とプラウザーに 伝えれればいいとは思うのですが、もしお分かりの 方がいらっしゃいましたら、教えていただければ ありがたいです。 よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • ブログ内の空白を削除したい

    ブログ内のタイトル画像とその下のラインの間の空白が1行程度空いており、その空白をどうしても埋めたいのですが、テンプレートをいじってもなかなか上手く行きません。テンプレートは以下のような記述になっています。是非ご教授ください。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://※※.dtd"> <html lang="ja"> <head> <meta http-equiv="content-type" content="text/html; charset=euc-jp"> <meta http-equiv="Content-Style-Type" content="text/css"> <meta http-equiv="content-script-type" content="text/javascript"> <link href="<%css_link>" type="text/css" rel="stylesheet"> <link rel="alternate" type="application/rss+xml" title="RSS" href="<%url>?xml"> <title><%blog_name> <%sub_title></title> </head> <body> <!--アクセス解析タグ ここから--> <script language="JavaScript" src="http://※※※"></script><noscript><div align="right"><a href="http://※※※/" target="_blank">アクセス解析</a></div></noscript> <!--アクセス解析タグ ここまで--> <a name="top"></a> <div class="container"> <!-- ヘッダー部 ここから --> <IMG SRC="http://※※※.jpeg" width="※" height="※" alt="※.jpg" border="0"></a></h1> <div class="banner"> <div class="banner_title"> <h2 class="intro"><%introduction></h2> </div> </div> <!-- ヘッダー部 ここまで --> <!-- 左メニュー ここから -->

  • phpでのメール転送(添付ファイルつき)について

    目的: phpにて、添付付きメールを、件名だけ変更して、添付ファイルごと外部へ転送する。 現在、メール受信したものを、mysqlに保存(UID、件名、送信元メールアドレス(一致したものを、指定の件名に変更)、送信日、受信日、本文)、 添付ファイルはサーバー上に保存し、 メール送信時に、サーバー上に保存した添付ファイルとmysqlのデータを読み込み、送信しています。 (添付ファイルは、定期的に削除) これを、もっと簡潔に出来ないでしょうか。 サーバー上に添付ファイルを残さないで済み、 未受信のメールのみ 1画面上で、添付メールごと転送できるのが理想です。 ※mysqlへの保存は、あってもなくてもかまいません。 以下が、現在の状態です。 参考にしたのは、こちらのサイトです。 http://hal456.net/qdmail_rec/top http://www.favorite-labo.org/view/202 ※サーバはCPIです。 **メール受信処理** <?php // QdmailReceiver呼び出し require_once('qdmail_receiver.php'); //POPサーバー(受信サーバー)にアクセスするための初期設定。 $server = array( 'protocol'=>'pop3', 'host'=>'(ホスト名)', 'user'=>'(ユーザー名)', 'pass'=>'(パスワード)', ); qd_receive_mail( 'start' , $server , 'eucJP-win' ); //オブジェクト指向モードでの初期化 $receiver = QdmailReceiver::start( 'pop' , $server); for($i = 1 ; $i <= $receiver->count() ; $i++){ $todaydata = date("Y-m-d"); // *************** メールデータ取得処理 *************** $pointer = $receiver->pointer(); // pointer $popuid = $receiver -> header( 'popuid' );// UID $subject_name = mb_convert_encoding(($receiver->header( array('subject','name') , 'none' )),"Shift-JIS","auto");//件名 $from_mail = $receiver->header( array('from','mail') , 'none');//送信元メールアドレス $date = $receiver -> header('date');//送信日 $text = mb_convert_encoding(($receiver->text()),"Shift-JIS","auto");//本文 // *************** UID照合処理 *************** include '(mysql接続)'; $ii=0; while ($row = mysql_fetch_assoc($result)) { $ii++; } if($ii == 0){ // *************** 転送前データの保存 *************** include '(mysql接続)'; // *************** 添付ファイル保存 *************** $attach = $receiver->attach(); foreach($attach as $att){   $moji = mb_convert_encoding($att['filename'],"Shift-JIS","auto"); $fp=fopen($moji,'w'); fputs($fp,$att['value']); fclose($fp); } }else{ print('取得済みにつき未処理'); } ?> **メール送信** <?php //マイムタイプ定義 $mime_content_types = array( 'ez' => 'application/andrew-inset', 'atom' => 'application/atom+xml', 'atomcat' => 'application/atomcat+xml', ~略~ 'avi' => 'video/x-msvideo', 'movie' => 'video/x-sgi-movie', 'ice' => 'x-conference/x-cooltalk' ); //送信先メールアドレス $to = '(送信先メールアドレス)'; //送信元メールアドレス $from = '(取得した送信元メールアドレス)'; //件名 $subject = '(変更した件名)'; //メール本文 $message = (取得した本文); //添付ファイル $files = array('(添付ファイル1へのパス)','(添付ファイル2へのパス)…以下、あるだけ'); //件名・本文をエンコード $subject = mb_convert_encoding($subject, 'JIS', 'Shift-JIS'); $message = mb_convert_encoding($message, 'JIS', 'Shift-JIS'); $subject = '=?iso-2022-jp?B?' . base64_encode($subject) . '?='; //バウンダリ文字列を定義 if (empty($files)) { $boundary = null; } else { $boundary = md5(uniqid(rand(), true)); } //メールボディを定義 if (empty($files)) { $body = $message; } else { $body = "--$boundary\n"; $body .= "Content-Type: text/plain; charset=\"iso-2022-jp\"\n"; $body .= "Content-Transfer-Encoding: 7bit\n"; $body .= "\n"; $body .= "$message\n"; foreach($files as $file) { if (!file_exists($file)) { continue; } $info = pathinfo($file); $content = $mime_content_types[$info['extension']]; $filename = basename($file); $body .= "\n"; $body .= "--$boundary\n"; $body .= "Content-Type: $content; name=\"$filename\"\n"; $body .= "Content-Disposition: attachment; filename=\"$filename\"\n"; $body .= "Content-Transfer-Encoding: base64\n"; $body .= "\n"; $body .= chunk_split(base64_encode(file_get_contents($file))) . "\n"; } $body .= '--' . $boundary . '--'; } //メールヘッダを定義 $header = "X-Mailer: PHP5\n"; $header .= "From: $from\n"; $header .= "MIME-Version: 1.0\n"; if (empty($files)) { $header .= "Content-Type: text/plain; charset=\"iso-2022-jp\"\n"; } else { $header .= "Content-Type: multipart/mixed; boundary=\"$boundary\"\n"; } $header .= "Content-Transfer-Encoding: 7bit"; //メール送信 if (mail($to, $subject, $body, $header)) { echo 'メールが送信されました。'; } else { echo 'メールの送信に失敗しました。'; } ?> 以上、よろしくお願いします

    • ベストアンサー
    • PHP

専門家に質問してみよう