📄 class.phpmailer.php
字号:
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. * @access public * @return 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; if(fwrite($fp, join("", $message)) == -1) { $this->error_handler("Write to file failed"); return false; } fclose($fp); return ($msg_id . ".pqm"); } /** * Sends mail using the $Sendmail program. Returns bool. * @access private * @return 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. * @access private * @return 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->encode_header($this->Subject), $body, $header, $params); } else { $rt = @mail($to, $this->encode_header($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. * @access private * @return 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 if ($this->Helo != '') $smtp->Hello($this->Helo); else $smtp->Hello($this->get_server_hostname()); // 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(); $smtp->Close(); return true; } ///////////////////////////////////////////////// // MESSAGE CREATION METHODS ///////////////////////////////////////////////// /** * Creates recipient headers. Returns string. * @access private * @return 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. * @access private * @return 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. * @access private * @return string */ function addr_format($addr) { if(empty($addr[1])) $formatted = $addr[0]; else $formatted = sprintf('%s <%s>', $this->encode_header($addr[1], 'phrase'), $addr[0]); return $formatted; } /** * Wraps message for use with mailers that do not * automatically perform wrapping and for quoted-printable. * Original written by philippe. Returns string. * @access private * @return string */ function word_wrap($message, $length, $qp_mode = false) { if ($qp_mode) $soft_break = sprintf(" =%s", $this->LE); else $soft_break = $this->LE; $message = $this->fix_eol($message); if (substr($message, -1) == $this->LE) $message = substr($message, 0, -1); $line = explode($this->LE, $message); $message = ""; for ($i=0 ;$i < count($line); $i++) { $line_part = explode(" ", $line[$i]); $buf = ""; for ($e = 0; $e<count($line_part); $e++) { $word = $line_part[$e]; if ($qp_mode and (strlen($word) > $length)) { $space_left = $length - strlen($buf) - 1; if ($e != 0) { if ($space_left > 20) { $len = $space_left; if (substr($word, $len - 1, 1) == "=") $len--; elseif (substr($word, $len - 2, 1) == "=") $len -= 2; $part = substr($word, 0, $len); $word = substr($word, $len); $buf .= " " . $part; $message .= $buf . sprintf("=%s", $this->LE); } else { $message .= $buf . $soft_break; } $buf = ""; } while (strlen($word) > 0) { $len = $length; if (substr($word, $len - 1, 1) == "=") $len--; elseif (substr($word, $len - 2, 1) == "=") $len -= 2; $part = substr($word, 0, $len); $word = substr($word, $len); if (strlen($word) > 0) $message .= $part . sprintf("=%s", $this->LE);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -