PR

KENT-WEBの”フォームメール”をUTF-8で使いたい

KENT-WEBさん。
しばらく前ですが、CGIを勉強し始めた頃にも既に存在していて、今も存在しています。
大人気ですね。素晴らしいサイトです。

さて、今回はKENT-WEBさんが配布していらっしゃるフォームからのメール送信を行うフリーソフトウェアを改造します。といっても、改造と言えるかどうかはわかりません。単に文字コードを変更しただけです。ですが、そういう問題に直面している方が私も含めて多いので作業の記録を残すことにします。

スポンサードリンク

いま自分が居る環境だと、なぜUTF-8でないのかと思ってしまうのだけれども、同じようにKENT-WEBさんの掲示板の中でなぜUTF-8なのかという文句もありました。また、既にあるUTF-8で記述されたスクリプトではダメなのか、というものもありました。確かにそうなのですが、なかなかライセンスの問題などでクリアできないものが多くあります。勉強になりますね。

さて、今回はCakePHP内で利用したいのでUTF-8にしました。webroot内で使う分にはShift-JISでも良いのですが、pages内に置きたいので、index.htmlをctpファイルにし、トリガにして起動させたいと思ったわけです。テストではとりあえずOKなのでまぁいいのかな、と思っている次第です。完全にテストしていないので、もしかしたら使っている間になにか問題が出てくるかもしれません。ちなみに、今回はsakuraインターネットで利用します。

◆初期状態(マニュアルより引用、全てShift-JIS)

public_html / index.html (トップページ等)
|
+– postmail / postmail.cgi  [705]
|        postmail.html
|
+– lib / jcode.pl     [604]
|         mimew.pl     [604] … 任意
|         io-socket.pl [604]
|
+– data / log.cgi     [606]
|
+– tmpl / body.txt
conf.html
err1.html
err2.html
thx.html

◆改変後のファイルと文字コード

public_html / index.html (トップページ等)
|
+– postmail / postmail.cgi  (UTF-8)
|        postmail.html → /app/views/pages/好きな名前.ctp (UTF-8、不必要な部分を削除)
|
+– lib / jcode.pl     (変更なし)
|         mimew.pl     (変更なし)
|         io-socket.pl  (変更なし)
|
+– data / log.cgi     (変更なし)
|
+– tmpl / body.txt (Shift-JIS:変更なし)
conf.html (UTF-8)
err1.html (UTF-8)
err2.html (UTF-8)
thx.html (UTF-8)

  • ctpファイルにする場合は余計な部分を削除しないとCakePHPが怒る
  • 他のhtmlはドキュメントの宣言等を変更する
  • body.txtは変更すると文字化けする

◆postmail.cgiの変更箇所

すべてJcode.pmで統一しても良いんだけども、できるだけ原型を留めたいので。
ヌケがあったり、最初からそのままだったものもあるかも。。。

(宣言部分にJcode.pmを入れる)

require ‘./lib/jcode.pl’;
use Jcode;

(これは元からあったかも)

# テンプレ変数変換
$tbody =~ s/\$date/$date1/;
$tbody =~ s/\$agent/$agent/;
$tbody =~ s/\$host/$host/;
&jcode::convert(\$tbody, ‘jis’);

(受け取りをUTF-8にしているので本流のSJISに戻しておく)

# 本文内容
local($tmp);
if ($in{$_} =~ /\n/) {
$tmp = “$_ = \n\n$in{$_}\n”;
} else {
$tmp = “$_ = $in{$_}\n”;
}
# change by casey
#&jcode::convert(\$tmp, ‘jis’, ‘sjis’);
&Jcode::convert(\$tmp, ‘jis’, ‘utf8’);

$mbody .= $tmp;

# add by casey
&Jcode::convert(\$subject, ‘jis’, ‘utf8’);

# MIMEエンコード
if (-e $mimew) {
require $mimew;
$subject2 = &mimeencode($subject);

(スクリプトの文字コードが変わったので)

#————————————————-
#  フォームデコード
#————————————————-

(中略)

undef(%in); undef(%err);
@key = (); @need = (); @err = ();
$check = 0; $max_flg = 0;
foreach ( split(/&/, $buf) ) {
my ($key, $val) = split(/=/);
$key =~ tr/+/ /;
$key =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack(“H2”, $1)/eg;
$val =~ tr/+/ /;
$val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack(“H2”, $1)/eg;

#&jcode::convert(\$key, ‘sjis’);
#&jcode::convert(\$val, ‘sjis’);
&Jcode::convert(\$key, ‘utf8’);
&Jcode::convert(\$val, ‘utf8’);

(使う場合は変更かな)

#————————————————-
#  チェックモード
#————————————————-
sub check {
print “Content-type: text/html\n\n”;
print <<EOM;
<html><head>
<meta http-equiv=”content-type” content=”text/html; charset=utf-8″>
<title>チェックモード</title></head>
<body>
<h3>チェックモード</h3>
<ul>
EOM

—-

◆参考文献

コメント

  1. ina より:

    jacode.pl は jcode.pl の後継としてUTF-8が使えるように改造したものです。

    jacode.pl
    http://text.world.coocan.jp/TSNET/?jacode.pl

    修正するコードの量を減らせるのではないかと思います。ぜひお試しください。

  2. やすお より:

    ありがとう。同じ所でつまずいてうまく行きました。

  3. admin より:

    お役に立ててよかったです。