• 締切済み

emlファイルのデーターのpost送信について

 perl初心者なのですが質問いたします。 自分のレンタルサーバーのメールアドレスに携帯から 写メールを送信してそのメールを MIME::Parser;を使って 画像と本文を取り出しpost送信してを自分のHPに出力で きるのではと思いスクリプトを書いてるのですが MIME::Parserの取ってきたデーターが素直に送れない 様なので悩んでおります。 流れ的にはNet::POP3で  my $messages = $pop3->list(); foreach $id (sort (keys %{$messages})) { my $message = $pop3->get($id); ....... と$messageでメールを任意のディレクトリに保存して MIME::Parser;で$messageを解析してます。 #本文の取得 my $entity = $parser->parse_data($message); my $subject = $entity->head->get('Subject'); my $body_entity = ($entity->is_multipart) ? $entity->parts(0) : $entity; my $body = $body_entity->bodyhandle; my $bodylast = $body->as_string; #添付ファイルの処理 my $uploadFile = $entity->parts(1)->bodyhandle->as_string; # リクエストの生成 my $url = 'http://xxx.cgi'; my %formdata = ('perl' => 'rakuda', 'comment'=>"$bodylast",'upfile'=>"$uploadFile"); my $request = POST($url, [%formdata]); # UserAgentを生成して処理 my $ua = LWP::UserAgent->new; my $res = $ua->request($request); print $res->as_string; $pop3->delete($id); $pop3->quit; 一応送られてはいる様なのですが commentの部分は文字化けしてます、大元のレンタルサーバのソース をしらべると Content-Type: text/plain; charset="iso-2022-jp" Content-Transfer-Encoding: 7bit というエンコードがされてるようです。 そしてupfileの部分はxxx.cgiのチェック部分の     foreach (@in) { if (/(.*)Content-type:(.*)/i) { $content=$2; } if (/(.*)filename=\"(.*)\"/i) { $fname=$2; }     ..... の部分でクリア出来ないようで設定したエラーがでてしまいます。 (因みにxxx.cgiはfirefoxやIEからは問題なくpostできます) レンタルサーバーの添付画像の部分のソースは Content-Type: image/jpeg; name="091108_1053~0001.jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="091108_1053~0001.jpg" となっておりbase64エンコードのようです。 調べてMIME::Base64;もレンタルサーバーにインストールされてたので  my $uploadFile = encode_base64($uploadFile); ともしてpostしてみたのですが上のチェック部分のエラーが出てしまいます。 長くなってしまいましたが、MIME::Parserで取り出したcomment部分と upfile部分をどうにか正常に出力されるように送りたいのですが自分で はもう底です。 もしかしたら無駄に遠回りしてるかも知れませんが御教示していただけたら ありがたいです。

みんなの回答

回答No.1

文字化けは use Encode; my $bodylast = decode( 'ISO_2022_JP', $body->as_string); とかかなぁ my %formdata = ('perl' => 'rakuda', 'comment'=>"$bodylast",'upfile'=>"$uploadFile"); の$uploadFile は、ディスク上のファイルでないとだめかも? ファイルは、CGIのローカルに一旦保存できるなら my $pop_dir = './pop'; $parser->output_to_core(0); if ( !-d $pop_dir ) { mkdir $pop_dir or die "mkdir $pop_dir:$!"; } $parser->output_dir($pop_dir) or die "$pop_dir:$!"; で./popにファイルができると思う。 直接デコードして送る方法はわかりません。

Guree
質問者

お礼

_--_1l1_1_さん遅くなりましたが回答有難うございました。 回答はすぐ目を通したのですが、なかなか解決しないもので 返事がおくれてしまいました。 本文の文字化けは use Encode; my $bodylast = decode( 'ISO_2022_JP', $body->as_string); で解決できました。 >ファイルは、CGIのローカルに一旦保存できるなら これはcgiのあるディレクトリに保存という事でよろしいのでしょうか。 質問をした後に気がついたのですがNet::POP3で任意のディレクトりに .emlを保存した以外にカレントにjpgファイルが保存されていました。 仕様なのですかね、コレでなんとかと思いアレコレしたのですが、まと めてpost送信はうまくいきませんでした。 邪道というか妥協案ですがxxx.cgiでhtmlの<img src....... からjpgファイルを呼び出す処理をしました。 見た目は望んだ出来に近いのですがやってる事の中身は エレガントではありませんね(笑) まだ術はあるんでしょうけど。 有難うございました。

関連するQ&A