電子書籍の厳選無料作品が豊富!

現在、以下の内容でメールサーバおよびシステムを運用してます。
レンタルサーバを以下の内容で
OS:FreeBsd
DB:postgresql (eucコードで運用)
PG:perl5.8.8  (eucコードで記述)

最近、当システムから携帯電話(スマートフォン含む)へのメール送信で受信側(携帯)で文字化けが多くなっている。それで、システムの一部のUTF8化しようと思いました。それで、メール送信のライブラリを以下のように修正してみたが、本文が文字化けしてしまいます。なぜ文字するか原因がわかりません。
以下のソースはUTF8Nで記述しています。

※システム全部をUTF8コード化やDB(POSTGRESQL)もUTF8にする案もありますが、
改修作業が大きくて作業時間が少ない方法も模索しています。

どなたかご教授願います。

binmode(STDOUT, ":utf8");
use Encode;
use Encode qw(from_to);
use MIME::Base64;
use MIME::Entity;
use Net::SMTP;
use MIME::Words qw (:all);


sub sendmail()
{
my ($mail_date) = @_; <==メールのハッシュ配列(DBに登録されているメールの件名、本文)
my $smtp_server = $mail_date->{SMTPsrv};
my $smtp_port = '25';


# 送信者のメールアドレスを設定する。
my $mail_from = $mail_date->{MailFr};
# 宛先のメールアドレスを設定する。
my $mail_to = $mail_date->{MailTo};
# メールの件名を設定する。
from_to($mail_date->{Subjct},"euc-jp","utf8"); #UTF8に変換
$utf8_str_sub = $mail_date->{Subjct};

# メールの内容を設定する。
my $message;
my $utf8_str;
from_to($mail_date->{Message},"euc-jp","utf8"); #UTF8に変換
$message = $mail_date->{Message};
$utf8_str = $message;

# メールヘッダを作成する。
# from、to、件名共にMIME-Header(UTF-8)へエンコードします。
my $mail_header;
$mail_header = "From: " .encode('MIME-Header-ISO_2022_JP',$mail_from)."\n";
$mail_header .= "To: " .encode('MIME-Header-ISO_2022_JP',$mail_to) ."\n";
$mail_header .= "Subject: ".encode('MIME-Header-ISO_2022_JP',$utf8_str_sub) ."\n";

# UTF-8とbase64 encodeを使う事を明記します。
$mail_header .= "MIME-Version: 1.0\n";
$mail_header .= "Content-type: text/plain; charset=utf-8\n";
$mail_header .= "Content-Transfer-Encoding: base64\n";
$mail_header .= "\n";

# SMTPでメールを送る。
my $SMTP = Net::SMTP->new($smtp_server,Port=>$smtp_port);
$SMTP->mail($mail_from);
$SMTP->to($mail_to);
$SMTP->data();
$SMTP->datasend($mail_header);
$SMTP->datasend(encode_base64(encode('utf8', $utf8_str)));

$SMTP->dataend();
$SMTP->quit;
}

A 回答 (2件)

Socketを使ったプログラミングをしたことがないので、はっきりとはわかりませんが、



binmode(STDOUT, ":utf8");

が、何らかの悪さをしているかもしれません。
これをコメントアウトして試してみてください。
    • good
    • 0
この回答へのお礼

返信遅くなりました。

binmode(STDOUT, ":utf8");をコメントアウトしても状況は変わりませんでした。

それで、PostgresqlのSQLでselect時にコード変換できるようなのでそれで試しているとろこです。

お礼日時:2011/07/07 15:14

原因は複数あるかもしれませんが、とりあえず以下のfrom_toは、



from_to($mail_date->{Subjct},"euc-jp","utf8"); #UTF8に変換
from_to($mail_date->{Message},"euc-jp","utf8"); #UTF8に変換

後にencode関数を使っているので、以下のようにdecode関数に書き換えたほうがいいと思います。

$mail_date->{Subjct} = decode("euc-jp", $mail_date->{Subjct});
$mail_date->{Message} = decode("euc-jp", $mail_date->{Message});
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
from_to($mail_date->{Subjct},"euc-jp","utf8"); #UTF8に変換
from_to($mail_date->{Message},"euc-jp","utf8"); #UTF8に変換


$mail_date->{Subjct} = decode("euc-jp", $mail_date->{Subjct});
$mail_date->{Message} = decode("euc-jp", $mail_date->{Message});

に置き換えて実行しましたが、だめでした。

やはり、根本的につくり直しなのでしょうか?

お礼日時:2011/06/30 13:14

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