ZABBIX1.6の日本語アラートメールの文字化け

ZABBIX1.4で日本語アラートメールスクリプトsendmessage_php.shを使用していました。
ZABBIX1.6にアップグレードしたところ、1.4では文字化け無く送信されていたメールが1.6では文字化けしています。
文字化け直す方法ありますか?

英語の部分は文字化けが無く、日本語が「????????」のように文字化けします。
OSはCentOS5.4です。

コメント表示オプション

お好みのコメント表示方法を選び「設定の保存」をクリックすると変更が反映されます。
ユーザー KAZ の写真

maiさん

使っているzabbixとアップデートの方法をもう少々教えて下さい。

・アップデート前のzabbixは本家のzabbix1.4.xをconfigureインストールされたのでしょうか?(それともzabbix-jpのrpmでしょうか?)

・アップデートした1.6は本家のzabbix1.6.xをconfigureインストールされたのでしょうか?(それともzabbix-jpのrpmでしょうか?)

・画面の表示では文字化けはないでしょうか?

ユーザー mai の写真

有難うございます。

アップデート前のzabbixはzabbix-jpのyumでインストールしました。

zabbix1.6はzabbix-jpのyumでアップデートしました。

画面の表示で文字化けはありません。

ユーザー KAZ の写真

maiさん

確認1
/usr/share/zabbix/include/locales/ja_jp.inc.phpのS_HTML_CHARSETはUTF-8でしょうか?

確認2
ユーザの使用しているメディアはsendmessage.shでしょうか?

ユーザー mai の写真

有難うございます。

確認1

/usr/share/zabbix/include/locales/ja_jp.inc.phpを確認しましたところ
'S_HTML_CHARSET'=> 'UTF-8',
でした。

確認2
sendmessage_php.shを使用しています。

ちなみに# ./sendmessage_php.sh [メールアドレス] [件名] [本文]で実行すると文字化けしませんが、実際のアラートメールでは文字化けします。

ユーザー KAZ の写真

maiさん

ちなみに# ./sendmessage_php.sh [メールアドレス] [件名] [本文]で実行すると文字化けしませんが、実際のアラートメールでは文字化けします。

./sendmessage_php.shの配置先は/etc/zabbix/zabbix_server.confの「AlertScriptsPath」設定しているpathにありますでしょうか?

sendmessage_php.shはUTF-8→ISO-2022-JPのエンコードを行ってます。phpとMySQL、OSの言語設定、webフロントエンドの言語設定が全部UTF-8なら問題ないはずなのですが…

ユーザー mai の写真

有難うございます。

> ./sendmessage_php.shの配置先は/etc/zabbix/zabbix_server.confの「AlertScriptsPath」設定しているpathにありますでしょうか?

# ls /etc/zabbix/alertscripts/sendmessage_php.sh
/etc/zabbix/alertscripts/sendmessage_php.sh
# cat /etc/zabbix/zabbix_server.conf | grep AlertScriptsPath
AlertScriptsPath=/etc/zabbix/alertscripts

問題ないです。

> sendmessage_php.shはUTF-8→ISO-2022-JPのエンコードを行ってます。phpとMySQL、OSの言語設定、webフロントエンドの言語設定が全部UTF-8なら問題ないはずなのですが…

そうですよね。
sendmessage_php.shの引数の文字コードをmb_detect_encoding([引数])で出力させたところ、# ./sendmessage_php.shの場合はUTF-8、実際のアラートメールの場合はASCIIでした。
何か関係ありますでしょうか?

ユーザー KAZ の写真

maiさん

私もmb_detect_encodingを試してみました。
下記のような感じで、mb_detect_encoding結果をログに出しました。

<code>
#!/usr/bin/php

<?php

/*
** This program is sendmail script with ISO-2022-JP for ZABBIX.
**
** Auther: Kodai Terashima
**
** Copyright (C) 2005-2009 ZABBIX-JP
** This program is licenced under the GPL
**/

$MAIL_FROM = "zabbix@pits.jp";

mb_language('Japanese');
mb_internal_encoding('UTF-8');

$MAIL_TO = $argv[1];
$MAIL_SUBJECT = $argv[2];
$MAIL_MESSAGE = $argv[3];
error_log("before MAIL_TO :".mb_detect_encoding($MAIL_TO,"auto")."\n",3,"/test/encode.log");
error_log("before MAIL_SUBJECT :".mb_detect_encoding($MAIL_SUBJECT,"auto")."\n",3,"/test/encode.log");
error_log("before MAIL_MESSAGE :".mb_detect_encoding($MAIL_MESSAGE,"auto")."\n",3,"/test/encode.log");

$MAIL_HEADER = 'MIME-Version: 1.0' . "\r\n";
$MAIL_HEADER .= 'Content-Type: text/plain; charset="iso-2022-jp"' . "\r\n";
$MAIL_HEADER .= 'Content-Transfer-Encoding: 7bit' . "\r\n";
$MAIL_HEADER .= 'Date: ' . date('r') . "\r\n";
$MAIL_HEADER .= 'X-Mailer: PHP/' . phpversion() . "\r\n";
$MAIL_HEADER .= 'From: ' . $MAIL_FROM . "\r\n";

$MAIL_SUBJECT = mb_convert_encoding($MAIL_SUBJECT,"ISO-2022-JP","UTF-8");
$MAIL_MESSAGE = mb_convert_encoding($MAIL_MESSAGE,"ISO-2022-JP","UTF-8");

$MAIL_SUBJECT = '=?ISO-2022-JP?B?' . base64_encode($MAIL_SUBJECT) . '?=';

error_log("after MAIL_TO :".mb_detect_encoding($MAIL_TO,"auto")."\n",3,"/test/encode.log");
error_log("after MAIL_SUBJECT :".mb_detect_encoding($MAIL_SUBJECT,"auto")."\n",3,"/test/encode.log");
error_log("after MAIL_MESSAGE :".mb_detect_encoding($MAIL_MESSAGE,"auto")."\n",3,"/test/encode.log");
error_log("after MAIL_HEADER :".mb_detect_encoding($MAIL_HEADER,"auto")."\n",3,"/test/encode.log");

mail($MAIL_TO, $MAIL_SUBJECT, $MAIL_MESSAGE, $MAIL_HEADER);

?>
</code>

実行した結果、メッセージ本体はJISになりました。
<code>
before MAIL_TO :ASCII
before MAIL_SUBJECT :UTF-8
before MAIL_MESSAGE :UTF-8
after MAIL_TO :ASCII
after MAIL_SUBJECT :ASCII
after MAIL_MESSAGE :JIS
after MAIL_HEADER :ASCII
</code>

送信されたメールは下記です。(一部伏字にしてます。)

メール件名:「障害回復:プロセス監視 ??????」
<code>
***????インフラ障害 発生通知***
1)ホスト名 :????????
2)監視対象 :プロセス監視 ??????
3)障害発生 :2009.12.04 13:28:58
4)障害レベル:High
5)検知項目 :proc.num[??????,root]:0
6)コメント :
■障害対応
1)?????????????????
?????????????????????
</code>

ユーザー mai の写真

有難うございます。

KAZさんと同じ方法で出力しました。

# ZABBIX1.4
before MAIL_TO :ASCII
before MAIL_SUBJECT :UTF-8
before MAIL_MESSAGE :UTF-8
after MAIL_TO :ASCII
after MAIL_SUBJECT :ASCII
after MAIL_MESSAGE :UTF-8
after MAIL_HEADER :ASCII

# ZABBIX1.6
before MAIL_TO :ASCII
before MAIL_SUBJECT :UTF-8
before MAIL_MESSAGE :ASCII
after MAIL_TO :ASCII
after MAIL_SUBJECT :ASCII
after MAIL_MESSAGE :ASCII
after MAIL_HEADER :ASCII

ユーザー KAZ の写真

maiさん

mb_detect_encoding(対象文字列,"auto")でそうなりました?

※:mb_detect_encoding(対象文字列)とmb_detect_encoding(対象文字列,"auto")は少々返却値が異なります。

取り敢えず、ASCIIになっているのが問題だと思います。
sendmessage_php.shは問題なさそうなので、zabbix→ sendmessage_php.sh間の何かだと思うのですが…

少々、再現できるかトライしてみます。

ユーザー mai の写真

auto忘れてました。

# zabbix1.4
before MAIL_TO :ASCII
before MAIL_SUBJECT :UTF-8
before MAIL_MESSAGE :UTF-8
after MAIL_TO :ASCII
after MAIL_SUBJECT :ASCII
after MAIL_MESSAGE :JIS
after MAIL_HEADER :ASCII

