<?php
/**
 * XOOPS mailer
 *
 * You may not change or alter any portion of this comment or credits
 * of supporting developers from this source code or any supporting source code
 * which is considered copyrighted (c) material of the original comment or credit authors.
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 *
 * @copyright       The XOOPS Project http://sourceforge.net/projects/xoops/
 * @license         http://www.fsf.org/copyleft/gpl.html GNU public license
 * @package         kernel
 * @since           2.0.0
 * @author          Kazumi Ono (AKA onokazu) http://www.myweb.ne.jp/, http://jp.xoops.org/
 * @version         $Id: xoopsmailer.php 4897 2010-06-19 02:55:48Z phppp $
 * @deprecated      use {@link XoopsMultiMailer} instead.
 */

defined('XOOPS_ROOT_PATH') or die('Restricted access');

xoops_loadLanguage('mail');

/**
 * The new Multimailer class that will carry out the actual sending and will later replace this class.
 * If you're writing new code, please use that class instead.
 */
include_once $GLOBALS['xoops']->path('class/mail/xoopsmultimailer.php');

/**
 * Class for sending mail.
 *
 * Changed to use the facilities of  {@link XoopsMultiMailer}
 *
 * @package class
 * @subpackage mail
 * @author Kazumi Ono <onokazu@xoops.org>
 */
class XoopsMailer
{
    /**
     * reference to a {@link XoopsMultiMailer}
     *
     * @var XoopsMultiMailer
     * @access private
     * @since 21.02.2003 14:14:13
     */
    var $multimailer;
    // sender email address
    // private
    var $fromEmail;
    // sender name
    // private
    var $fromName;
    // RMV-NOTIFY
    // sender UID
    // private
    var $fromUser;
    // array of user class objects
    // private
    var $toUsers;
    // array of email addresses
    // private
    var $toEmails;
    // custom headers
    // private
    var $headers;
    // subjet of mail
    // private
    var $subject;
    // body of mail
    // private
    var $body;
    // error messages
    // private
    var $errors;
    // messages upon success
    // private
    var $success;
    // private
    var $isMail;
    // private
    var $isPM;
    // private
    var $assignedTags;
    // private
    var $template;
    // private
    var $templatedir;
    // protected
    var $charSet = 'iso-8859-1';
    // protected
    var $encoding = '8bit';
    
    /**
     * Constructor
     *
     * @return XoopsMailer
     */
    function XoopsMailer()
    {
        $this->multimailer = new XoopsMultiMailer();
        $this->reset();
    }

    // public     // reset all properties to default    
	function setHTML($value = true)
    {
        $this->multimailer->isHTML($value);
    }

    // public
    // reset all properties to default
    function reset()
    {
        $this->fromEmail = "";
        $this->fromName = "";
        $this->fromUser = null; // RMV-NOTIFY
        $this->priority = '';
        $this->toUsers = array();
        $this->toEmails = array();
        $this->headers = array();
        $this->subject = "";
        $this->body = "";
        $this->errors = array();
        $this->success = array();
        $this->isMail = false;
        $this->isPM = false;
        $this->assignedTags = array();
        $this->template = "";
        $this->templatedir = "";
        // Change below to \r\n if you have problem sending mail
        $this->LE = "\n";
    }
    
    // public
    function setTemplateDir($value = null)
    {
        if ($value === null && is_object($GLOBALS['xoopsModule'])) {
            $value = $GLOBALS['xoopsModule']->getVar('dirname', 'n');
        } else {
            $value = str_replace(DIRECTORY_SEPARATOR, "/", $value);
        }
        $this->templatedir = $value;
    }
    
    // private
    function getTemplatePath()
    {
        if (! $path = $this->templatedir) {
            $path = XOOPS_ROOT_PATH . "/language/";
        } elseif (false === strpos($path, '/')) {
            $path = XOOPS_ROOT_PATH . "/modules/" . $path . "/language/";
        } elseif (substr($path, - 1, 1) != "/") {
            $path .= "/";
        }
        if (file_exists($path . $GLOBALS['xoopsConfig']['language'] . "/mail_template/" . $this->template)) {
            return $path . $GLOBALS['xoopsConfig']['language'] . "/mail_template/" . $this->template;
        } elseif (file_exists($path . "english/mail_template/" . $this->template)) {
            return $path . "english/mail_template/" . $this->template;
        } elseif (file_exists($path . $this->template)) {
            return $path . $this->template;
        } else {
            return false;
        }
    }
    
    // public
    function setTemplate($value)
    {
        $this->template = $value;
    }
    
    // pupblic
    function setFromEmail($value)
    {
        $this->fromEmail = trim($value);
    }
    
    // public
    function setFromName($value)
    {
        $this->fromName = trim($value);
    }
    
    // RMV-NOTIFY
    // public
    function setFromUser(&$user)
    {
        if (strtolower(get_class($user)) == "xoopsuser") {
            $this->fromUser = &$user;
        }
    }
    
    // public
    function setPriority($value)
    {
        $this->priority = trim($value);
    }
    
    // public
    function setSubject($value)
    {
        $this->subject = trim($value);
    }
    
    // public
    function setBody($value)
    {
        $this->body = trim($value);
    }
    
    // public
    function useMail()
    {
        $this->isMail = true;
    }
    
    // public
    function usePM()
    {
        $this->isPM = true;
    }
    
    // public
    function send($debug = false)
    {
        global $xoopsConfig;
        if ($this->body == "" && $this->template == "") {
            if ($debug) {
                $this->errors[] = _MAIL_MSGBODY;
            }
            return false;
        } elseif ($this->template != "") {
            $path = $this->getTemplatePath();
            if (! ($fd = @fopen($path, 'r'))) {
                if ($debug) {
                    $this->errors[] = _MAIL_FAILOPTPL;
                }
                return false;
            }
            $this->setBody(fread($fd, filesize($path)));
        }
        // for sending mail only
        if ($this->isMail || ! empty($this->toEmails)) {
            if (! empty($this->priority)) {
                $this->headers[] = "X-Priority: " . $this->priority;
            }
            // $this->headers[] = "X-Mailer: PHP/".phpversion();
            // $this->headers[] = "Return-Path: ".$this->fromEmail;
            $headers = join($this->LE, $this->headers);
        }
        // TODO: we should have an option of no-reply for private messages and emails
        // to which we do not accept replies.  e.g. the site admin doesn't want a
        // a lot of message from people trying to unsubscribe.  Just make sure to
        // give good instructions in the message.
        // add some standard tags (user-dependent tags are included later)
        global $xoopsConfig;
        
        $this->assign('X_ADMINMAIL', $xoopsConfig['adminmail']);
        $this->assign('X_SITENAME', $xoopsConfig['sitename']);
        $this->assign('X_SITEURL', XOOPS_URL . "/");
        // TODO: also X_ADMINNAME??
        // TODO: X_SIGNATURE, X_DISCLAIMER ?? - these are probably best
        // done as includes if mail templates ever get this sophisticated
        // replace tags with actual values
        foreach($this->assignedTags as $k => $v) {
            $this->body = str_replace("{" . $k . "}", $v, $this->body);
            $this->subject = str_replace("{" . $k . "}", $v, $this->subject);
        }
        $this->body = str_replace("\r\n", "\n", $this->body);
        $this->body = str_replace("\r", "\n", $this->body);
        $this->body = str_replace("\n", $this->LE, $this->body);
        // send mail to specified mail addresses, if any
        foreach($this->toEmails as $mailaddr) {
            if (! $this->sendMail($mailaddr, $this->subject, $this->body, $headers)) {
                if ($debug) {
                    $this->errors[] = sprintf(_MAIL_SENDMAILNG, $mailaddr);
                }
            } else {
                if ($debug) {
                    $this->success[] = sprintf(_MAIL_MAILGOOD, $mailaddr);
                }
            }
        }
        // send message to specified users, if any
        // NOTE: we don't send to LIST of recipients, because the tags
        // below are dependent on the user identity; i.e. each user
        // receives (potentially) a different message
        foreach($this->toUsers as $user) {
            // set some user specific variables
            $subject = str_replace("{X_UNAME}", $user->getVar("uname"), $this->subject);
            $text = str_replace("{X_UID}", $user->getVar("uid"), $this->body);
            $text = str_replace("{X_UEMAIL}", $user->getVar("email"), $text);
            $text = str_replace("{X_UNAME}", $user->getVar("uname"), $text);
            $text = str_replace("{X_UACTLINK}", XOOPS_URL . "/register.php?op=actv&id=" . $user->getVar("uid") . "&actkey=" . $user->getVar('actkey'), $text);
            // send mail
            if ($this->isMail) {
                if (! $this->sendMail($user->getVar("email"), $subject, $text, $headers)) {
                    if ($debug) {
                        $this->errors[] = sprintf(_MAIL_SENDMAILNG, $user->getVar("uname"));
                    }
                } else {
                    if ($debug) {
                        $this->success[] = sprintf(_MAIL_MAILGOOD, $user->getVar("uname"));
                    }
                }
            }
            // send private message
            if ($this->isPM) {
                if (! $this->sendPM($user->getVar("uid"), $subject, $text)) {
                    if ($debug) {
                        $this->errors[] = sprintf(_MAIL_SENDPMNG, $user->getVar("uname"));
                    }
                } else {
                    if ($debug) {
                        $this->success[] = sprintf(_MAIL_PMGOOD, $user->getVar("uname"));
                    }
                }
            }
            flush();
        }
        if (count($this->errors) > 0) {
            return false;
        }
        return true;
    }
    
    // private
    function sendPM($uid, $subject, $body)
    {
        global $xoopsUser;
        $pm_handler = &xoops_gethandler('privmessage');
        $pm = &$pm_handler->create();
        $pm->setVar("subject", $subject);
        // RMV-NOTIFY
        $pm->setVar('from_userid', ! empty($this->fromUser) ? $this->fromUser->getVar('uid') : (empty($xoopsUser) ? 1 : $xoopsUser->getVar('uid')));
        $pm->setVar("msg_text", $body);
        $pm->setVar("to_userid", $uid);
        if (! $pm_handler->insert($pm)) {
            return false;
        }
        return true;
    }
    
    /**
     * Send email
     *
     * Uses the new XoopsMultiMailer
     *
     * @param string $
     * @param string $
     * @param string $
     * @return boolean FALSE on error.
     */
    
    function sendMail($email, $subject, $body, $headers)
    {
        $subject = $this->encodeSubject($subject);
        $this->encodeBody($body);
        $this->multimailer->ClearAllRecipients();
        $this->multimailer->AddAddress($email);
        $this->multimailer->Subject = $subject;
        $this->multimailer->Body = $body;
        $this->multimailer->CharSet = $this->charSet;
        $this->multimailer->Encoding = $this->encoding;
        if (! empty($this->fromName)) {
            $this->multimailer->FromName = $this->encodeFromName($this->fromName);
        }
        if (! empty($this->fromEmail)) {
            $this->multimailer->Sender = $this->multimailer->From = $this->fromEmail;
        }
        
        $this->multimailer->ClearCustomHeaders();
        foreach($this->headers as $header) {
            $this->multimailer->AddCustomHeader($header);
        }
        if (! $this->multimailer->Send()) {
            $this->errors[] = $this->multimailer->ErrorInfo;
            return false;
        }
        return true;
    }
    
    // public
    function getErrors($ashtml = true)
    {
        if (! $ashtml) {
            return $this->errors;
        } else {
            if (! empty($this->errors)) {
                $ret = "<h4>" . _ERRORS . "</h4>";
                foreach($this->errors as $error) {
                    $ret .= $error . "<br />";
                }
            } else {
                $ret = "";
            }
            return $ret;
        }
    }
    
    // public
    function getSuccess($ashtml = true)
    {
        if (! $ashtml) {
            return $this->success;
        } else {
            $ret = "";
            if (! empty($this->success)) {
                foreach($this->success as $suc) {
                    $ret .= $suc . "<br />";
                }
            }
            return $ret;
        }
    }
    
    // public
    function assign($tag, $value = null)
    {
        if (is_array($tag)) {
            foreach($tag as $k => $v) {
                $this->assign($k, $v);
            }
        } else {
            if (! empty($tag) && isset($value)) {
                $tag = strtoupper(trim($tag));
                // RMV-NOTIFY
                // TEMPORARY FIXME: until the X_tags are all in here
                // if ( substr($tag, 0, 2) != "X_" ) {
                $this->assignedTags[$tag] = $value;
                // }
            }
        }
    }
    
    // public
    function addHeaders($value)
    {
        $this->headers[] = trim($value) . $this->LE;
    }
    
    // public
    function setToEmails($email)
    {
        if (! is_array($email)) {
            if (preg_match("/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+([\.][a-z0-9-]+)+$/i", $email)) {
                array_push($this->toEmails, $email);
            }
        } else {
            foreach($email as $e) {
                $this->setToEmails($e);
            }
        }
    }
    
    // public
    function setToUsers(&$user)
    {
        if (! is_array($user)) {
            if (strtolower(get_class($user)) == "xoopsuser") {
                array_push($this->toUsers, $user);
            }
        } else {
            foreach($user as $u) {
                $this->setToUsers($u);
            }
        }
    }
    
    // public
    function setToGroups($group)
    {
        if (! is_array($group)) {
            if (strtolower(get_class($group)) == "xoopsgroup") {
                $member_handler = &xoops_gethandler('member');
                $this->setToUsers($member_handler->getUsersByGroup($group->getVar('groupid'), true));
            }
        } else {
            foreach($group as $g) {
                $this->setToGroups($g);
            }
        }
    }
    
    // abstract
    // to be overidden by lang specific mail class, if needed
    function encodeFromName($text)
    {
        return $text;
    }
    
    // abstract
    // to be overidden by lang specific mail class, if needed
    function encodeSubject($text)
    {
        return $text;
    }
    
    // abstract
    // to be overidden by lang specific mail class, if needed
    function encodeBody(&$text)
    {
    }
}

?>