Zend_LogとJphpmailerでログメール  2009年5月11日

アプリケーションのログで、ERRORレベルの場合などにメールで通知させたいケースがあったため、Zend_Logクラス用のメールライターを作成してみました。

日本語メールのため、今回はZend_Mailを利用せずにJphpmailerを使用しました。

実際の実装はBsheの以下のクラスを参考にしてください。(ダウンロードはこちら

  • ●Bshe_log_Writer_Maillog
  • ●Bshe_Log_Formatter_Maillog

writerの作成

以下のようなクラスを用意しました。

class Bshe_Log_Writer_Maillog extends Zend_Log_Writer_Abstract
{
    /**
     * ログメール送付先
     *
     * @var array
     */
    protected $mailTo = array();

    /**
     * メールのFROM
     *
     * @var array array( FROMアドレス, FROMNAME)
     */
    protected $mailFrom = array();

    /**
     * ログメールCC
     *
     * @var array
     */
    protected $mailCc = array();

    /**
     * ログメールBCC
     *
     * @var array
     */
    protected $mailBcc = array();

    /**
     * 件名の頭につける文字列
     *
     * @var string
     */
    protected $subject = "";

    /**
     * Jphpmailerクラス
     *
     * @var JPHPMailer
     */
    protected $mail;

    /**
     * Class Constructor
     *
     * メールの宛先や、件名の頭につける文字列を記載する
     *
     * @param array $mailTo
     * @param string $subject
     * @param array $mailFrom
     * @param array $mailCc
     * @param array $mailBcc
     */
    public function __construct($mailTo = array(), $subject = "", $mailFrom = array(), $mailCc = array(), $mailBcc = array())
    {
        // 宛先などアドレス情報設定
        if ($mailTo == array()) {
            // 宛先がセットされていない
            throw New Zend_Exception(‘ログメールの宛先が設定されていません。’, Zend_Log::ERR);
        }
        if ($mailFrom == array()) {
            // Fromがセットされていない
            throw New Zend_Exception(‘ログメールのFromが設定されていません。’, Zend_Log::ERR);
        }

        $this->mailTo = $mailTo;
        $this->subject = $subject;
        $this->mailFrom = $mailFrom;
        $this->mailCc = $mailCc;
        $this->mailBcc = $mailBcc;

        // Jphpmailerインスタンス化
        $this->mail = New JPHPMailer();
        $this->mail->PluginDir = ‘Jphpmailer/phpmailer/’;

        // メールの本文のフォーマットは必要な場合はFormatterにて設定する
        $this->_formatter = new Bshe_Log_Formatter_Maillog();
    }

    /**
     * 各種オプションを設定するためにメールクラスを取得する際に利用
     *
     * @return JPHPMailer
     */
    public function getMail()
    {
        return $this->mail;
    }

    /**
     * メールクラスをセット
     *
     * @param JPHPMailer $mail
     */
    public function setMail($mail)
    {
        $this->mail = $mail;
    }

    /**
     * Write a message to the log.
     *
     * @param  array  $event  event data
     * @return void
     */
    protected function _write($event)
    {
        // 本文生成
        $line = $this->_formatter->format($event);
        // 件名生成
        $subject = $this->subject;
        foreach ($event as $name => $value) {
            $subject = str_replace("%$name%", $value, $subject);
        }

        // to設定
        foreach ($this->mailTo as $strMailTo) {
            $this->mail->addTo( $strMailTo);
        }
        // cc設定
        foreach ($this->mailCc as $strMailCc) {
            $this->mail->addCc($strMailCc);
        }
        // bcc設定
        foreach ($this->mailBcc as $strMailBcc) {
            $this->mail->addBcc($strMailBcc);
        }
        // From設定
        $this->mail->setFrom($this->mailFrom[0], $this->mailFrom[1]);
        // Subject
        $this->mail->setSubject($subject);
        $this->mail->setBody($line);

        // メール送信
        if (!$this->mail->send()) {
            throw New Zend_Exception("メールが送信できませんでした。エラー:" . $mail->getErrorMessage());
        }

    }
}

Jphpmailerはこのクラスの宣言前にrequireされているものとします。

formatterを作成

class Bshe_Log_Formatter_Maillog extends Zend_Log_Formatter_Simple
{

}

今回の例ではメールの本文にログが出ればよいため、中身はからですが、メールの本文に規定の文字を入れたい場合やフォーマットを整理したい場合はこのクラスの中を実装します。

 

上記を作成することで

$logger = new Bshe_Log();
$writer = new Bshe_Log_Writer_Maillog( array(‘logadmin@itassist.info’), $subject = "Asheログメール[%priorityName%]", array(‘ログ送付先アドレス’, ‘テストログFROM’));
// ログフォーマット設定
$fomatter = New Bshe_Log_Formatter_Maillog( "ログメッセージ\r\nこのメールはAsheテスト環境プログラムから送信されています\r\n" .
    ‘%timestamp% %priorityName% (%priority%): %message%’);
$writer->setFormatter( $fomatter);
// メール設定
$mail = $writer->getMail();
$mail->IsSMTP();
$mail->Host = ‘localhost’;
$writer->setMail( $mail);
$logger->addWriter($writer);

のようにログをメールにて送付することができます。

このエントリをはてなブックマークに登録 このエントリをBuzzurlにブックマーク Yahoo!ブックマークに登録 このエントリをlivedoorクリップに登録 Deliciousにブックマーク

コメントを投稿