MIME emlの解析に関して

このQ&Aのポイント
  • Perlを使用して、emlファイルから本文(htmlとplain)を取得する方法について困っています。
  • 現在はEmail::MIMEライブラリを使用しており、入れ子構造の取得が上手くいきません。
  • 解決方法や他のやり方について教えていただけると助かります。
回答を見る
  • ベストアンサー

MIME emlの解析に関して

Perlにて、 emlの本文(htmlとplain)の取得をしたいです。 ライブラリとして、 Email::MIME を使用しております、現在以下の様な感じです。 my $parsed = Email::MIME->new($text); for my $part ($parsed->parts) { if($part->{ct}{discrete} !~ /^text/){ }elsif($part->content_type =~ m|text/html|){ #html }else{ #plain } この状態で$part->body_strや$part->bodyで取得が可能かと考えておりましたが、 emlにて入れ子構造が上手く取得出来ず、困っております。 やり方等、如何様でも構いませんので、ご指摘頂ければ幸いで御座います。 sampleのEML※サンプルなのでhtmlはhtml形式になっておりません。 \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ Return-Path: <test@test.jp> X-Original-To: test@test.jp Delivered-To: test@test.jp X-Env-Sender: test@test.jp Date: Wed, 7 Dec 2011 02:48:11 -0600 (CST) From: <test@test.jp> To: test@test.jp Subject: =?UTF-8?B?dGVzdA==?= =?UTF-8?B?dGVzdA?= =?UTF-8?B?dGVzdA?= =?UTF-8?B?dGVzdA==?= Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_33646_1423332566.1323247678520" ------=_Part_33646_1423332566.1323247678520 Content-Type: multipart/alternative; boundary="----=_Part_33649_2021685376.1323247678532" ------=_Part_33649_2021685376.1323247678532 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: base64 dGVzdA == ------=_Part_33649_2021685376.1323247678532 Content-Type: text/html;charset=UTF-8 Content-Transfer-Encoding: base64 dGVzdA== ------=_Part_33649_2021685376.1323247678532-- ------=_Part_33646_1423332566.1323247678520-- \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

  • Perl
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • Wap58
  • ベストアンサー率33% (29/87)
回答No.1

モジュールを有効に使えれば良いでしょうが plain入れ子ならベタにテキスト処理など plainは本体のみ、それ以外はヘッド込みになります メーラーの仕様、知らないのでヘッドは工夫して下さい テキストのみのemlはpack('c',27)置換して use strict; my(@plain_1,@html_1,$an_1); open $an_1,'hoge.eml' or print"$!\n"; while(<$an_1>){ if($_ =~ m|text/plain|){ while(<$an_1>){ ($_ !~ m|text/html|) ? push @plain_1,$_:last; }} push @html_1,$_; } print"plain\n @plain_1"; print"html\n @html_1"; __END__

関連するQ&A

  • multipart/MIMEパーサ-

    multipart/MIMEのパーサー探しています。 探し方よくないか、理解できないか、どうも混乱しています。 読みたいファイルのヘッダー情報格納されている部分はContent-Type: text/xml;UTF-8式になっていて、IEEE754/float式で格納されている部分(バイナリ部分)はContent-Type: application/octet-streamになっています。 バイナリデータとヘッダー情報の間、--MIME_boundary-2などで区別されています。 上記なようなファイルをJavaでどうやって読むのでしょうか? DataInputStream使って一つバイトづつ読んで又いろいろString処理してやろうと思ってたのですが、非常に時間かかって(それでもまだ成功していないですが)ものにならない。 既存のパーサーあるはずとの思い強い。 以前、ここで少し教えてもらったことありますが、ググってもどのクラスを使うのか分かりません。 Java標準にはそのようなライブラリーはなさそうですが。。 ググって見つかったのはIBM/Lotus ソフトウェアのMIME Entity クラス。これって、「proprietary」ではないかな。もちろんjavaみたいなフリーライブラリーがほしいんです。 もう一つ見つかったのはmime4j.使い方今から調べます。 multipart/MIME扱い経験ある方々、教えてください。 とりあえず、キーワード見つかって、ネットで見つかったら読んで、理解できるのかみてみたいです。 よろしくお願いします。

  • MIMEタイプってなぜあるんですか?

    MIMEタイプっていらない子なんじゃないんですか? MIMEタイプはファイルのデータ型をクライント(WEBブラウザ)教えるのが役割のようですが、 これって拡張子で十分なんじゃ・・・・? 例えば.htmlなら誰もがHtmlファイルなんてわかるわけだし わざわざMIMEタイプいらないんじゃ? HTMLのメタタグには <meta http-equiv="content-type" content="text/html; charset=utf-8" /> なんて、わざわざMIMEタイプ宣言する部分があるし、 なぜMIMEタイプが必要なのでしょうか?

  • メールの文字化け

    こんにちわ。 友人からメールが送られてきたのですが、 「縺繝」のような中国文字?になっていて、読めません。 どうすれば読めますか。 私の環境はXP,メールソフトはHotMailです。 またそのメールの中に下記メッセージがありました。 This is a multi-part message in MIME format. --Boundary_(ID_lC5MDYXuWT2b2Ow6cpm90w) Content-type: text/plain; charset=utf-8 Content-transfer-encoding: 8BIT よろしくお願いします。

  • Perlでのメール本文の解析について

    ここで一週間も止まっています、どなたか助けてください。 あるサーバーにたまっているメールを受信して Net::POP3; MIME::Parser; などを利用して本文を取り出したりしています。 件名などはきちんと解析できて日本語にできるのですが、どうしても本文だけはどうなっているのかわかりません。エンコード、デコードなどの説明が書いてあるサイトをたくさんみて200回くらいいろんな方法やパターンを試してみて本文を復元しようと試みましたが 「$B$^$7$m?'%7%s%U%)%K!<$N%Q%s$K$c(B」の文字は何も変わることなく、さすがに気が狂いそうになりましたのでここで質問しようとおもいます。 emlで保存したファイルから本文を取り出すことはできますが、読める状態になりません。 どなたか教えていただけないでしょうか? いったい、どうしたらメールの本文をきちんと読める状態にできるのしょう? ========================= Subject: =?ISO-2022-JP?B?GyRCJF4kNyRtPyclNyVzJVUlKSVLITwbKEI=?= To: test@test.com Status: RO X-UIDL: 1358842469.4950.s323,S=1722 Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit $B$^$7$m?'%7%s%U%)%K!<$N%Q%s$K$c(B

    • ベストアンサー
    • Perl
  • Eudora-Jで着信してしまったメール

    Eudora-J で着信してしまったメールが HTMLコードを含むもので一部文字化けしていて読めません。 マシンは、OS9で動いているもの、OS 10.4で動いているものの 二台があります。どうやったら読めるようになるでしょうか? メールの先頭には以下のようにかかれています This is a multi-part message in MIME format. ------msg_border Date: Tue, 21 Feb 2006 04:10:33 -0800 Content-Type: multipart/alternative; boundary="----alt_border_1" ------alt_border_1 Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: quoted-printable

    • ベストアンサー
    • Mac
  • MIMEヘッダ

    こんにちは。質問をさせてください。 今、PHPのsendmail関数を使用してHTMLメール・テキストメールを送信しようと考えています。 ------------------------------------------------ ### メールの送信 open MAIL, "|/usr/sbin/sendmail -f "****@aaa.co.jp" "****@bbb.co.jp""; ### 全体のヘッダ print MAIL "MIME-Version: 1.0\n"; print MAIL "Content-Type: Multipart/Mixed; boundary=\"--=kuguri\"\n"; print MAIL "Content-Transfer-Encoding:Base64\n"; print MAIL "From: $from\n"; print MAIL "To: $to\n"; print MAIL "Subject: $subject\n"; ### テキストメール本文のパート print MAIL "--=kugiri\n"; print MAIL "Content-Type: text/plain; charset=\"ISO-2022-JP\"\n"; print MAIL "\n"; print MAIL "HELLO\n"; ### HTMLメール本文のパート print MAIL "--=kugiri\n"; print MAIL "Content-Type: text/html;\n"; print MAIL "\n"; print MAIL "<html><body>\n"; print MAIL "<font color="red">HELLO</font>\n"; print MAIL "</body></html>\n"; ### マルチパートのおわり。 print MAIL "--"\kugiri"\" . "--\n"; close MAIL; 上記のような記述の場合、受信側のメーラが HTML設定の時は、"HELLO(赤色)" TEXT設定の時は、"HELLO(黒色)"で受信しますでしょうか? スクリプトの抜粋でわかりにくいと思いますが、宜しくお願い致します。

  • S/MIMEでの署名

    RFCのサンプルは次のようになっていました。 Content-Type: multipart/signed; protocol="application/pkcs7-signature"; micalg=sha1; boundary=boundary42 --boundary42 Content-Type: text/plain This is a clear-signed message. --boundary42 Content-Type: application/pkcs7-signature; name=smime.p7s Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=smime.p7s ghyHhHUujhJhjH77n8HHGTrfvbnj756tbB9HG4VQpfyF467GhIGfHfYT6 4VQpfyF467GhIGfHfYT6jH77n8HHGghyHhHUujhJh756tbB9HGTrfvbnj n8HHGTrfvhJhjH776tbB9HG4VQbnj7567GhIGfHfYT6ghyHhHUujpfyF4 7GhIGfHfYT64VQbnj756 --boundary42-- ここでは、 This is a clear-signed message. に対する署名が、 ghyHhHUujhJhjH77n8HHGTrfvbnj756tbB9HG4VQpfyF467GhIGfHfYT6 4VQpfyF467GhIGfHfYT6jH77n8HHGghyHhHUujhJh756tbB9HGTrfvbnj n8HHGTrfvhJhjH776tbB9HG4VQbnj7567GhIGfHfYT6ghyHhHUujpfyF4 7GhIGfHfYT64VQbnj756 ということでしょうか? 日本語を扱う場合は、 エディターのデータではなくて、送信直前のバウンダリーで囲まれたデータに対して 署名がなされる。 と理解してよろしいでしょうか? さらに、添付ファイルがつく場合には、 Content-Type: multipart/mixed; boundary=bar --bar Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable =A1Hola Michael! How do you like the new S/MIME specification? It's generally a good idea to encode lines that begin with From=20because some mail transport agents will insert a greater- than (>) sign, thus invalidating the signature. Also, in some cases it might be desirable to encode any =20 trailing whitespace that occurs on lines in order to ensure =20 that the message signature is not invalidated when passing =20 a gateway that modifies such whitespace (like BITNET). =20 --bar Content-Type: image/jpeg Content-Transfer-Encoding: base64 iQCVAwUBMJrRF2N9oWBghPDJAQE9UQQAtl7LuRVndBjrk4EqYBIb3h5QXIX/LC// jJV5bNvkZIGPIcEmI5iFd9boEgvpirHtIREEqLQRkYNoBActFBZmh9GC3C041WGq uMbrbxc+nIs1TIKlA08rVi9ig/2Yh7LFrK5Ein57U/W72vgSxLhe/zhdfolT9Brn HOxEa44b+EI= --bar-- それぞれの部分に対して、署名をつくり、 結果として、 さらに2つの署名がくっついているメールを送信する と理解してよいのでしょうか? よろしくお願いします。

  • 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
  • 文字化けメールとdat添付書類について

    windows XP でOutlook Expressを使用しています。 Outlook Expressをメーラーとしてあんまり使用したくないのですが、プロバイダーがAOLなので仕方なくOutlook Expressで受信しています。 今まで正常に仕事先からlzh添付ファイルを受信出来ていたのですが、先日添付ファイルが「・・・lzh.dat」となっていて圧縮されたデーターを解凍するとテキストデーターが文字化けで入っていました。 もう一台のPCの違うメーラーで受信しても添付ファイルは削除されているものの文字化けは同じ状態でした。 これは相手がhtml形式で送信しているからでしょうか? それとウィルスが入ってしまっているのでしょうか? ご存じの方教えてくださいませ。 下記にヘッダーに記載されたものを付けておきます。 よろしくお願いします。 From: =?iso-2022-jp?B?GyRCOzBDUjkpNkgtakBfN1cbKEI=?= <ocn.ne.jp> To: Subject: =?iso-2022-jp?B?Rnc6IBskQj9eTEw6RkF3Py4bKEI=?= Date: MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2900.2869 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2869 This is a multi-part message in MIME format. ------=_NextPart_ Content-Type: multipart/alternative; boundary="----=_NextPart_" ------=_NextPart_ Content-Type: text/plain; charset="iso-2022-jp" Content-Transfer-Encoding: 7bit

  • ソフトバンクへのデコメ送信

    ドコモ用のデコメテンプレートを参考にし、下のようなコードでソフトバンク携帯へメールすると、ソフトバンクでだけテキストパートが添付ファイルとしても受信されてしまいます(画面の表示はHTMLパートになってます)。 ソフトバンク携帯のメール受信設定を全受信に変更しても同様でした。 auとドコモでテストした場合は、HTMLパートのみが表示され、添付ファイル等は付いていません。 テスト環境が乏しく、一部の機種でしかテストできない為これが仕様上のものなのか、スクリプトの不備なのかどうかがわかりません。 ご存知の方おりましたら、なにかアドバイスいただけると助かります。 テストで使用した端末は、「docomo:P703i」、「au:W63SA」、「ソフトバンク:905SH」です。 どうぞよろしくお願い致します。 <?php mb_language( "japanese" ); mb_internal_encoding( "UTF-8" ); $to = '[ソフトバンクのメールアドレス]'; // 件名セット $subject = '件名'; // ヘッダを作成 $headers = "From: hoge@hoge.jp\r\n"; $headers .= "MIME-Version: 1.0\r\n"; $headers .= "Content-Type: multipart/related;boundary=\"NEXT_PART\""; //テキスト・HTMLパート $body =<<<END --NEXT_PART Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ここがテキストパート --NEXT_PART Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: 8bit <html> <body> <font color="#FF0000">ここがHTMLパート</font> </body> </html> --NEXT_PART-- END; // メールを送信 $res = mail( $to, $subject, $body, $headers ); // 結果 if( $res ){ echo "OK"; }else{ echo "NG"; } ?>

    • ベストアンサー
    • PHP

専門家に質問してみよう