📄 class.phpmailer.php
字号:
$this->ReplyTo[$cur][0] = trim($address);
$this->ReplyTo[$cur][1] = $name;
}
/////////////////////////////////////////////////
// MAIL SENDING METHODS
/////////////////////////////////////////////////
/**
* Creates message and assigns Mailer. If the message is
* not sent successfully then it returns false. Use the ErrorInfo
* variable to view description of the error. Returns bool.
* @public
* @returns bool
*/
function Send() {
$header = "";
$body = "";
if((count($this->to) + count($this->cc) + count($this->bcc)) < 1)
{
$this->error_handler("You must provide at least one recipient email address");
return false;
}
// Set whether the message is multipart/alternative
if(!empty($this->AltBody))
$this->ContentType = "multipart/alternative";
// Attach sender information & date
$header = $this->received();
$header .= sprintf("Date: %s%s", $this->rfc_date(), $this->LE);
$header .= $this->create_header();
if(!$body = $this->create_body())
return false;
//echo "<pre>".$header . $body . "</pre>"; // debugging
// Choose the mailer
if($this->Mailer == "sendmail")
{
if(!$this->sendmail_send($header, $body))
return false;
}
elseif($this->Mailer == "mail")
{
if(!$this->mail_send($header, $body))
return false;
}
elseif($this->Mailer == "smtp")
{
if(!$this->smtp_send($header, $body))
return false;
}
else
{
$this->error_handler(sprintf("%s mailer is not supported", $this->Mailer));
return false;
}
return true;
}
/**
* Sends mail message to an assigned queue directory. Has an optional
* sendTime argument. This is used when the user wants the
* message to be sent from the queue at a predetermined time.
* The data must be a valid timestamp like that returned from
* the time() or strtotime() functions. Returns false on failure
* or the message file name if success.
* @public
* @returns string
*/
function SendToQueue($queue_path, $send_time = 0) {
$message = array();
$header = "";
$body = "";
// If invalid or empty just set to the current time
if($send_time == 0)
$send_time = time();
if(!is_dir($queue_path))
{
$this->error_handler("The supplied queue directory does not exist");
return false;
}
if((count($this->to) + count($this->cc) + count($this->bcc)) < 1)
{
$this->error_handler("You must provide at least one recipient email address");
return false;
}
// Set whether the message is multipart/alternative
if(!empty($this->AltBody))
$this->ContentType = "multipart/alternative";
$header = $this->create_header();
if(!$body = $this->create_body())
return false;
// Seed randomizer
mt_srand(time());
$msg_id = md5(uniqid(mt_rand()));
$fp = fopen($queue_path . $msg_id . ".pqm", "wb");
if(!$fp)
{
$this->error_handler(sprintf("Could not write to %s directory", $queue_path));
return false;
}
$message[] = sprintf("----START PQM HEADER----%s", $this->LE);
$message[] = sprintf("SendTime: %s%s", $send_time, $this->LE);
$message[] = sprintf("Mailer: %s%s", $this->Mailer, $this->LE);
// Choose the mailer
if($this->Mailer == "sendmail")
{
$message[] = sprintf("Sendmail: %s%s", $this->Sendmail, $this->LE);
$message[] = sprintf("Sender: %s%s", $this->Sender, $this->LE);
}
elseif($this->Mailer == "mail")
{
$message[] = sprintf("Sender: %s%s", $this->Sender, $this->LE);
$message[] = sprintf("Subject: %s%s", $this->Subject, $this->LE);
$message[] = sprintf("to: %s%s", $this->addr_list($this->to), $this->LE);
}
elseif($this->Mailer == "smtp")
{
$message[] = sprintf("Host: %s%s", $this->Host, $this->LE);
$message[] = sprintf("Port: %d%s", $this->Port, $this->LE);
$message[] = sprintf("Helo: %s%s", $this->Helo, $this->LE);
$message[] = sprintf("Timeout: %d%s", $this->Timeout, $this->LE);
if($this->SMTPAuth)
$auth_no = 1;
else
$auth_no = 0;
$message[] = sprintf("SMTPAuth: %d%s", $auth_no, $this->LE);
$message[] = sprintf("Username: %s%s", $this->Username, $this->LE);
$message[] = sprintf("Password: %s%s", $this->Password, $this->LE);
$message[] = sprintf("From: %s%s", $this->From, $this->LE);
$message[] = sprintf("to: %s%s", $this->addr_list($this->to), $this->LE);
$message[] = sprintf("cc: %s%s", $this->addr_list($this->cc), $this->LE);
$message[] = sprintf("bcc: %s%s", $this->addr_list($this->bcc), $this->LE);
}
else
{
$this->error_handler(sprintf("%s mailer is not supported", $this->Mailer));
return false;
}
$message[] = sprintf("----END PQM HEADER----%s", $this->LE); // end of pqm header
$message[] = $header;
$message[] = $body;
fwrite($fp, join("", $message));
return ($msg_id . ".pqm");
}
/**
* Sends mail using the $Sendmail program. Returns bool.
* @private
* @returns bool
*/
function sendmail_send($header, $body) {
if ($this->Sender != "")
$sendmail = sprintf("%s -oi -f %s -t", $this->Sendmail, $this->Sender);
else
$sendmail = sprintf("%s -oi -t", $this->Sendmail);
if(!@$mail = popen($sendmail, "w"))
{
$this->error_handler(sprintf("Could not execute %s", $this->Sendmail));
return false;
}
fputs($mail, $header);
fputs($mail, $body);
$result = pclose($mail) >> 8 & 0xFF;
if($result != 0)
{
$this->error_handler(sprintf("Could not execute %s", $this->Sendmail));
return false;
}
return true;
}
/**
* Sends mail using the PHP mail() function. Returns bool.
* @private
* @returns bool
*/
function mail_send($header, $body) {
//$to = substr($this->addr_append("To", $this->to), 4, -2);
// Cannot add Bcc's to the $to
$to = $this->to[0][0]; // no extra comma
for($i = 1; $i < count($this->to); $i++)
$to .= sprintf(",%s", $this->to[$i][0]);
if ($this->Sender != "" && PHP_VERSION >= "4.0")
{
$old_from = ini_get("sendmail_from");
ini_set("sendmail_from", $this->Sender);
}
if ($this->Sender != "" && PHP_VERSION >= "4.0.5")
{
// The fifth parameter to mail is only available in PHP >= 4.0.5
$params = sprintf("-oi -f %s", $this->Sender);
$rt = @mail($to, $this->Subject, $body, $header, $params);
}
else
{
$rt = @mail($to, $this->Subject, $body, $header);
}
if (isset($old_from))
ini_set("sendmail_from", $old_from);
if(!$rt)
{
$this->error_handler("Could not instantiate mail()");
return false;
}
return true;
}
/**
* Sends mail via SMTP using PhpSMTP (Author:
* Chris Ryan). Returns bool. Returns false if there is a
* bad MAIL FROM, RCPT, or DATA input.
* @private
* @returns bool
*/
function smtp_send($header, $body) {
// Include SMTP class code, but not twice
include_once($this->PluginDir . "class.smtp.php");
$smtp = new SMTP;
$smtp->do_debug = $this->SMTPDebug;
// Try to connect to all SMTP servers
$hosts = explode(";", $this->Host);
$index = 0;
$connection = false;
$smtp_from = "";
$bad_rcpt = array();
$e = "";
// Retry while there is no connection
while($index < count($hosts) && $connection == false)
{
if(strstr($hosts[$index], ":"))
list($host, $port) = explode(":", $hosts[$index]);
else
{
$host = $hosts[$index];
$port = $this->Port;
}
if($smtp->Connect($host, $port, $this->Timeout))
$connection = true;
//printf("%s host could not connect<br>", $hosts[$index]); //debug only
$index++;
}
if(!$connection)
{
$this->error_handler("SMTP Error: could not connect to SMTP host server(s)");
return false;
}
// Must perform HELO before authentication
$smtp->Hello($this->Helo);
// If user requests SMTP authentication
if($this->SMTPAuth)
{
if(!$smtp->Authenticate($this->Username, $this->Password))
{
$this->error_handler("SMTP Error: Could not authenticate");
return false;
}
}
if ($this->Sender == "")
$smtp_from = $this->From;
else
$smtp_from = $this->Sender;
if(!$smtp->Mail(sprintf("<%s>", $smtp_from)))
{
$e = sprintf("SMTP Error: From address [%s] failed", $smtp_from);
$this->error_handler($e);
return false;
}
// Attempt to send attach all recipients
for($i = 0; $i < count($this->to); $i++)
{
if(!$smtp->Recipient(sprintf("<%s>", $this->to[$i][0])))
$bad_rcpt[] = $this->to[$i][0];
}
for($i = 0; $i < count($this->cc); $i++)
{
if(!$smtp->Recipient(sprintf("<%s>", $this->cc[$i][0])))
$bad_rcpt[] = $this->cc[$i][0];
}
for($i = 0; $i < count($this->bcc); $i++)
{
if(!$smtp->Recipient(sprintf("<%s>", $this->bcc[$i][0])))
$bad_rcpt[] = $this->bcc[$i][0];
}
// Create error message
if(count($bad_rcpt) > 0)
{
for($i = 0; $i < count($bad_rcpt); $i++)
{
if($i != 0)
$e .= ", ";
$e .= $bad_rcpt[$i];
}
$e = sprintf("SMTP Error: The following recipients failed [%s]", $e);
$this->error_handler($e);
return false;
}
if(!$smtp->Data(sprintf("%s%s", $header, $body)))
{
$this->error_handler("SMTP Error: Data not accepted");
return false;
}
$smtp->Quit();
return true;
}
/////////////////////////////////////////////////
// MESSAGE CREATION METHODS
/////////////////////////////////////////////////
/**
* Creates recipient headers. Returns string.
* @private
* @returns string
*/
function addr_append($type, $addr) {
$addr_str = $type . ": ";
$addr_str .= $this->addr_format($addr[0]);
if(count($addr) > 1)
{
for($i = 1; $i < count($addr); $i++)
{
$addr_str .= sprintf(", %s", $this->addr_format($addr[$i]));
}
$addr_str .= $this->LE;
}
else
$addr_str .= $this->LE;
return($addr_str);
}
/**
* Creates a semicolon delimited list for use in pqm files.
* @private
* @returns string
*/
function addr_list($list_array) {
$addr_list = "";
for($i = 0; $i < count($list_array); $i++)
{
if($i > 0)
$addr_list .= ";";
$addr_list .= $list_array[$i][0];
}
return $addr_list;
}
/**
* Formats an address correctly.
* @private
* @returns string
*/
function addr_format($addr) {
if(empty($addr[1]))
$formatted = $addr[0];
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -