アプリ版:「スタンプのみでお礼する」機能のリリースについて

 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部分をどうにか正常に出力されるように送りたいのですが自分で
はもう底です。

もしかしたら無駄に遠回りしてるかも知れませんが御教示していただけたら
ありがたいです。

A 回答 (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にファイルができると思う。
直接デコードして送る方法はわかりません。
    • good
    • 0
この回答へのお礼

_--_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ファイルを呼び出す処理をしました。
見た目は望んだ出来に近いのですがやってる事の中身は
エレガントではありませんね(笑)

まだ術はあるんでしょうけど。

有難うございました。

お礼日時:2009/12/01 22:46

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!