WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:CGIでメール送受信時の件名の文字化けについて

0:[投稿] moo [MAIL] [2004/02/25 21:46 ][環境:WINXP わからない]

はじめまして。
mooと申します。
CGIも含め、プログラムは初心者です。

今商品注文のページを作成しています。
商品注文をすると、会社側にメールがいき、
さらに、注文者にも確認メールがいくようにしました。
その際、メールの件名が文字化けしてしまいます。

会社側
$Subject = '[CGI-MAIL(商品ご注文)]';
が、メールだと、
[CGI-MAILi、iイカj]

注文者側
$Subject = 'ご注文ありがとうございました';
が、メールだと
イカ隱ニ、イエ「ワオス
になってしまいます。
(カタカナの部分は半角のカタカナで表示されます。)

&sendmail_send($mail, $TO_ADDRESS, $Subject, $Message);
が使えないサーバなので、
&sendmail('',$TO_ADDRESS, $mail, $Subject, $Message);
に変更しました。

上部に
require './function.pl';
require './jcode.pl';
がしてあり、その下に
require './smtp.pl';
を追加しました。

変更前は文字化けしなかったものが、
変更後文字化けしてしまいます。
他で、smtp.plを利用したときは、
文字化けしなかったのですが。

このような説明でよいのかどうか不安ですが、
よろしくお願いいたします。



1:[回答] moo [2004/02/25 21:50 ]

すみません。
タイトルを入れ忘れてしまいました。
もういまさらどうしようもないですね。

CGIでメール送受信時の件名の文字化けについて質問です。


2:[回答] AC [2004/02/25 22:33 ]

SubjectはISO-2022-JPに変換した上でMIMEエンコードした方がよいでしょう。
Jcode.pmのmime_encodeを使うのがよいと思います。
http://openlab.ring.gr.jp/Jcode/index-j.html
なお、perl4的な古いやり方にこだわるのであれば、mimew.plというものも
ありますが、今さら使う必要はないと思います。


3:[回答] ROM-X [2004/02/25 23:23 ]

テスト


4:[質問] moo [2004/02/26 20:20 ]

ACさん、さっそくの回答ありがとうございます。
上記HPより、Jcode-0.83.zipをダウンロードしてきましたが、
その利用方法がさっぱりわかりませんでした。
smtp.plには、
my(@msgs)=("From: $name <$from>\n","To: $to\n",
           "Subject: $subject\n",
           "Content-type: text/plain; charset=iso-2022-jp\n",
           "Content-Transfer-Encoding: 7bit\n\n",
           "$body","\n.\n");

とありますが、
これではダメなのですね。

何をどういじっていいのやら、
ほんとうにさっぱりわからなくなってしまいました。
よろしくお願いします。


ROM-Xさん、
さっそくタイトルを変更くださり、
ありがとうございました。
あわてんぼうで、情けなくなります。
お手数おかけいたしました。


5:[回答] AC [2004/02/26 22:33 ]

そもそも、smtp.plというのは何でしょうか。
どこから取ってきたものか教えて下さい。
# Net::SMTPや、sendmailユーティリティを使う例なら分かりますが
単にSMTPでメールを送信するものと思って >>2 を書きましたが、
>>4 を見る限り違うように思います。


6:[お知らせ] AC [2004/02/26 22:35 ]

管理人さんへ。
title要素の修正が漏れています。


7:[回答] moo [2004/02/27 07:36 ]

他の人がやっていた仕事を引き継いだので、
どこからもらったものかはわからないのですが・・・

smtp.plの中身は、
#SubRoutine for Response of SMTP
use Socket;

$serverhost='cgi.sun-inet.or.jp';

sub smtp_response
{
    my($result,$buf);

    recv(SOCK,$buf,256,0);
    $result=(split(/ /,$buf)) [0];
    ($result >= 200 && $result < 400) ? 1 : 0;
}

#
#SubRoutine for Send Mail SMTP
sub sendmail
{
    my($name,$from,$to,$subject,$body)=@_;
    my(@headers)=("HELO\n","MAIL From: <$from>\n",
              "RCPT To: <$to>\n","DATA\n");
    my(@msgs)=("From: $name <$from>\n","To: $to\n",
           "Subject: $subject\n",
           "Content-type: text/plain; charset=iso-2022-jp\n",
           "Content-Transfer-Encoding: 7bit\n\n",
           "$body","\n.\n");
    my($service,$sockaddr,$proto,$port,$length,@addr,$server);

    #Connect to Port of SMTP
    $service='smtp';
    $sockaddr='S n a4 x8';
    $proto=(getprotobyname('tcp'))[2];
    $port=(getservbyname($service,'tcp'))[2];
    ($length,@addr)=(gethostbyname($serverhost))[3,4];

    if ($length){
        return unless (socket(SOCK,AF_INET,SOCK_STREAM,$proto));
        $server=pack($sockaddr,AF_INET,$port,$addr[0]);
        close(SOCK),return unless (connect(SOCK,$server));
    }

    #Send Mail
    last QUIT unless &smtp_response();
    for (@headers){
        send(SOCK,$_,0);
        last QUIT unless &smtp_response();
    }

    send(SOCK,shift(@msgs),0) while (@msgs);
    last QUIT unless &smtp_response();

    send(SOCK,"QUIT\n",0);
    last QUIT unless &smtp_response();

    QUIT:
    shutdown(SOCK,2);
    close(SOCK);
}

1;

です。


8:[回答] AC [2004/02/27 20:11 ]

smtp.pl は、文字コード変換は行わずに、そのままSMTPに投げるだけの
プログラムのようですね。
>>2 で指摘した通り、MIMEエンコードが必要です。
まず、 $Subject をMIMEエンコードして下さい(詳細は後述)。
そして、 smtp.pl のmy (@msgs)=...の部分を、以下のように修正して下さい。
my(@msgs)=("From: $name <$from>\n","To: $to\n",
・・・・・・・・ ・ "Subject: $subject\n",
・・・・・・・・ ・ "MIME-Version: 1.0\n",
・・・・・・・・ ・ "Content-type: text/plain; charset=iso-2022-jp\n",
・・・・・・・・ ・ "Content-Transfer-Encoding: 7bit\n\n",
・・・・・・・・ ・ "$body","\n.\n");
MIME-Version フィールドが追加されています。
#本当はDateやMessage-IDも追加すべきですが、今回はそこまで行いません。

MIMEエンコードの行い方:
Jcode.pmをどこかのディレクトリにインストールした後、

use lib '(Jcode.pmをインストールしたディレクトリ)';
use Jcode;
$icode = 'sjis';
$Subject_encoded = jcode($Subject, $icode)->mime_encode;
&sendmail('',$TO_ADDRESS, $mail, $Subject_encoded, $Message);

# $icodeは$Subjectの文字コードに合わせて適当に変更して下さい。
# Jcode.pm がインストールできない場合は、またご相談下さい。


9:[質問] moo [2004/02/27 20:51 ]

ありがとうございます。

Jcode.pmがやはりインストールできませんでした。
インストールするディレクトリは、
同じところのがよろしいのでしょうか?
それとも、どこでもいいのでしょうか?

それと、
use lib 以下は、
cgiの方の&sendmail('',$TO_ADDRESS, $mail, $Subject, $Message);
部分の上部に記載すればよろしいのでしょうか?

本当に基本的なことですみません。
よろしくお願いいたします。


10:[回答] AC [2004/02/27 21:48 ]

>インストールするディレクトリは、
>同じところのがよろしいのでしょうか?
>それとも、どこでもいいのでしょうか?
Jcode.pm に限らず一般的に言えることですが
(function.pl, jcode.pl, smtp.pl も同様です)
Webからアクセスできるディレクトリに置くのはセキュリティ上
好ましくありません。

/home/user/public_html 以下がWebで見えるディレクトリである場合、
/home/user/lib というディレクトリを作成して、そこにインストールするのが
よいでしょう。

use lib ...; は use Jcode; より前に置きます。use lib は、Jcode.pm やその他の
モジュールを探すのに使われます。

で、インストールの仕方ですが、サーバへの接続でtelnetまたはSSHが使えますか?
(FTPだけでもインストールはできますが、telnet or SSHを使った方が高速です)


11:[回答] moo [2004/02/27 22:21 ]

ACさん、いろいろありがとうございます。

サーバへの接続ですが、
両方使えないと思います。


12:[回答] AC [2004/02/28 08:37 ]

では、 Jcode-0.83.zip を展開すると、
Jcode というディレクトリと Jcode.pm というファイルがあるので、これを
/home/user/lib に入れて下さい。そうすれば Jcode.pm を使えます。


13:[完了] moo [2004/03/01 11:15 ]

ACさん、お礼のお返事が遅くなりすみませんでした。
上記方法でうまくいきました。
本当に最後までご丁寧にありがとうございました。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World