• ベストアンサー

メール本文のJIS変換

お助けください。 CGI/Perlでメールを送信するコードを作成しております。 元々jcode.plを使用して書かれたコードを参考に作成しましたが、 ActivePerl 5.8を使用しており、Encode.pmを使用することを検討しました。 ところが、jis(iso-2022-jp)への変換がどうにもこうにもうまくいきません。 あちこち資料を探しましたが、手がかりになるものが見当たりませんでした。 $sData = encode("jis","テストメール"); これだけですと、オクテット(でよいのだろうか?)にしかならないようで、 受信した本文は化けた状態になってしまいます。 どなた様か、ご教示願います。

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

form_toを使ってはどうでしょう ---------------------------------------------------------------- use Encode; $text="シフトJISからJIS"; Encode::from_to($text,"shiftjis","iso-2022-jp"); print $text;

komorebi99
質問者

お礼

BLUEPIXYさん 毎回回答ありがとうございます。 今回はBLUEPIXYのご教示で第1の壁を破ることができました。*^^* 回答が得られなかったら恐らく未だに頭を抱えていたことでしょう。 また機会がありましたらよろしくお願いします。

komorebi99
質問者

補足

回答ありがとうございます。 ご教示のfrom_to(...)で変換できました、が・・・ $hoge = "アカサタナテストメールJIS"; Encode::from_to($hoge, "shiftjis", "iso-2022-jp"); としますと、半角カタカナが見事に化けます。 あらかじめ、半角カタカナを全角カタカナに変換しておこうと use Encode::JP::H2Z; Encode::JP::H2Z::z2h(\$hoge); を追加しても、まるで機能していないようにみえます。 これは如何にすれば解決できるものでしょうか? ※ $hoge の「アカサタナ」は半角カタカナです

その他の回答 (5)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.6

#1>としますと、半角カタカナが見事に化けます。 #5でも指摘されているように、 from_to を使うと半角カナは、全角に変換されるようです。 なので、#1で言われているような現象にはなりませんでした。 ちなみにJISでも半角カナは、7ビットの範囲を超えていますので、 7ビットの範囲で送ろうとするメールには使用できません。 (基本ですね^^) あと、 H2ZのモジュールはEUCのためのモジュールのようですね。

  • mekerock
  • ベストアンサー率64% (9/14)
回答No.5

再度 mekerock です from_toを使うと、半角カナは全角カナにしてしまうそうです。(perldoc Encode::JP 参照) これはこれで、良いのでは、と思うのですが、ハンカクのままがよろしいのでしょうか? と、なると、現行モジュールままでは対応厳しくないですかね?(あれば、私も知りたいです) 改行が出来ない、ということは無いと思います。 \n をシングルクォーテーションで括っているとか、ありませんか? ハンカクと改行の試験をした結果、MIME::Entityを使う場合も、Net::SMTPを使う場合も、ハンカクがゼンカクになるほかはうまくいきました。

komorebi99
質問者

お礼

数々のヒント・ご指導ありがとうございました。 今回の問題はおかげさまで解決しましたが、Encodeのfrom_toは別途もう少し調査したほうがよさそうですね。(環境が違うと動作が違うのかどうかなど)

komorebi99
質問者

補足

回答ありがとうございます <m(__)m> $ssData = "アカサタナテストメール\n12345"; この文字列を・・・ Encode::from_to($ssData, 'shiftjis', '7bit-jis' ); で変換した場合は半角のままでした。(「アカサタナ」が半角です) 仰るとおり、メールで半角カタカナは厳禁なので、ユーザーが半角 で入力しても全角に変換するように作成する計画です。 いろいろ調べて次の様にしました。 Encode::from_to($ssData, 'shiftjis', 'euc-jp' ); Encode::JP::H2Z::h2z(\$ssData); Encode::from_to($ssData, 'euc-jp', '7bit-jis' ); H2Zがeucのみ受け付けると資料にありましたので、eucに変換して全角変換後した後に7bit-jisに変換しました。 改行はご指摘のとおり、シングルクォーテーションで括っていました。<m(__)m>

  • mekerock
  • ベストアンサー率64% (9/14)
回答No.4

なるほど。モジュールだけで動かすのですね? その条件でいろいろ実験してみました。 でも、#1さんの助言にある Encodeモジュールとあわせて、こちらでは簡単に実験成功しました。 MIME::Entityを使うのであれば、メッセージは配列のリファレンスを引き渡さないといけないです。 (前後省略)  Data = \@メッセージデータ ただ、MIME::Entityを使用すると、メッセージ自体も添付ファイルとして送られる風なので、Net::SMTPも利用してみては如何でしょう? 多分、もう少しです。 がんばってください。 紹介する「Perlの小技」さんもいろいろ参考になります。

参考URL:
http://homepage3.nifty.com/hippo2000/perltips/perlmail.htm
komorebi99
質問者

補足

回答ありがとうございます。 Perlでメールを送信することを考え、最初に参考にさせていただいたコードが 河馬屋さん(参考URL)のコードです。 説明が足りなかったのですが、作成中のコードではNet::SMTPも使用しております。 ご教示をいただき、from_toによって変換はできるようになりましたが、 まだ 半角カタカナの問題と文字列中の改行が解決できておりません。

  • mekerock
  • ベストアンサー率64% (9/14)
回答No.3

あ。ごめんなさい。本文でしたね。 jcode.plを使っているのでしたら、メールのヘッダ情報に、以下を加えてあげていますか? (MAILはsendmailのパイプオープンハンドル)   print MAIL "Content-Transfer-Encoding: 7bit\n";   print MAIL "Content-Type: text/plain\; charset=\"ISO-2022-JP\"\n\n\n";   print MAIL $body; # $bodyはjcode.plでjis変換しただけのデータ 今まで、これで問題があったためしは無いですが…

komorebi99
質問者

お礼

回答ありがとうございます。 今回ヘッダにはMIMEモジュールを使用して $hoge = MIME::Entity->build(        To    => $hogeTo,        From   => $hogeFrom,        Subject => $hogeSubj,        Type   => 'text/plane;charset="iso-2022-jp"',        Encoding=> "7bit" ); としております。 jcodel.plはPerl5で動作することはわかっておりますが、できるだけ標準 のモジュールを使用するという内規のようなものがありまして、jcode.pl は使わない(使えない・・・)方針です。

  • mekerock
  • ベストアンサー率64% (9/14)
回答No.2

自分は生田 昇氏のmimew.plをよく使わせてもらっています。 小さいパッケージですのし、原文の文字コードも気にしないでいいので、使いやすいかと。

参考URL:
http://www.cc.rim.or.jp/~ikuta/mime_pls/index.html
komorebi99
質問者

お礼

回答ありがとうございました。 参考URLのページは参考にさせていただきます。

関連するQ&A