# zabbix1.6
before MAIL_TO :ASCII
before MAIL_SUBJECT :UTF-8
before MAIL_MESSAGE :ASCII
after MAIL_TO :ASCII
after MAIL_SUBJECT :ASCII
after MAIL_MESSAGE :ASCII
after MAIL_HEADER :ASCII

ユーザー KAZ の写真

maiさん

ありがとうございます。

# zabbix1.6
before MAIL_TO :ASCII
before MAIL_SUBJECT :UTF-8
before MAIL_MESSAGE :ASCII ←これが問題ですね。
after MAIL_TO :ASCII
after MAIL_SUBJECT :ASCII
after MAIL_MESSAGE :ASCII ←これが問題ですね。
after MAIL_HEADER :ASCII

調べてみます。
ちょっと時間がかかるかもしれません。
maiさんの方でも気付いたことがあったらアップして頂けると助かります。

ユーザー mai の写真

有難うございます。

MAIL_MESSAGEの文字コードが問題ですが、アラートメールは件名も本文も日本語が文字化けします。

ユーザー KAZ の写真

maiさん

下記コマンドで実行した時、ログはどうなりますか?
<code>
./sendmessage_php.sh [メールアドレス] [件名] [本文]
</code>

ユーザー mai の写真

# ./sendmessage_php.sh [メールアドレス] 件名 本文
before MAIL_TO :ASCII
before MAIL_SUBJECT :UTF-8
before MAIL_MESSAGE :UTF-8
after MAIL_TO :ASCII
after MAIL_SUBJECT :ASCII
after MAIL_MESSAGE :JIS
after MAIL_HEADER :ASCII

メールは文字化けしていません。

ユーザー KAZ の写真

maiさん

原因がうまくつかめないので、CentOS5.4環境を作ってみます。
諸書の事情でちょっと時間がかかってしまいます。
すいません。m(__)m

ユーザー KAZ の写真

maiさん

現状報告です。

CentOS5.4を建て、zabbix1.4.6-2をyumインストールしメール送信テストを行った後、zabbix1.6.6-1をyumインストールしたら同じ現象になりました。

その後、zabbix1.6.6-1をrpmコマンドでeraseし、手動でrpm installをしても事象変わりません…

調査を続けますので、すいませんがお持ち下さい。
※:CentOS5.3はzabbix1.4.6-2→abbix1.6.6-1は問題ありませんでした。

ユーザー mai の写真

有難うございます。

yumインストールではなく、rpmインストールで送信テストを行った結果、文字化けしました。
CentOS5.4です。

ユーザー kodai の写真

こんにちは。

CentOS 5.4に(1.4からのアップデートではなく)いちから
1.6.6を入れても同じ現象になるでしょうか?

OSで異なるということはPHPのデフォルト設定かもしれません。
以下の内容を記載した/usr/share/zabbix/phpinfo.phpを作成して、ブラウザから http://zabbix-server-address/phpinfo.php にアクセスして表示される情報のmbstringの項目はどうなっているでしょうか?

<code><? phpinfo() ?></code>

手元にあるCentOS 5.3では以下のようになっていました。

<code>
Directive Local Value Master Value
mbstring.detect_order no value no value
mbstring.encoding_translation Off Off
mbstring.func_overload 0 0
mbstring.http_input pass pass
mbstring.http_output pass pass
mbstring.internal_encoding no value no value
mbstring.language neutral neutral
mbstring.strict_detection Off Off
mbstring.substitute_character no value no value</code>

ユーザー mai の写真

有難うございます。

■CentOS5.3
Directive Local Value Master Value
mbstring.detect_order no value no value
mbstring.encoding_translation Off Off
mbstring.func_overload 0 0
mbstring.http_input pass pass
mbstring.http_output pass pass
mbstring.internal_encoding no value no value
mbstring.language neutral neutral
mbstring.strict_detection Off Off
mbstring.substitute_character no value no value

■CentOS5.4
Directive Local Value Master Value
mbstring.detect_order no value no value
mbstring.encoding_translation Off Off
mbstring.func_overload 0 0
mbstring.http_input pass pass
mbstring.http_output pass pass
mbstring.internal_encoding ISO-8859-1 no value
mbstring.language neutral neutral
mbstring.strict_detection Off Off
mbstring.substitute_character no value no value

php.iniのmbstring設定は両OS同じでしたが、phpinfo()で見るとmbstring.internal_encodingに相違があります。

ユーザー mai の写真

すみません。
追記ですが、phpinfo()ページを更新するとmbstring.internal_encodingが「no value」になったり「ISO-8859-1」になったりしています。

CentOS5.3で試してみましたが文字化けしました。

phpの設定がおかしいのでしょうか。

ユーザー mai の写真

連続レスすみません。

zabbixデータベースのalertsテーブルのsubject、messageを調べたところ、zabbix1.4で作成されたレコードは文字化けしておらず、zabbix1.6で作成されたレコードは文字化けした状態で作成されているようです。
phpの設定ではなく、データベースの設定もしくはzabbix-serverにあるかもしれません。

障害が発生した時、alertsテーブルにレコードを作成するのはzabbix-serverですか?phpですか?

ユーザー kodai の写真

zabbixデータベースのalertsテーブルのsubject、messageを調べたところ、zabbix1.4で作成されたレコードは文字化けしておらず、zabbix1.6で作成されたレコードは文字化けした状態で作成されているようです。
phpの設定ではなく、データベースの設定もしくはzabbix-serverにあるかもしれません。

なるほど、状況理解しました。

障害が発生した時、alertsテーブルにレコードを作成するのはzabbix-serverですか?phpですか?

zabbix-serverです。escalationsテーブルに保存されたメッセージのうち、アクションを実行するものをalertsテーブルにコピーしてます。

こちらでもいちど環境を作って試してみます。

ユーザー KAZ の写真

maiさん

原因分かりました。
MySQLのエンコード設定です。

下記、正しく送信される時のMySQLのエンコードです。
<code>
mysql> status
--------------
mysql Ver 14.12 Distrib 5.0.77, for redhat-linux-gnu (i686) using readline 5.1

Connection id: 214
Current database: zabbix
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 5.0.77 Source distribution
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: utf8
Db characterset: utf8
Client characterset: utf8
Conn. characterset: utf8
UNIX socket: /var/lib/mysql/mysql.sock
Uptime: 23 min 5 sec

Threads: 25 Questions: 40273 Slow queries: 0 Opens: 915 Flush tables: 1 Open tables: 64 Queries per second avg: 29.078
--------------

mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
</code>

maiさんの環境は下記のエンコードになってませんか?
※:私のCentOS5.4のデフォルトが下記でした。
<code>
mysql> status
--------------
mysql Ver 14.12 Distrib 5.0.77, for redhat-linux-gnu (i686) using readline 5.1

Connection id: 694
Current database: zabbix
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 5.0.77 Source distribution
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: latin1
Db characterset: latin1
Client characterset: latin1
Conn. characterset: latin1
UNIX socket: /var/lib/mysql/mysql.sock
Uptime: 1 day 21 hours 4 min 51 sec

Threads: 13 Questions: 50260 Slow queries: 0 Opens: 168 Flush tables: 1 Open tables: 64 Queries per second avg: 0.310
--------------

mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | latin1 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
</code>

対処ですが、以下の通りで行けるかと。
私の方は途中でDB壊してしまったので、移行の検証ができませんでした。すいません。m(__)m

1.データをmysqldumpで退避させます。
<code>
# mysqldump -u root -p{ルートパスワード} -x -F {データベース名} > {ダンプファイル名}
</code>

2.mysqlを停止します。

3./etc/my.cnfに以下を追加
<code>
[mysqld]
init_connect='SET NAMES utf8'
default-character-set=utf8
innodb_file_per_table

[mysql]
default-character-set=utf8
</code>

4.mysqlを起動します。

5.データベースを再度作り直す
<code>
# mysql -u root -p{ルートパスワード} {データベース名}
mysql>drop database {データベース名};
mysql>create database zabbix;
mysql>grant all privileges on {データベース名}.* to {アカウント}@localhost identified by '{パスワード}';
mysql>flush privileges;
mysql>exit
# mysql -u root -p{ルートパスワード} {データベース名} < {ダンプファイル名}
</code>

以上でちゃんと送れるようになるかと。

ユーザー mai の写真

返信遅くなりましてすみません。
KAZさんのレスの方法で解決しました。
ありがとうございました。