📄 xoopsmailer.php
字号:
<?php
// $Id: xoopsmailer.php 1029 2007-09-09 03:49:25Z phppp $
// ------------------------------------------------------------------------ //
// XOOPS - PHP Content Management System //
// Copyright (c) 2000 XOOPS.org //
// <http://www.xoops.org/> //
// ------------------------------------------------------------------------ //
// This program is free software; you can redistribute it and/or modify //
// it under the terms of the GNU General Public License as published by //
// the Free Software Foundation; either version 2 of the License, or //
// (at your option) any later version. //
// //
// 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. See the //
// GNU General Public License for more details. //
// //
// You should have received a copy of the GNU General Public License //
// along with this program; if not, write to the Free Software //
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA //
// ------------------------------------------------------------------------ //
// Author: Kazumi Ono (AKA onokazu) //
// URL: http://www.myweb.ne.jp/, http://www.xoops.org/, http://jp.xoops.org/ //
// Project: The XOOPS Project //
// ------------------------------------------------------------------------- //
if (!defined("XOOPS_ROOT_PATH")) {
die("XOOPS root path not defined");
}
if (isset($GLOBALS['xoopsConfig']['language']) && file_exists(XOOPS_ROOT_PATH.'/language/'.$GLOBALS['xoopsConfig']['language'].'/mail.php')) {
include_once XOOPS_ROOT_PATH.'/language/'.$GLOBALS['xoopsConfig']['language'].'/mail.php';
} else {
include_once XOOPS_ROOT_PATH.'/language/english/mail.php';
}
/**
* 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(XOOPS_ROOT_PATH."/class/mail/xoopsmultimailer.php");
/**
* Class for sending mail.
*
* Changed to use the facilities of {@link XoopsMultiMailer}
*
* @deprecated use {@link XoopsMultiMailer} instead.
*
* @package class
* @subpackage mail
*
* @author Kazumi Ono <onokazu@xoops.org>
* @copyright (c) 2000-2003 The Xoops Project - www.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';
function XoopsMailer()
{
$this->multimailer = new XoopsMultiMailer();
$this->reset();
}
// 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)
{
if ( substr($value, -1, 1) != "/" ) {
$value .= "/";
}
$this->templatedir = $value;
}
// 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->templatedir != "" ) ? $this->templatedir."".$this->template : (XOOPS_ROOT_PATH."/language/".$xoopsConfig['language']."/mail_template/".$this->template);
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."/user.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') : $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)
{
}
}
?>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -