/*
** 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
**/
実行した結果、メッセージ本体は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>
# 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
# 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
# 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
# ./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
<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>
■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
下記、正しく送信される時の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
--------------
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
--------------
KAZ - 投稿数: 1085
maiさん
使っているzabbixとアップデートの方法をもう少々教えて下さい。
・アップデート前のzabbixは本家のzabbix1.4.xをconfigureインストールされたのでしょうか?(それともzabbix-jpのrpmでしょうか?)
・アップデートした1.6は本家のzabbix1.6.xをconfigureインストールされたのでしょうか?(それともzabbix-jpのrpmでしょうか?)
・画面の表示では文字化けはないでしょうか?
mai - 投稿数: 14
有難うございます。
アップデート前のzabbixはzabbix-jpのyumでインストールしました。
zabbix1.6はzabbix-jpのyumでアップデートしました。
画面の表示で文字化けはありません。
KAZ - 投稿数: 1085
maiさん
確認1
/usr/share/zabbix/include/locales/ja_jp.inc.phpのS_HTML_CHARSETはUTF-8でしょうか?
確認2
ユーザの使用しているメディアはsendmessage.shでしょうか?
mai - 投稿数: 14
有難うございます。
確認1
/usr/share/zabbix/include/locales/ja_jp.inc.phpを確認しましたところ
'S_HTML_CHARSET'=> 'UTF-8',
でした。
確認2
sendmessage_php.shを使用しています。
ちなみに# ./sendmessage_php.sh [メールアドレス] [件名] [本文]で実行すると文字化けしませんが、実際のアラートメールでは文字化けします。
KAZ - 投稿数: 1085
maiさん
./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 - 投稿数: 14
有難うございます。
> ./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 - 投稿数: 1085
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 - 投稿数: 14
有難うございます。
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 - 投稿数: 1085
maiさん
mb_detect_encoding(対象文字列,"auto")でそうなりました?
※:mb_detect_encoding(対象文字列)とmb_detect_encoding(対象文字列,"auto")は少々返却値が異なります。
取り敢えず、ASCIIになっているのが問題だと思います。
sendmessage_php.shは問題なさそうなので、zabbix→ sendmessage_php.sh間の何かだと思うのですが…
少々、再現できるかトライしてみます。
mai - 投稿数: 14
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 - 投稿数: 1085
maiさん
ありがとうございます。
調べてみます。
ちょっと時間がかかるかもしれません。
maiさんの方でも気付いたことがあったらアップして頂けると助かります。
mai - 投稿数: 14
有難うございます。
MAIL_MESSAGEの文字コードが問題ですが、アラートメールは件名も本文も日本語が文字化けします。
KAZ - 投稿数: 1085
maiさん
下記コマンドで実行した時、ログはどうなりますか?
<code>
./sendmessage_php.sh [メールアドレス] [件名] [本文]
</code>
mai - 投稿数: 14
# ./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 - 投稿数: 1085
maiさん
原因がうまくつかめないので、CentOS5.4環境を作ってみます。
諸書の事情でちょっと時間がかかってしまいます。
すいません。m(__)m
KAZ - 投稿数: 1085
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 - 投稿数: 14
有難うございます。
yumインストールではなく、rpmインストールで送信テストを行った結果、文字化けしました。
CentOS5.4です。
kodai - 投稿数: 1341
こんにちは。
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 - 投稿数: 14
有難うございます。
■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 - 投稿数: 14
すみません。
追記ですが、phpinfo()ページを更新するとmbstring.internal_encodingが「no value」になったり「ISO-8859-1」になったりしています。
CentOS5.3で試してみましたが文字化けしました。
phpの設定がおかしいのでしょうか。
mai - 投稿数: 14
連続レスすみません。
zabbixデータベースのalertsテーブルのsubject、messageを調べたところ、zabbix1.4で作成されたレコードは文字化けしておらず、zabbix1.6で作成されたレコードは文字化けした状態で作成されているようです。
phpの設定ではなく、データベースの設定もしくはzabbix-serverにあるかもしれません。
障害が発生した時、alertsテーブルにレコードを作成するのはzabbix-serverですか?phpですか?
kodai - 投稿数: 1341
なるほど、状況理解しました。
zabbix-serverです。escalationsテーブルに保存されたメッセージのうち、アクションを実行するものをalertsテーブルにコピーしてます。
こちらでもいちど環境を作って試してみます。
KAZ - 投稿数: 1085
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 - 投稿数: 14
返信遅くなりましてすみません。
KAZさんのレスの方法で解決しました。
ありがとうございました。