sendmessage_smtp_php.shのエラー出力について
いつもお世話になっております。
サポートが切れていることは承知しておりますが、
可能でしたらタイトルの件についてご教授頂きたく宜しくお願い致します。
Ver:Zabbix 2.4.8
OS:CentOS6.2
メールを送信する際にsendmessage_smtp_php.shを利用しております。
http://www.zabbix.jp/node/1441
しかし、最近になり発信されたはずの障害メールが不定期で消失する現象が発生しており、
原因特定を行っておりますが、送信に使用しているメールサーバを確認することが出来ない環境のため、
調査が難航しております。
メールサーバ側でセキュリティソフトの影響で弾かれている可能性が高いと思いつつも、
もしかしたらsendmessage_smtp_php.shにてメールサーバへSMTP AUTHで認証を行う際、
Timeout等で送れていないのではないかとも考えております。
そこで、sendmessage_smtp_php.sh実行時の結果をログ出力したいのですが、
当方PHPの知識がないため難航しております。
何かしら良い方法はございますでしょうか。
wakaba - 投稿数: 228
広瀬です
こんな感じですか?
======= 変更前のスクリプト ========
if(!$mailer->Send()){
print "failed: " . $mailer->ErrorInfo . "\n";
}else{
print "success" . "\n";
}
======= 変更前のスクリプト ========
======= 変更後のスクリプト ========
if(!$mailer->Send()){
#print "failed: " . $mailer->ErrorInfo . "\n";
$timestamp = time();
$timestamp = date( "Y/m/d H:i:s P" , $timestamp );
file_put_contents("sample.txt", "$timestamp failed: $mailer->ErrorInfo \n", FILE_APPEND);
}else{
#print "success" . "\n";
$timestamp = time();
$timestamp = date( "Y/m/d H:i:s P" , $timestamp );
file_put_contents("sample.txt", "$timestamp success\n", FILE_APPEND);
}
======= 変更後のスクリプト ========
スクリプトの最後あたりのコードを適当に書き換えてみました。
ファイルはスクリプト直下に吐き出されますので、適宜変更してみてください。
ファイルは追記型(FILE_APPEND)+日時が付与されるようにしました。
尚、このスクリプトの欠点と言いますか、仕様上の問題ですが引き渡し先のメールサーバが
受け取ってしまった場合、エラーにはなりません。要するに、送信「先」アドレスが間違っていても気づけません。
①明らかにメールサーバ指定間違い
②メールサーバが障害で止まっている(ネットワーク不具合含む)
③SMTP Auth利用していて認証失敗した
などなど・・・明らかに情報が引き渡せない場合のみに有効なので、SMTPエラーコードで言うなら554とか4XXは
対処出来ませんので、その場合はメールサーバのログをやはり見るしか有りません。
あと一つ、スクリプトの先に一段メールサーバを噛ましては如何でしょうか?
ZABBIX ⇒ スクリプト ⇒ ローカルのPostfix ⇒リレー⇒ 指定メールサーバー
んな想定です。スクリプトのHostをローカルのPostfixに指定してやれば良いです。SMTP Authとか
も必要ないので、SMTP Authのところはtrueからfalseにするだけです。
これなら、送信先アドレス間違いを為た場合や、携帯などを宛先にした場合のエラーくらいの分別は
たぶん、ローカルのPostfixのログから解るんじゃないでしょうか?
kaeru - 投稿数: 263
>>広瀬様
ご回答ありがとうございます。
頂いたスクリプトで出力できました!
postfixも試してみようと思ったんですが
postfixを起動するとなるとセキュリティ周りのしがらみがあり、
送信「先」アドレスは現状間違いなく、
通常は送れているが不定期で送れなくなるという事象背景から
上記の通りスクリプトにて対応致しました。
重ねてご対応ありがとうございました。
wakaba - 投稿数: 228
広瀬です
ご希望に沿えたようで何よりです。PHPに詳しい人からすれば
「何コレ(゜д゜)?」
とか言われそうでアレなんですけどね・・・私の本業はPGじゃないのでご勘弁を
二点ほどですが、ログローテーションの対応、大量のメール通知がなされた場合の
処理遅延、負荷等は一切考慮されていませんので、そこはご了承ください
念のためですが、宛先間違い以外でも同じSMTPエラーコードで返す場合もあります。
例えば、メールボックスフルとかアカウント無効にされているとか、送信先のシステム
によりそれはマチマチなんですが、代表とされる5XXエラーはかなり広範に出てきます。
あとは携帯アドレス宛はキャリアでメールヘッダーや本文を解析してスパム扱いとして
差し戻すなどという場合もありますね。この辺はDNSも若干関わります<SPF入れてないとダメとか
まぁ、環境要素も大きいので、切り分け程度には確かに使えるかとは思いますが、メール
システムのトラブル解決の本質はやはり生ログを見るのが手っ取り早いとは思いますので、
そこは何とか頑張ってみてください(理由は何となく察しますが・・・)。
kaeru - 投稿数: 263
>>広瀬様
フォローアップありがとうございます。
>二点ほどですが、ログローテーションの対応、大量のメール通知がなされた場合の
>処理遅延、負荷等は一切考慮されていませんので、そこはご了承ください
ありがとうございます。
ログについては頂いたスクリプトの吐き出し先をsyslogにしましたので問題無いかと思います。
メール諸々も留意しておきます。
>まぁ、環境要素も大きいので、切り分け程度には確かに使えるかとは思いますが、メール
> システムのトラブル解決の本質はやはり生ログを見るのが手っ取り早いとは思いますので、
>そこは何とか頑張ってみてください(理由は何となく察しますが・・・)。
直接ログ見られればいいのですが、
ご推察の通り契約だとかコンプライアンスだとかいったしがらみが…。
逆に考えればZabbixからメールサーバへ間違いなく送信できているのであれば
メールサーバから先の問題であると切り分けできるので
修正したスクリプトで状況確認を行います。