ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

さくらインターネットコミュの受信メールの「本文」の文字化けについて

  • mixiチェック
  • このエントリーをはてなブックマークに追加
皆様こんばんわ。
ご存知の方いらっしゃいましたら教えてください。

「さくらのレンタルサーバ(スタンダード)」を契約しております。

さくらレンタルサーバ上からsendmail 機能を使用し、
cgi にて携帯へメールを送信しているのですが、

受信メールの「タイトル」(Subject欄)、「本文」とも
cgi上のcharsetをSJISやJIS、EUC、ISO-2022-JPなどに
しても受信時に文字化けをしておりました。

Jcode.plを使用し、以下のように 入力フォームからの
「タイトル」(subject欄)の取得データを jisに変換をしたところ、
&jcode'convert(*title, 'jis');

以下のページに記載の通り、「タイトル」(Subject欄)は文字化けしなくなりましたが、
同様の変換を行っても「本文」は相変わらず文字化けしてしまいます。

>http://faq.sakura.ne.jp/wiki/wiki.cgi?%A5%E1%A1%BC%A5%EB
>文字コードをJISにしないと文字化けします。
>Subject欄を日本語にしたい場合は、mimeエンコードが必要です。

メール「本文」(メッセージ)に対して、
文字コードなど何か設定方法、及び仕様などはありますでしょうか。

宜しくお願いいたします。

コメント(8)


tateisuさんご返答ありがとうございます。

cgiのブラウザへの結果表示には、
(sendmailには直接無関係と思われますが)

print "Content-type:text/html\n\n";
や
<meta http-equiv="Content-Type" content="text/html; charset=x-sjis">
<meta http-equiv="Content-Type" content="text/html; charset=ISO-2022-JP">
<meta http-equiv="Content-Type" content="text/html; charset=JIS">
<meta http-equiv="Content-Type" content="text/html; charset=SHIFT_JIS">
などにしております。

実際のsub SendMail() 内は、以下にしております。
$hash{'Content-type'} = 'text/plain; charset=JIS';

また最初の質問の通り、「タイトル」は以下で文字化け解消しました。
&jcode'convert(*title, 'jis');

「本文」は以下を試しましたがやはり文字化けしました。
&jcode'convert(*comment, 'jis');
&jcode'convert(*comment, 'sjis');
&jcode'convert(*comment, 'euc');

りんさん、ご指摘ありがとうございます。
大変失礼しました。以下になってます。
見難かったらごめんなさい。

'---------------------------------
sub SendMail()
{

# フォームから受け取ったデータ
my($sender, $receiver, $carboncopy, $subject, $comment) = @_;

$from = $sender;
$to = $receiver;
$cc = $carboncopy;

# 「タイトル」をjisに変換 → 文字化け無し
$title = $subject;
&jcode'convert(*title, 'jis');
$title2 = $title;

# 「本文」をjisに変換 → 文字化け
$com = $comment;
&jcode'convert(*com, 'jis');
$com2 = $com;

my(%hash);
$hash{'From'} = $from;
$hash{'To'} = $to;
$hash{'CC'} = $cc;
$hash{'Smtp'} = $g_server;
$hash{'Subject'} = $title2;
$hash{'Message'} = $com2;
$hash{'Content-type'} = 'text/plain; charset=JIS';

if(!sendmail %hash ){
return -1;
}
return 0;
}

'---------------------------------

また、フォームは以下です。
'---------------------------------
title :
<input type="text" size="35" name="subject2"

comment :
<textarea name="comment" rows="5" cols="34"></textarea></p>
'---------------------------------

また、sub SendMail() を呼び出す前に、sub main()でフォームデータに対して、
以下関数をかましています。これが原因でしょうか。
ただ、「タイトル」は問題ないのですが。。。
'---------------------------------
sub main()
{
print "Content-type:text/html\n\n";
my(%FORM) = &CGI_GetArg;
'---------------------------------

↓

'---------------------------------
sub CGI_GetArg
{
my($buf, %form, @pairs, $pair);

if($ENV{REQUEST_METHOD} eq 'POST'){
read(STDIN, $buf, $ENV{CONTENT_LENGTH});
@pairs = split(/&/, $buf);
}elsif($ENV{REQUEST_METHOD} eq 'GET'){
@pairs = split(/&/, $ENV{QUERY_STRING});
}

foreach $pair (@pairs){
local($name, $value) = split(/=/, $pair);
$value = &DecodeArg($value);

# &jcode'convert(*name ,'jis');
&jcode'convert(*name ,'sjis');

# $name =~ tr/;A-Z/:a-z/;
$name =~ tr/A-Z/a-z/;

# &jcode'convert(*value,'jis');
&jcode'convert(*value,'sjis');

# $value =~ s/;/:/g;

$form{$name} = $value;

}
return %form;
}

'---------------------------------
sub DecodeArg {
my($s) = $_[0];
$s =~ tr/+/ /;
$s =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
return $s;
}

'---------------------------------
Perlは不勉強で間違っているかもしれませんが、この行に違和感があります。
$hash{'Content-type'} = 'text/plain; charset=JIS';

僕が普段やりとりしている日本語メールのヘッダは、次のようになっています。
Content-Type: text/plain; charset=iso-2022-jp

たけおさん、書き込みありがとうございます。

「本文」のcharset についてですが、
以下のいろいろな組み合わせ、
またjcode変換を#でコメントしてみたり、
といろいろとしてみたのですが、どの組み合わせでも
やはり文字化けしてしまいます。

&jcode'convert(*com, 'jis');
&jcode'convert(*com, 'sjis');
&jcode'convert(*com, 'euc');

$hash{'Content-type'} = 'text/plain; charset=x-sjis';
$hash{'Content-type'} = 'text/plain; charset=euc-jp';
$hash{'Content-type'} = 'text/plain; charset=ISO-2022-jp';
$hash{'Content-type'} = 'text/plain; charset=Shift_JIS';
$hash{'Content-type'} = 'text/plain; charset=JIS';

また、携帯とありますが、willcomなのですが、

通常のwillcom, softbank, docomo, auなどからの
受信メールのへッダー見ますと、たけおさんのおっしゃる通り、
charset=iso-2022-jpとなっているのですが、

今回のsendmailの場合ですと、上記のどのcharsetを指定してようと、
受信メールのへッダーは charset=us-ascii となっております。
ただ、 charset=us-ascii の状態でも「タイトル」は
&jcode'convert(*com, 'jis'); にしていると文字化けせず、
「本文」のみ文字化けという状況です。。。

みなさま、すいません。
いろいろ調べていて、正確にはわからなかったのですが、
Sendmail.pm というモジュールを使用していたことが原因のようです。

※そのSendmail.pm 内に
Content-type: 'text/plain; charset="iso-8859-1"'
という記述がありました。→us-ascii のことです。
Content-type: 'text/plain; charset="iso-2022-jp"'
に変更しても文字化けは変わらなかったのですが、
どこか元の海外サーバに飛ばしているとするならば、
文字化け表示されると思われます。
何か別の方法も含めて検討します。
皆様、お手数をおかけしました。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

さくらインターネット 更新情報

さくらインターネットのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング