PHP实现邮件自动发送

2024-06-30 05:05:37

调用邮件类的demo

<?php
require 'phpmailer.class.php';
$subject = 'My Subject';
$email = 'This is the content.';# smtp服务器地址, 如smtp.qq.com
$host = 'smtp.qq.com';
# 发件人名称
$fromname = '';
# 发件人地址和收件人地址填你的邮箱
$from = '';
$to = '';
# 你邮箱账号
$username = $from;
$passwd = '';
$mailer = new PHPMailer(true);
$mailer->IsHTML(true);
$mailer->IsSMTP(true);
#$mailer->SMTPDebug = true;
$mailer->CharSet = 'UTF-8';
$mailer->Encoding = 'base64';
$mailer->FromName = $fromname;
$mailer->Host = $host;
$mailer->AddAddress($to);
$mailer->From = $from;
$mailer->Subject = $subject;
$mailer->MsgHTML($email);
$mailer->SMTPAuth = true;
$mailer->Username = $username;
$mailer->Password = $passwd;
try{$mailer->Send();
} catch (phpmailerException $e) {// 发送失败, 处理你的异常
}

邮件类

<?php
/*~ phpmailer.class.php
.---------------------------------------------------------------------------.
|  Software: PHPMailer - PHP email class                                    |
|   Version: 5.2.1                                                          |
|      Site: https://code.google.com/a/apache-extras.org/p/phpmailer/       |
| ------------------------------------------------------------------------- |
|     Admin: Jim Jagielski (project admininistrator)                        |
|   Authors: Andy Prevost (codeworxtech) codeworxtech@users.sourceforge.net |
|          : Marcus Bointon (coolbru) coolbru@users.sourceforge.net         |
|          : Jim Jagielski (jimjag) jimjag@gmail.com                        |
|   Founder: Brent R. Matzelle (original founder)                           |
| Copyright (c) 2010-2012, Jim Jagielski. All Rights Reserved.              |
| Copyright (c) 2004-2009, Andy Prevost. All Rights Reserved.               |
| Copyright (c) 2001-2003, Brent R. Matzelle                                |
| ------------------------------------------------------------------------- |
|   License: Distributed under the Lesser General Public License (LGPL)     |
|            http://www.gnu.org/copyleft/lesser.html                        |
| This program is distributed in the hope that it will be useful - WITHOUT  |
| ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or     |
| FITNESS FOR A PARTICULAR PURPOSE.                                         |
'---------------------------------------------------------------------------'
*/
/*** PHPMailer - PHP email transport class* NOTE: Requires PHP version 5 or later* @package PHPMailer* @author Andy Prevost* @author Marcus Bointon* @author Jim Jagielski* @copyright 2010 - 2012 Jim Jagielski* @copyright 2004 - 2009 Andy Prevost* @version $Id: phpmailer.class.php 450 2010-06-23 16:46:33Z coolbru $* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License*/
if (version_compare(PHP_VERSION, '5.0.0', '<') ) exit("Sorry, this version of PHPMailer will only run on PHP version 5 or greater!\n");
class PHPMailer {/// PROPERTIES, PUBLIC//*** Email priority (1 = High, 3 = Normal, 5 = low).* @var int*/public $Priority          = 3;/*** Sets the CharSet of the message.* @var string*/public $CharSet           = 'iso-8859-1';/*** Sets the Content-type of the message.* @var string*/public $ContentType       = 'text/plain';/*** Sets the Encoding of the message. Options for this are*  "8bit", "7bit", "binary", "base64", and "quoted-printable".* @var string*/public $Encoding          = '8bit';/*** Holds the most recent mailer error message.* @var string*/public $ErrorInfo         = '';/*** Sets the From email address for the message.* @var string*/public $From              = 'root@localhost';/*** Sets the From name of the message.* @var string*/public $FromName          = 'Root User';/*** Sets the Sender email (Return-Path) of the message.  If not empty,* will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.* @var string*/public $Sender            = '';/*** Sets the Subject of the message.* @var string*/public $Subject           = '';/*** Sets the Body of the message.  This can be either an HTML or text body.* If HTML then run IsHTML(true).* @var string*/public $Body              = '';/*** Sets the text-only body of the message.  This automatically sets the* email to multipart/alternative.  This body can be read by mail* clients that do not have HTML email capability such as mutt. Clients* that can read HTML will view the normal Body.* @var string*/public $AltBody           = '';/*** Stores the complete compiled MIME message body.* @var string* @access protected*/protected $MIMEBody       = '';/*** Stores the complete compiled MIME message headers.* @var string* @access protected*/protected $MIMEHeader     = '';/*** Stores the complete sent MIME message (Body and Headers)* @var string* @access protected*/protected $SentMIMEMessage     = '';/*** Sets word wrapping on the body of the message to a given number of* characters.* @var int*/public $WordWrap          = 0;/*** Method to send mail: ("mail", "sendmail", or "smtp").* @var string*/public $Mailer            = 'mail';/*** Sets the path of the sendmail program.* @var string*/public $Sendmail          = '/usr/sbin/sendmail';/*** Path to PHPMailer plugins.  Useful if the SMTP class* is in a different directory than the PHP include path.* @var string*/public $PluginDir         = '';/*** Sets the email address that a reading confirmation will be sent.* @var string*/public $ConfirmReadingTo  = '';/*** Sets the hostname to use in Message-Id and Received headers* and as default HELO string. If empty, the value returned* by SERVER_NAME is used or 'localhost.localdomain'.* @var string*/public $Hostname          = '';/*** Sets the message ID to be used in the Message-Id header.* If empty, a unique id will be generated.* @var string*/public $MessageID         = '';/// PROPERTIES FOR SMTP//*** Sets the SMTP hosts.  All hosts must be separated by a* semicolon.  You can also specify a different port* for each host by using this format: [hostname:port]* (e.g. "smtp1.example.com:25;smtp2.example.com").* Hosts will be tried in order.* @var string*/public $Host          = 'localhost';/*** Sets the default SMTP server port.* @var int*/public $Port          = 25;/*** Sets the SMTP HELO of the message (Default is $Hostname).* @var string*/public $Helo          = '';/*** Sets connection prefix.* Options are "", "ssl" or "tls"* @var string*/public $SMTPSecure    = '';/*** Sets SMTP authentication. Utilizes the Username and Password variables.* @var bool*/public $SMTPAuth      = false;/*** Sets SMTP username.* @var string*/public $Username      = '';/*** Sets SMTP password.* @var string*/public $Password      = '';/*** Sets the SMTP server timeout in seconds.* This function will not work with the win32 version.* @var int*/public $Timeout       = 10;/*** Sets SMTP class debugging on or off.* @var bool*/public $SMTPDebug     = false;/*** Prevents the SMTP connection from being closed after each mail* sending.  If this is set to true then to close the connection* requires an explicit call to SmtpClose().* @var bool*/public $SMTPKeepAlive = false;/*** Provides the ability to have the TO field process individual* emails, instead of sending to entire TO addresses* @var bool*/public $SingleTo      = false;/*** If SingleTo is true, this provides the array to hold the email addresses* @var bool*/public $SingleToArray = array();/*** Provides the ability to change the line ending* @var string*/public $LE              = "\n";/*** Used with DKIM DNS Resource Record* @var string*/public $DKIM_selector   = 'phpmailer';/*** Used with DKIM DNS Resource Record* optional, in format of email address 'you@yourdomain.com'* @var string*/public $DKIM_identity   = '';/*** Used with DKIM DNS Resource Record* @var string*/public $DKIM_passphrase   = '';/*** Used with DKIM DNS Resource Record* optional, in format of email address 'you@yourdomain.com'* @var string*/public $DKIM_domain     = '';/*** Used with DKIM DNS Resource Record* optional, in format of email address 'you@yourdomain.com'* @var string*/public $DKIM_private    = '';/*** Callback Action function name* the function that handles the result of the send email action. Parameters:*   bool    $result        result of the send action*   string  $to            email address of the recipient*   string  $cc            cc email addresses*   string  $bcc           bcc email addresses*   string  $subject       the subject*   string  $body          the email body* @var string*/public $action_function = ''; //'callbackAction';/*** Sets the PHPMailer Version number* @var string*/public $Version         = '5.2.1';/*** What to use in the X-Mailer header* @var string*/public $XMailer         = '';/// PROPERTIES, PRIVATE AND PROTECTED/protected   $smtp           = NULL;protected   $to             = array();protected   $cc             = array();protected   $bcc            = array();protected   $ReplyTo        = array();protected   $all_recipients = array();protected   $p_w_upload     = array();protected   $CustomHeader   = array();protected   $message_type   = '';protected   $boundary       = array();protected   $language       = array();protected   $error_count    = 0;protected   $sign_cert_file = '';protected   $sign_key_file  = '';protected   $sign_key_pass  = '';protected   $exceptions     = false;/// CONSTANTS/const STOP_MESSAGE  = 0; // message only, continue processingconst STOP_CONTINUE = 1; // message?, likely ok to continue processingconst STOP_CRITICAL = 2; // message, plus full stop, critical error reached/// METHODS, VARIABLES//*** Constructor* @param boolean $exceptions Should we throw external exceptions?*/public function __construct($exceptions = false) {$this->exceptions = ($exceptions == true);}/*** Sets message type to HTML.* @param bool $ishtml* @return void*/public function IsHTML($ishtml = true) {if ($ishtml) {$this->ContentType = 'text/html';} else {$this->ContentType = 'text/plain';}}/*** Sets Mailer to send message using SMTP.* @return void*/public function IsSMTP() {$this->Mailer = 'smtp';}/*** Sets Mailer to send message using PHP mail() function.* @return void*/public function IsMail() {$this->Mailer = 'mail';}/*** Sets Mailer to send message using the $Sendmail program.* @return void*/public function IsSendmail() {if (!stristr(ini_get('sendmail_path'), 'sendmail')) {$this->Sendmail = '/var/qmail/bin/sendmail';}$this->Mailer = 'sendmail';}/*** Sets Mailer to send message using the qmail MTA.* @return void*/public function IsQmail() {if (stristr(ini_get('sendmail_path'), 'qmail')) {$this->Sendmail = '/var/qmail/bin/sendmail';}$this->Mailer = 'sendmail';}/// METHODS, RECIPIENTS//*** Adds a "To" address.* @param string $address* @param string $name* @return boolean true on success, false if address already used*/public function AddAddress($address, $name = '') {return $this->AddAnAddress('to', $address, $name);}/*** Adds a "Cc" address.* Note: this function works with the SMTP mailer on win32, not with the "mail" mailer.* @param string $address* @param string $name* @return boolean true on success, false if address already used*/public function AddCC($address, $name = '') {return $this->AddAnAddress('cc', $address, $name);}/*** Adds a "Bcc" address.* Note: this function works with the SMTP mailer on win32, not with the "mail" mailer.* @param string $address* @param string $name* @return boolean true on success, false if address already used*/public function AddBCC($address, $name = '') {return $this->AddAnAddress('bcc', $address, $name);}/*** Adds a "Reply-to" address.* @param string $address* @param string $name* @return boolean*/public function AddReplyTo($address, $name = '') {return $this->AddAnAddress('Reply-To', $address, $name);}/*** Adds an address to one of the recipient arrays* Addresses that have been added already return false, but do not throw exceptions* @param string $kind One of 'to', 'cc', 'bcc', 'ReplyTo'* @param string $address The email address to send to* @param string $name* @return boolean true on success, false if address already used or invalid in some way* @access protected*/protected function AddAnAddress($kind, $address, $name = '') {if (!preg_match('/^(to|cc|bcc|Reply-To)$/', $kind)) {$this->SetError($this->Lang('Invalid recipient array').': '.$kind);if ($this->exceptions) {throw new phpmailerException('Invalid recipient array: ' . $kind);}if ($this->SMTPDebug) {echo $this->Lang('Invalid recipient array').': '.$kind;}return false;}$address = trim($address);$name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trimif (!self::ValidateAddress($address)) {$this->SetError($this->Lang('invalid_address').': '. $address);if ($this->exceptions) {throw new phpmailerException($this->Lang('invalid_address').': '.$address);}if ($this->SMTPDebug) {echo $this->Lang('invalid_address').': '.$address;}return false;}if ($kind != 'Reply-To') {if (!isset($this->all_recipients[strtolower($address)])) {array_push($this->$kind, array($address, $name));$this->all_recipients[strtolower($address)] = true;return true;}} else {if (!array_key_exists(strtolower($address), $this->ReplyTo)) {$this->ReplyTo[strtolower($address)] = array($address, $name);return true;}}return false;
}
/*** Set the From and FromName properties* @param string $address* @param string $name* @return boolean*/public function SetFrom($address, $name = '', $auto = 1) {$address = trim($address);$name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trimif (!self::ValidateAddress($address)) {$this->SetError($this->Lang('invalid_address').': '. $address);if ($this->exceptions) {throw new phpmailerException($this->Lang('invalid_address').': '.$address);}if ($this->SMTPDebug) {echo $this->Lang('invalid_address').': '.$address;}return false;}$this->From = $address;$this->FromName = $name;if ($auto) {if (empty($this->ReplyTo)) {$this->AddAnAddress('Reply-To', $address, $name);}if (empty($this->Sender)) {$this->Sender = $address;}}return true;}/*** Check that a string looks roughly like an email address should* Static so it can be used without instantiation* Tries to use PHP built-in validator in the filter extension (from PHP 5.2), falls back to a reasonably competent regex validator* Conforms approximately to RFC2822* @link http://www.hexillion.com/samples/#Regex Original pattern found here* @param string $address The email address to check* @return boolean* @static* @access public*/public static function ValidateAddress($address) {if (function_exists('filter_var')) { //Introduced in PHP 5.2if(filter_var($address, FILTER_VALIDATE_EMAIL) === FALSE) {return false;} else {return true;}} else {return preg_match('/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!\.)){0,61}[a-zA-Z0-9_-]?\.)+[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!$)){0,61}[a-zA-Z0-9_]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/', $address);}}/// METHODS, MAIL SENDING//*** 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.* @return bool*/public function Send() {try {if(!$this->PreSend()) return false;return $this->PostSend();} catch (phpmailerException $e) {$this->SentMIMEMessage = '';$this->SetError($e->getMessage());if ($this->exceptions) {throw $e;}return false;}}protected function PreSend() {try {$mailHeader = "";if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {throw new phpmailerException($this->Lang('provide_address'), self::STOP_CRITICAL);}// Set whether the message is multipart/alternativeif(!empty($this->AltBody)) {$this->ContentType = 'multipart/alternative';}$this->error_count = 0; // reset errors$this->SetMessageType();//Refuse to send an empty messageif (empty($this->Body)) {throw new phpmailerException($this->Lang('empty_message'), self::STOP_CRITICAL);}$this->MIMEHeader = $this->CreateHeader();$this->MIMEBody = $this->CreateBody();// To capture the complete message when using mail(), create// an extra header list which CreateHeader() doesn't fold inif ($this->Mailer == 'mail') {if (count($this->to) > 0) {$mailHeader .= $this->AddrAppend("To", $this->to);} else {$mailHeader .= $this->HeaderLine("To", "undisclosed-recipients:;");}$mailHeader .= $this->HeaderLine('Subject', $this->EncodeHeader($this->SecureHeader(trim($this->Subject))));// if(count($this->cc) > 0) {// $mailHeader .= $this->AddrAppend("Cc", $this->cc);// }}// digitally sign with DKIM if enabledif ($this->DKIM_domain && $this->DKIM_private) {$header_dkim = $this->DKIM_Add($this->MIMEHeader, $this->EncodeHeader($this->SecureHeader($this->Subject)), $this->MIMEBody);$this->MIMEHeader = str_replace("\r\n", "\n", $header_dkim) . $this->MIMEHeader;}$this->SentMIMEMessage = sprintf("%s%s\r\n\r\n%s",$this->MIMEHeader,$mailHeader,$this->MIMEBody);return true;} catch (phpmailerException $e) {$this->SetError($e->getMessage());if ($this->exceptions) {throw $e;}return false;}}protected function PostSend() {try {// Choose the mailer and send through itswitch($this->Mailer) {case 'sendmail':return $this->SendmailSend($this->MIMEHeader, $this->MIMEBody);case 'smtp':return $this->SmtpSend($this->MIMEHeader, $this->MIMEBody);case 'mail':return $this->MailSend($this->MIMEHeader, $this->MIMEBody);default:return $this->MailSend($this->MIMEHeader, $this->MIMEBody);}} catch (phpmailerException $e) {$this->SetError($e->getMessage());if ($this->exceptions) {throw $e;}if ($this->SMTPDebug) {echo $e->getMessage()."\n";}return false;}}/*** Sends mail using the $Sendmail program.* @param string $header The message headers* @param string $body The message body* @access protected* @return bool*/protected function SendmailSend($header, $body) {if ($this->Sender != '') {$sendmail = sprintf("%s -oi -f %s -t", escapeshellcmd($this->Sendmail), escapeshellarg($this->Sender));} else {$sendmail = sprintf("%s -oi -t", escapeshellcmd($this->Sendmail));}if ($this->SingleTo === true) {foreach ($this->SingleToArray as $key => $val) {if(!@$mail = popen($sendmail, 'w')) {throw new phpmailerException($this->Lang('execute') . $this->Sendmail, self::STOP_CRITICAL);}fputs($mail, "To: " . $val . "\n");fputs($mail, $header);fputs($mail, $body);$result = pclose($mail);// implement call back function if it exists$isSent = ($result == 0) ? 1 : 0;$this->doCallback($isSent, $val, $this->cc, $this->bcc, $this->Subject, $body);if($result != 0) {throw new phpmailerException($this->Lang('execute') . $this->Sendmail, self::STOP_CRITICAL);}}} else {if(!@$mail = popen($sendmail, 'w')) {throw new phpmailerException($this->Lang('execute') . $this->Sendmail, self::STOP_CRITICAL);}fputs($mail, $header);fputs($mail, $body);$result = pclose($mail);// implement call back function if it exists$isSent = ($result == 0) ? 1 : 0;$this->doCallback($isSent, $this->to, $this->cc, $this->bcc, $this->Subject, $body);if($result != 0) {throw new phpmailerException($this->Lang('execute') . $this->Sendmail, self::STOP_CRITICAL);}}return true;}/*** Sends mail using the PHP mail() function.* @param string $header The message headers* @param string $body The message body* @access protected* @return bool*/protected function MailSend($header, $body) {$toArr = array();foreach($this->to as $t) {$toArr[] = $this->AddrFormat($t);}$to = implode(', ', $toArr);if (empty($this->Sender)) {$params = "-oi ";} else {$params = sprintf("-oi -f %s", $this->Sender);}if ($this->Sender != '' and !ini_get('safe_mode')) {$old_from = ini_get('sendmail_from');ini_set('sendmail_from', $this->Sender);if ($this->SingleTo === true && count($toArr) > 1) {foreach ($toArr as $key => $val) {$rt = @mail($val, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params);// implement call back function if it exists$isSent = ($rt == 1) ? 1 : 0;$this->doCallback($isSent, $val, $this->cc, $this->bcc, $this->Subject, $body);}} else {$rt = @mail($to, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params);// implement call back function if it exists$isSent = ($rt == 1) ? 1 : 0;$this->doCallback($isSent, $to, $this->cc, $this->bcc, $this->Subject, $body);}} else {if ($this->SingleTo === true && count($toArr) > 1) {foreach ($toArr as $key => $val) {$rt = @mail($val, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params);// implement call back function if it exists$isSent = ($rt == 1) ? 1 : 0;$this->doCallback($isSent, $val, $this->cc, $this->bcc, $this->Subject, $body);}} else {$rt = @mail($to, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params);// implement call back function if it exists$isSent = ($rt == 1) ? 1 : 0;$this->doCallback($isSent, $to, $this->cc, $this->bcc, $this->Subject, $body);}}if (isset($old_from)) {ini_set('sendmail_from', $old_from);}if(!$rt) {throw new phpmailerException($this->Lang('instantiate'), self::STOP_CRITICAL);}return true;}/*** Sends mail via SMTP using PhpSMTP* Returns false if there is a bad MAIL FROM, RCPT, or DATA input.* @param string $header The message headers* @param string $body The message body* @uses SMTP* @access protected* @return bool*/protected function SmtpSend($header, $body) {require_once $this->PluginDir . 'class.smtp.php';$bad_rcpt = array();if(!$this->SmtpConnect()) {throw new phpmailerException($this->Lang('smtp_connect_failed'), self::STOP_CRITICAL);}$smtp_from = ($this->Sender == '') ? $this->From : $this->Sender;if(!$this->smtp->Mail($smtp_from)) {throw new phpmailerException($this->Lang('from_failed') . $smtp_from, self::STOP_CRITICAL);}// Attempt to send attach all recipientsforeach($this->to as $to) {if (!$this->smtp->Recipient($to[0])) {$bad_rcpt[] = $to[0];// implement call back function if it exists$isSent = 0;$this->doCallback($isSent, $to[0], '', '', $this->Subject, $body);} else {// implement call back function if it exists$isSent = 1;$this->doCallback($isSent, $to[0], '', '', $this->Subject, $body);}}foreach($this->cc as $cc) {if (!$this->smtp->Recipient($cc[0])) {$bad_rcpt[] = $cc[0];// implement call back function if it exists$isSent = 0;$this->doCallback($isSent, '', $cc[0], '', $this->Subject, $body);} else {// implement call back function if it exists$isSent = 1;$this->doCallback($isSent, '', $cc[0], '', $this->Subject, $body);}}foreach($this->bcc as $bcc) {if (!$this->smtp->Recipient($bcc[0])) {$bad_rcpt[] = $bcc[0];// implement call back function if it exists$isSent = 0;$this->doCallback($isSent, '', '', $bcc[0], $this->Subject, $body);} else {// implement call back function if it exists$isSent = 1;$this->doCallback($isSent, '', '', $bcc[0], $this->Subject, $body);}}if (count($bad_rcpt) > 0 ) { //Create error message for any bad addresses$badaddresses = implode(', ', $bad_rcpt);throw new phpmailerException($this->Lang('recipients_failed') . $badaddresses);}if(!$this->smtp->Data($header . $body)) {throw new phpmailerException($this->Lang('data_not_accepted'), self::STOP_CRITICAL);}if($this->SMTPKeepAlive == true) {$this->smtp->Reset();}return true;}/*** Initiates a connection to an SMTP server.* Returns false if the operation failed.* @uses SMTP* @access public* @return bool*/public function SmtpConnect() {if(is_null($this->smtp)) {$this->smtp = new SMTP();}$this->smtp->do_debug = $this->SMTPDebug;$hosts = explode(';', $this->Host);$index = 0;$connection = $this->smtp->Connected();// Retry while there is no connectiontry {while($index < count($hosts) && !$connection) {$hostinfo = array();if (preg_match('/^(.+):([0-9]+)$/', $hosts[$index], $hostinfo)) {$host = $hostinfo[1];$port = $hostinfo[2];} else {$host = $hosts[$index];$port = $this->Port;}$tls = ($this->SMTPSecure == 'tls');$ssl = ($this->SMTPSecure == 'ssl');if ($this->smtp->Connect(($ssl ? 'ssl://':'').$host, $port, $this->Timeout)) {$hello = ($this->Helo != '' ? $this->Helo : $this->ServerHostname());$this->smtp->Hello($hello);if ($tls) {if (!$this->smtp->StartTLS()) {throw new phpmailerException($this->Lang('tls'));}//We must resend HELO after tls negotiation$this->smtp->Hello($hello);}$connection = true;if ($this->SMTPAuth) {if (!$this->smtp->Authenticate($this->Username, $this->Password)) {throw new phpmailerException($this->Lang('authenticate'));}}}$index++;if (!$connection) {throw new phpmailerException($this->Lang('connect_host'));}}} catch (phpmailerException $e) {$this->smtp->Reset();if ($this->exceptions) {throw $e;}}return true;}/*** Closes the active SMTP session if one exists.* @return void*/public function SmtpClose() {if(!is_null($this->smtp)) {if($this->smtp->Connected()) {$this->smtp->Quit();$this->smtp->Close();}}}/*** Sets the language for all class error messages.* Returns false if it cannot load the language file.  The default language is English.* @param string $langcode ISO 639-1 2-character language code (e.g. Portuguese: "br")* @param string $lang_path Path to the language file directory* @access public*/function SetLanguage($langcode = 'en', $lang_path = 'language/') {//Define full set of translatable strings$PHPMAILER_LANG = array('provide_address' => 'You must provide at least one recipient email address.','mailer_not_supported' => ' mailer is not supported.','execute' => 'Could not execute: ','instantiate' => 'Could not instantiate mail function.','authenticate' => 'SMTP Error: Could not authenticate.','from_failed' => 'The following From address failed: ','recipients_failed' => 'SMTP Error: The following recipients failed: ','data_not_accepted' => 'SMTP Error: Data not accepted.','connect_host' => 'SMTP Error: Could not connect to SMTP host.','file_access' => 'Could not access file: ','file_open' => 'File Error: Could not open file: ','encoding' => 'Unknown encoding: ','signing' => 'Signing Error: ','smtp_error' => 'SMTP server error: ','empty_message' => 'Message body empty','invalid_address' => 'Invalid address','variable_set' => 'Cannot set or reset variable: ');//Overwrite language-specific strings. This way we'll never have missing translations - no more "language string failed to load"!$l = true;if ($langcode != 'en') { //There is no English translation file$l = @include $lang_path.'phpmailer.lang-'.$langcode.'.php';}$this->language = $PHPMAILER_LANG;return ($l == true); //Returns false if language not found}/*** Return the current array of language strings* @return array*/public function GetTranslations() {return $this->language;}/// METHODS, MESSAGE CREATION//*** Creates recipient headers.* @access public* @return string*/public function AddrAppend($type, $addr) {$addr_str = $type . ': ';$addresses = array();foreach ($addr as $a) {$addresses[] = $this->AddrFormat($a);}$addr_str .= implode(', ', $addresses);$addr_str .= $this->LE;return $addr_str;}/*** Formats an address correctly.* @access public* @return string*/public function AddrFormat($addr) {if (empty($addr[1])) {return $this->SecureHeader($addr[0]);} else {return $this->EncodeHeader($this->SecureHeader($addr[1]), 'phrase') . " <" . $this->SecureHeader($addr[0]) . ">";}}/*** Wraps message for use with mailers that do not* automatically perform wrapping and for quoted-printable.* Original written by philippe.* @param string $message The message to wrap* @param integer $length The line length to wrap to* @param boolean $qp_mode Whether to run in Quoted-Printable mode* @access public* @return string*/public function WrapText($message, $length, $qp_mode = false) {$soft_break = ($qp_mode) ? sprintf(" =%s", $this->LE) : $this->LE;// If utf-8 encoding is used, we will need to make sure we don't// split multibyte characters when we wrap$is_utf8 = (strtolower($this->CharSet) == "utf-8");$message = $this->FixEOL($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 ($is_utf8) {$len = $this->UTF8CharBoundary($word, $len);} elseif (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 ($is_utf8) {$len = $this->UTF8CharBoundary($word, $len);} elseif (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);} else {$buf = $part;}}} else {$buf_o = $buf;$buf .= ($e == 0) ? $word : (' ' . $word);if (strlen($buf) > $length and $buf_o != '') {$message .= $buf_o . $soft_break;$buf = $word;}}}$message .= $buf . $this->LE;}return $message;}/*** Finds last character boundary prior to maxLength in a utf-8* quoted (printable) encoded string.* Original written by Colin Brown.* @access public* @param string $encodedText utf-8 QP text* @param int    $maxLength   find last character boundary prior to this length* @return int*/public function UTF8CharBoundary($encodedText, $maxLength) {$foundSplitPos = false;$lookBack = 3;while (!$foundSplitPos) {$lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);$encodedCharPos = strpos($lastChunk, "=");if ($encodedCharPos !== false) {// Found start of encoded character byte within $lookBack block.// Check the encoded byte value (the 2 chars after the '=')$hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);$dec = hexdec($hex);if ($dec < 128) { // Single byte character.// If the encoded char was found at pos 0, it will fit// otherwise reduce maxLength to start of the encoded char$maxLength = ($encodedCharPos == 0) ? $maxLength :$maxLength - ($lookBack - $encodedCharPos);$foundSplitPos = true;} elseif ($dec >= 192) { // First byte of a multi byte character// Reduce maxLength to split at start of character$maxLength = $maxLength - ($lookBack - $encodedCharPos);$foundSplitPos = true;} elseif ($dec < 192) { // Middle byte of a multi byte character, look further back$lookBack += 3;}} else {// No encoded character found$foundSplitPos = true;}}return $maxLength;}/*** Set the body wrapping.* @access public* @return void*/public function SetWordWrap() {if($this->WordWrap < 1) {return;}switch($this->message_type) {case 'alt':case 'alt_inline':case 'alt_attach':case 'alt_inline_attach':$this->AltBody = $this->WrapText($this->AltBody, $this->WordWrap);break;default:$this->Body = $this->WrapText($this->Body, $this->WordWrap);break;}}/*** Assembles message header.* @access public* @return string The assembled header*/public function CreateHeader() {$result = '';// Set the boundaries$uniq_id = md5(uniqid(time()));$this->boundary[1] = 'b1_' . $uniq_id;$this->boundary[2] = 'b2_' . $uniq_id;$this->boundary[3] = 'b3_' . $uniq_id;$result .= $this->HeaderLine('Date', self::RFCDate());if($this->Sender == '') {$result .= $this->HeaderLine('Return-Path', trim($this->From));} else {$result .= $this->HeaderLine('Return-Path', trim($this->Sender));}// To be created automatically by mail()if($this->Mailer != 'mail') {if ($this->SingleTo === true) {foreach($this->to as $t) {$this->SingleToArray[] = $this->AddrFormat($t);}} else {if(count($this->to) > 0) {$result .= $this->AddrAppend('To', $this->to);} elseif (count($this->cc) == 0) {$result .= $this->HeaderLine('To', 'undisclosed-recipients:;');}}}$from = array();$from[0][0] = trim($this->From);$from[0][1] = $this->FromName;$result .= $this->AddrAppend('From', $from);// sendmail and mail() extract Cc from the header before sendingif(count($this->cc) > 0) {$result .= $this->AddrAppend('Cc', $this->cc);}// sendmail and mail() extract Bcc from the header before sendingif((($this->Mailer == 'sendmail') || ($this->Mailer == 'mail')) && (count($this->bcc) > 0)) {$result .= $this->AddrAppend('Bcc', $this->bcc);}if(count($this->ReplyTo) > 0) {$result .= $this->AddrAppend('Reply-To', $this->ReplyTo);}// mail() sets the subject itselfif($this->Mailer != 'mail') {$result .= $this->HeaderLine('Subject', $this->EncodeHeader($this->SecureHeader($this->Subject)));}if($this->MessageID != '') {$result .= $this->HeaderLine('Message-ID', $this->MessageID);} else {$result .= sprintf("Message-ID: <%s@%s>%s", $uniq_id, $this->ServerHostname(), $this->LE);}$result .= $this->HeaderLine('X-Priority', $this->Priority);if($this->XMailer) {$result .= $this->HeaderLine('X-Mailer', $this->XMailer);} else {$result .= $this->HeaderLine('X-Mailer', 'PHPMailer '.$this->Version.' (http://code.google.com/a/apache-extras.org/p/phpmailer/)');}if($this->ConfirmReadingTo != '') {$result .= $this->HeaderLine('Disposition-Notification-To', '<' . trim($this->ConfirmReadingTo) . '>');}// Add custom headersfor($index = 0; $index < count($this->CustomHeader); $index++) {$result .= $this->HeaderLine(trim($this->CustomHeader[$index][0]), $this->EncodeHeader(trim($this->CustomHeader[$index][1])));}if (!$this->sign_key_file) {$result .= $this->HeaderLine('MIME-Version', '1.0');$result .= $this->GetMailMIME();}return $result;}/*** Returns the message MIME.* @access public* @return string*/public function GetMailMIME() {$result = '';switch($this->message_type) {case 'plain':$result .= $this->HeaderLine('Content-Transfer-Encoding', $this->Encoding);$result .= $this->TextLine('Content-Type: '.$this->ContentType.'; charset="'.$this->CharSet.'"');break;case 'inline':$result .= $this->HeaderLine('Content-Type', 'multipart/related;');$result .= $this->TextLine("\tboundary=\"" . $this->boundary[1] . '"');break;case 'attach':case 'inline_attach':case 'alt_attach':case 'alt_inline_attach':$result .= $this->HeaderLine('Content-Type', 'multipart/mixed;');$result .= $this->TextLine("\tboundary=\"" . $this->boundary[1] . '"');break;case 'alt':case 'alt_inline':$result .= $this->HeaderLine('Content-Type', 'multipart/alternative;');$result .= $this->TextLine("\tboundary=\"" . $this->boundary[1] . '"');break;}if($this->Mailer != 'mail') {$result .= $this->LE.$this->LE;}return $result;}/*** Returns the MIME message (headers and body). Only really valid post PreSend().* @access public* @return string*/public function GetSentMIMEMessage() {return $this->SentMIMEMessage;}/*** Assembles the message body.  Returns an empty string on failure.* @access public* @return string The assembled message body*/public function CreateBody() {$body = '';if ($this->sign_key_file) {$body .= $this->GetMailMIME();}$this->SetWordWrap();switch($this->message_type) {case 'plain':$body .= $this->EncodeString($this->Body, $this->Encoding);break;case 'inline':$body .= $this->GetBoundary($this->boundary[1], '', '', '');$body .= $this->EncodeString($this->Body, $this->Encoding);$body .= $this->LE.$this->LE;$body .= $this->AttachAll("inline", $this->boundary[1]);break;case 'attach':$body .= $this->GetBoundary($this->boundary[1], '', '', '');$body .= $this->EncodeString($this->Body, $this->Encoding);$body .= $this->LE.$this->LE;$body .= $this->AttachAll("p_w_upload", $this->boundary[1]);break;case 'inline_attach':$body .= $this->TextLine("--" . $this->boundary[1]);$body .= $this->HeaderLine('Content-Type', 'multipart/related;');$body .= $this->TextLine("\tboundary=\"" . $this->boundary[2] . '"');$body .= $this->LE;$body .= $this->GetBoundary($this->boundary[2], '', '', '');$body .= $this->EncodeString($this->Body, $this->Encoding);$body .= $this->LE.$this->LE;$body .= $this->AttachAll("inline", $this->boundary[2]);$body .= $this->LE;$body .= $this->AttachAll("p_w_upload", $this->boundary[1]);break;case 'alt':$body .= $this->GetBoundary($this->boundary[1], '', 'text/plain', '');$body .= $this->EncodeString($this->AltBody, $this->Encoding);$body .= $this->LE.$this->LE;$body .= $this->GetBoundary($this->boundary[1], '', 'text/html', '');$body .= $this->EncodeString($this->Body, $this->Encoding);$body .= $this->LE.$this->LE;$body .= $this->EndBoundary($this->boundary[1]);break;case 'alt_inline':$body .= $this->GetBoundary($this->boundary[1], '', 'text/plain', '');$body .= $this->EncodeString($this->AltBody, $this->Encoding);$body .= $this->LE.$this->LE;$body .= $this->TextLine("--" . $this->boundary[1]);$body .= $this->HeaderLine('Content-Type', 'multipart/related;');$body .= $this->TextLine("\tboundary=\"" . $this->boundary[2] . '"');$body .= $this->LE;$body .= $this->GetBoundary($this->boundary[2], '', 'text/html', '');$body .= $this->EncodeString($this->Body, $this->Encoding);$body .= $this->LE.$this->LE;$body .= $this->AttachAll("inline", $this->boundary[2]);$body .= $this->LE;$body .= $this->EndBoundary($this->boundary[1]);break;case 'alt_attach':$body .= $this->TextLine("--" . $this->boundary[1]);$body .= $this->HeaderLine('Content-Type', 'multipart/alternative;');$body .= $this->TextLine("\tboundary=\"" . $this->boundary[2] . '"');$body .= $this->LE;$body .= $this->GetBoundary($this->boundary[2], '', 'text/plain', '');$body .= $this->EncodeString($this->AltBody, $this->Encoding);$body .= $this->LE.$this->LE;$body .= $this->GetBoundary($this->boundary[2], '', 'text/html', '');$body .= $this->EncodeString($this->Body, $this->Encoding);$body .= $this->LE.$this->LE;$body .= $this->EndBoundary($this->boundary[2]);$body .= $this->LE;$body .= $this->AttachAll("p_w_upload", $this->boundary[1]);break;case 'alt_inline_attach':$body .= $this->TextLine("--" . $this->boundary[1]);$body .= $this->HeaderLine('Content-Type', 'multipart/alternative;');$body .= $this->TextLine("\tboundary=\"" . $this->boundary[2] . '"');$body .= $this->LE;$body .= $this->GetBoundary($this->boundary[2], '', 'text/plain', '');$body .= $this->EncodeString($this->AltBody, $this->Encoding);$body .= $this->LE.$this->LE;$body .= $this->TextLine("--" . $this->boundary[2]);$body .= $this->HeaderLine('Content-Type', 'multipart/related;');$body .= $this->TextLine("\tboundary=\"" . $this->boundary[3] . '"');$body .= $this->LE;$body .= $this->GetBoundary($this->boundary[3], '', 'text/html', '');$body .= $this->EncodeString($this->Body, $this->Encoding);$body .= $this->LE.$this->LE;$body .= $this->AttachAll("inline", $this->boundary[3]);$body .= $this->LE;$body .= $this->EndBoundary($this->boundary[2]);$body .= $this->LE;$body .= $this->AttachAll("p_w_upload", $this->boundary[1]);break;}if ($this->IsError()) {$body = '';} elseif ($this->sign_key_file) {try {$file = tempnam('', 'mail');file_put_contents($file, $body); //TODO check this worked$signed = tempnam("", "signed");if (@openssl_pkcs7_sign($file, $signed, "file://".$this->sign_cert_file, array("file://".$this->sign_key_file, $this->sign_key_pass), NULL)) {@unlink($file);$body = file_get_contents($signed);@unlink($signed);} else {@unlink($file);@unlink($signed);throw new phpmailerException($this->Lang("signing").openssl_error_string());}} catch (phpmailerException $e) {$body = '';if ($this->exceptions) {throw $e;}}}return $body;}/*** Returns the start of a message boundary.* @access protected* @return string*/protected function GetBoundary($boundary, $charSet, $contentType, $encoding) {$result = '';if($charSet == '') {$charSet = $this->CharSet;}if($contentType == '') {$contentType = $this->ContentType;}if($encoding == '') {$encoding = $this->Encoding;}$result .= $this->TextLine('--' . $boundary);$result .= sprintf("Content-Type: %s; charset=\"%s\"", $contentType, $charSet);$result .= $this->LE;$result .= $this->HeaderLine('Content-Transfer-Encoding', $encoding);$result .= $this->LE;return $result;}/*** Returns the end of a message boundary.* @access protected* @return string*/protected function EndBoundary($boundary) {return $this->LE . '--' . $boundary . '--' . $this->LE;}/*** Sets the message type.* @access protected* @return void*/protected function SetMessageType() {$this->message_type = array();if($this->AlternativeExists()) $this->message_type[] = "alt";if($this->InlineImageExists()) $this->message_type[] = "inline";if($this->AttachmentExists()) $this->message_type[] = "attach";$this->message_type = implode("_", $this->message_type);if($this->message_type == "") $this->message_type = "plain";}/***  Returns a formatted header line.* @access public* @return string*/public function HeaderLine($name, $value) {return $name . ': ' . $value . $this->LE;}/*** Returns a formatted mail line.* @access public* @return string*/public function TextLine($value) {return $value . $this->LE;}/// CLASS METHODS, ATTACHMENTS//*** Adds an p_w_upload from a path on the filesystem.* Returns false if the file could not be found* or accessed.* @param string $path Path to the p_w_upload.* @param string $name Overrides the p_w_upload name.* @param string $encoding File encoding (see $Encoding).* @param string $type File extension (MIME) type.* @return bool*/public function AddAttachment($path, $name = '', $encoding = 'base64', $type = 'application/octet-stream') {try {if ( !@is_file($path) ) {throw new phpmailerException($this->Lang('file_access') . $path, self::STOP_CONTINUE);}$filename = basename($path);if ( $name == '' ) {$name = $filename;}$this->p_w_upload[] = array(0 => $path,1 => $filename,2 => $name,3 => $encoding,4 => $type,5 => false,  // isStringAttachment6 => 'p_w_upload',7 => 0);} catch (phpmailerException $e) {$this->SetError($e->getMessage());if ($this->exceptions) {throw $e;}if ($this->SMTPDebug) {echo $e->getMessage()."\n";}if ( $e->getCode() == self::STOP_CRITICAL ) {return false;}}return true;}/*** Return the current array of p_w_uploads* @return array*/public function GetAttachments() {return $this->p_w_upload;}/*** Attaches all fs, string, and binary p_w_uploads to the message.* Returns an empty string on failure.* @access protected* @return string*/protected function AttachAll($disposition_type, $boundary) {// Return text of body$mime = array();$cidUniq = array();$incl = array();// Add all p_w_uploadsforeach ($this->p_w_upload as $p_w_upload) {// CHECK IF IT IS A VALID DISPOSITION_FILTERif($p_w_upload[6] == $disposition_type) {// Check for string p_w_upload$bString = $p_w_upload[5];if ($bString) {$string = $p_w_upload[0];} else {$path = $p_w_upload[0];}$inclhash = md5(serialize($p_w_upload));if (in_array($inclhash, $incl)) { continue; }$incl[]      = $inclhash;$filename    = $p_w_upload[1];$name        = $p_w_upload[2];$encoding    = $p_w_upload[3];$type        = $p_w_upload[4];$disposition = $p_w_upload[6];$cid         = $p_w_upload[7];if ( $disposition == 'inline' && isset($cidUniq[$cid]) ) { continue; }$cidUniq[$cid] = true;$mime[] = sprintf("--%s%s", $boundary, $this->LE);$mime[] = sprintf("Content-Type: %s; name=\"%s\"%s", $type, $this->EncodeHeader($this->SecureHeader($name)), $this->LE);$mime[] = sprintf("Content-Transfer-Encoding: %s%s", $encoding, $this->LE);if($disposition == 'inline') {$mime[] = sprintf("Content-ID: <%s>%s", $cid, $this->LE);}$mime[] = sprintf("Content-Disposition: %s; filename=\"%s\"%s", $disposition, $this->EncodeHeader($this->SecureHeader($name)), $this->LE.$this->LE);// Encode as string p_w_uploadif($bString) {$mime[] = $this->EncodeString($string, $encoding);if($this->IsError()) {return '';}$mime[] = $this->LE.$this->LE;} else {$mime[] = $this->EncodeFile($path, $encoding);if($this->IsError()) {return '';}$mime[] = $this->LE.$this->LE;}}}$mime[] = sprintf("--%s--%s", $boundary, $this->LE);return implode("", $mime);}/*** Encodes p_w_upload in requested format.* Returns an empty string on failure.* @param string $path The full path to the file* @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'* @see EncodeFile()* @access protected* @return string*/protected function EncodeFile($path, $encoding = 'base64') {try {if (!is_readable($path)) {throw new phpmailerException($this->Lang('file_open') . $path, self::STOP_CONTINUE);}if (function_exists('get_magic_quotes')) {function get_magic_quotes() {return false;}}$magic_quotes = get_magic_quotes_runtime();if ($magic_quotes) {if (version_compare(PHP_VERSION, '5.3.0', '<')) {set_magic_quotes_runtime(0);} else {ini_set('magic_quotes_runtime', 0);}}$file_buffer  = file_get_contents($path);$file_buffer  = $this->EncodeString($file_buffer, $encoding);if ($magic_quotes) {if (version_compare(PHP_VERSION, '5.3.0', '<')) {set_magic_quotes_runtime($magic_quotes);} else {ini_set('magic_quotes_runtime', $magic_quotes);}}return $file_buffer;} catch (Exception $e) {$this->SetError($e->getMessage());return '';}}/*** Encodes string to requested format.* Returns an empty string on failure.* @param string $str The text to encode* @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'* @access public* @return string*/public function EncodeString($str, $encoding = 'base64') {$encoded = '';switch(strtolower($encoding)) {case 'base64':$encoded = chunk_split(base64_encode($str), 76, $this->LE);break;case '7bit':case '8bit':$encoded = $this->FixEOL($str);//Make sure it ends with a line breakif (substr($encoded, -(strlen($this->LE))) != $this->LE)$encoded .= $this->LE;break;case 'binary':$encoded = $str;break;case 'quoted-printable':$encoded = $this->EncodeQP($str);break;default:$this->SetError($this->Lang('encoding') . $encoding);break;}return $encoded;}/*** Encode a header string to best (shortest) of Q, B, quoted or none.* @access public* @return string*/public function EncodeHeader($str, $position = 'text') {$x = 0;switch (strtolower($position)) {case 'phrase':if (!preg_match('/[\200-\377]/', $str)) {// Can't use addslashes as we don't know what value has magic_quotes_sybase$encoded = addcslashes($str, "\0..\37\177\\\"");if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {return ($encoded);} else {return ("\"$encoded\"");}}$x = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);break;case 'comment':$x = preg_match_all('/[()"]/', $str, $matches);// Fall-throughcase 'text':default:$x += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);break;}if ($x == 0) {return ($str);}$maxlen = 75 - 7 - strlen($this->CharSet);// Try to select the encoding which should produce the shortest outputif (strlen($str)/3 < $x) {$encoding = 'B';if (function_exists('mb_strlen') && $this->HasMultiBytes($str)) {// Use a custom function which correctly encodes and wraps long// multibyte strings without breaking lines within a character$encoded = $this->Base64EncodeWrapMB($str);} else {$encoded = base64_encode($str);$maxlen -= $maxlen % 4;$encoded = trim(chunk_split($encoded, $maxlen, "\n"));}} else {$encoding = 'Q';$encoded = $this->EncodeQ($str, $position);$encoded = $this->WrapText($encoded, $maxlen, true);$encoded = str_replace('='.$this->LE, "\n", trim($encoded));}$encoded = preg_replace('/^(.*)$/m', " =?".$this->CharSet."?$encoding?\\1?=", $encoded);$encoded = trim(str_replace("\n", $this->LE, $encoded));return $encoded;}/*** Checks if a string contains multibyte characters.* @access public* @param string $str multi-byte text to wrap encode* @return bool*/public function HasMultiBytes($str) {if (function_exists('mb_strlen')) {return (strlen($str) > mb_strlen($str, $this->CharSet));} else { // Assume no multibytes (we can't handle without mbstring functions anyway)return false;}}/*** Correctly encodes and wraps long multibyte strings for mail headers* without breaking lines within a character.* Adapted from a function by paravoid at http://uk.php.net/manual/en/function.mb-encode-mimeheader.php* @access public* @param string $str multi-byte text to wrap encode* @return string*/public function Base64EncodeWrapMB($str) {$start = "=?".$this->CharSet."?B?";$end = "?=";$encoded = "";$mb_length = mb_strlen($str, $this->CharSet);// Each line must have length <= 75, including $start and $end$length = 75 - strlen($start) - strlen($end);// Average multi-byte ratio$ratio = $mb_length / strlen($str);// Base64 has a 4:3 ratio$offset = $avgLength = floor($length * $ratio * .75);for ($i = 0; $i < $mb_length; $i += $offset) {$lookBack = 0;do {$offset = $avgLength - $lookBack;$chunk = mb_substr($str, $i, $offset, $this->CharSet);$chunk = base64_encode($chunk);$lookBack++;}while (strlen($chunk) > $length);$encoded .= $chunk . $this->LE;}// Chomp the last linefeed$encoded = substr($encoded, 0, -strlen($this->LE));return $encoded;}/*** Encode string to quoted-printable.* Only uses standard PHP, slow, but will always work* @access public* @param string $string the text to encode* @param integer $line_max Number of chars allowed on a line before wrapping* @return string*/public function EncodeQPphp( $input = '', $line_max = 76, $space_conv = false) {$hex = array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F');$lines = preg_split('/(?:\r\n|\r|\n)/', $input);$eol = "\r\n";$escape = '=';$output = '';while( list(, $line) = each($lines) ) {$linlen = strlen($line);$newline = '';for($i = 0; $i < $linlen; $i++) {$c = substr( $line, $i, 1 );$dec = ord( $c );if ( ( $i == 0 ) && ( $dec == 46 ) ) { // convert first point in the line into =2E$c = '=2E';}if ( $dec == 32 ) {if ( $i == ( $linlen - 1 ) ) { // convert space at eol only$c = '=20';} else if ( $space_conv ) {$c = '=20';}} elseif ( ($dec == 61) || ($dec < 32 ) || ($dec > 126) ) { // always encode "\t", which is *not* required$h2 = floor($dec/16);$h1 = floor($dec%16);$c = $escape.$hex[$h2].$hex[$h1];}if ( (strlen($newline) + strlen($c)) >= $line_max ) { // CRLF is not counted$output .= $newline.$escape.$eol; //  soft line break; " =\r\n" is okay$newline = '';// check if newline first character will be point or notif ( $dec == 46 ) {$c = '=2E';}}$newline .= $c;} // end of for$output .= $newline.$eol;} // end of whilereturn $output;}/*** Encode string to RFC2045 (6.7) quoted-printable format* Uses a PHP5 stream filter to do the encoding about 64x faster than the old version* Also results in same content as you started with after decoding* @see EncodeQPphp()* @access public* @param string $string the text to encode* @param integer $line_max Number of chars allowed on a line before wrapping* @param boolean $space_conv Dummy param for compatibility with existing EncodeQP function* @return string* @author Marcus Bointon*/public function EncodeQP($string, $line_max = 76, $space_conv = false) {if (function_exists('quoted_printable_encode')) { //Use native function if it's available (>= PHP5.3)return quoted_printable_encode($string);}$filters = stream_get_filters();if (!in_array('convert.*', $filters)) { //Got convert stream filter?return $this->EncodeQPphp($string, $line_max, $space_conv); //Fall back to old implementation}$fp = fopen('php://temp/', 'r+');$string = preg_replace('/\r\n?/', $this->LE, $string); //Normalise line breaks$params = array('line-length' => $line_max, 'line-break-chars' => $this->LE);$s = stream_filter_append($fp, 'convert.quoted-printable-encode', STREAM_FILTER_READ, $params);fputs($fp, $string);rewind($fp);$out = stream_get_contents($fp);stream_filter_remove($s);$out = preg_replace('/^\./m', '=2E', $out); //Encode . if it is first char on a line, workaround for bug in Exchangefclose($fp);return $out;}/*** Encode string to q encoding.* @link http://tools.ietf.org/html/rfc2047* @param string $str the text to encode* @param string $position Where the text is going to be used, see the RFC for what that means* @access public* @return string*/public function EncodeQ($str, $position = 'text') {// There should not be any EOL in the string$encoded = preg_replace('/[\r\n]*/', '', $str);switch (strtolower($position)) {case 'phrase':$encoded = preg_replace("/([^A-Za-z0-9!*+\/ -])/e", "'='.sprintf('%02X', ord('\\1'))", $encoded);break;case 'comment':$encoded = preg_replace("/([\(\)\"])/e", "'='.sprintf('%02X', ord('\\1'))", $encoded);case 'text':default:// Replace every high ascii, control =, ? and _ characters//TODO using /e (equivalent to eval()) is probably not a good idea$encoded = preg_replace('/([\000-\011\013\014\016-\037\075\077\137\177-\377])/e',"'='.sprintf('%02X', ord(stripslashes('\\1')))", $encoded);break;}// Replace every spaces to _ (more readable than =20)$encoded = str_replace(' ', '_', $encoded);return $encoded;}/*** Adds a string or binary p_w_upload (non-filesystem) to the list.* This method can be used to attach ascii or binary data,* such as a BLOB record from a database.* @param string $string String p_w_upload data.* @param string $filename Name of the p_w_upload.* @param string $encoding File encoding (see $Encoding).* @param string $type File extension (MIME) type.* @return void*/public function AddStringAttachment($string, $filename, $encoding = 'base64', $type = 'application/octet-stream') {// Append to $p_w_upload array$this->p_w_upload[] = array(0 => $string,1 => $filename,2 => basename($filename),3 => $encoding,4 => $type,5 => true,  // isStringAttachment6 => 'p_w_upload',7 => 0);}/*** Adds an embedded p_w_upload.  This can include p_w_picpaths, sounds, and* just about any other document.  Make sure to set the $type to an* p_w_picpath type.  For JPEG p_w_picpaths use "p_w_picpath/jpeg" and for GIF p_w_picpaths* use "p_w_picpath/gif".* @param string $path Path to the p_w_upload.* @param string $cid Content ID of the p_w_upload.  Use this to identify*        the Id for accessing the p_w_picpath in an HTML form.* @param string $name Overrides the p_w_upload name.* @param string $encoding File encoding (see $Encoding).* @param string $type File extension (MIME) type.* @return bool*/public function AddEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = 'application/octet-stream') {if ( !@is_file($path) ) {$this->SetError($this->Lang('file_access') . $path);return false;}$filename = basename($path);if ( $name == '' ) {$name = $filename;}// Append to $p_w_upload array$this->p_w_upload[] = array(0 => $path,1 => $filename,2 => $name,3 => $encoding,4 => $type,5 => false,  // isStringAttachment6 => 'inline',7 => $cid);return true;}public function AddStringEmbeddedImage($string, $cid, $filename = '', $encoding = 'base64', $type = 'application/octet-stream') {// Append to $p_w_upload array$this->p_w_upload[] = array(0 => $string,1 => $filename,2 => basename($filename),3 => $encoding,4 => $type,5 => true,  // isStringAttachment6 => 'inline',7 => $cid);}/*** Returns true if an inline p_w_upload is present.* @access public* @return bool*/public function InlineImageExists() {foreach($this->p_w_upload as $p_w_upload) {if ($p_w_upload[6] == 'inline') {return true;}}return false;}public function AttachmentExists() {foreach($this->p_w_upload as $p_w_upload) {if ($p_w_upload[6] == 'p_w_upload') {return true;}}return false;}public function AlternativeExists() {return strlen($this->AltBody)>0;}/// CLASS METHODS, MESSAGE RESET//*** Clears all recipients assigned in the TO array.  Returns void.* @return void*/public function ClearAddresses() {foreach($this->to as $to) {unset($this->all_recipients[strtolower($to[0])]);}$this->to = array();}/*** Clears all recipients assigned in the CC array.  Returns void.* @return void*/public function ClearCCs() {foreach($this->cc as $cc) {unset($this->all_recipients[strtolower($cc[0])]);}$this->cc = array();}/*** Clears all recipients assigned in the BCC array.  Returns void.* @return void*/public function ClearBCCs() {foreach($this->bcc as $bcc) {unset($this->all_recipients[strtolower($bcc[0])]);}$this->bcc = array();}/*** Clears all recipients assigned in the ReplyTo array.  Returns void.* @return void*/public function ClearReplyTos() {$this->ReplyTo = array();}/*** Clears all recipients assigned in the TO, CC and BCC* array.  Returns void.* @return void*/public function ClearAllRecipients() {$this->to = array();$this->cc = array();$this->bcc = array();$this->all_recipients = array();}/*** Clears all previously set filesystem, string, and binary* p_w_uploads.  Returns void.* @return void*/public function ClearAttachments() {$this->p_w_upload = array();}/*** Clears all custom headers.  Returns void.* @return void*/public function ClearCustomHeaders() {$this->CustomHeader = array();}/// CLASS METHODS, MISCELLANEOUS//*** Adds the error message to the error container.* @access protected* @return void*/protected function SetError($msg) {$this->error_count++;if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {$lasterror = $this->smtp->getError();if (!empty($lasterror) and array_key_exists('smtp_msg', $lasterror)) {$msg .= '<p>' . $this->Lang('smtp_error') . $lasterror['smtp_msg'] . "</p>\n";}}$this->ErrorInfo = $msg;}/*** Returns the proper RFC 822 formatted date.* @access public* @return string* @static*/public static function RFCDate() {$tz = date('Z');$tzs = ($tz < 0) ? '-' : '+';$tz = abs($tz);$tz = (int)($tz/3600)*100 + ($tz%3600)/60;$result = sprintf("%s %s%04d", date('D, j M Y H:i:s'), $tzs, $tz);return $result;}/*** Returns the server hostname or 'localhost.localdomain' if unknown.* @access protected* @return string*/protected function ServerHostname() {if (!empty($this->Hostname)) {$result = $this->Hostname;} elseif (isset($_SERVER['SERVER_NAME'])) {$result = $_SERVER['SERVER_NAME'];} else {$result = 'localhost.localdomain';}return $result;}/*** Returns a message in the appropriate language.* @access protected* @return string*/protected function Lang($key) {if(count($this->language) < 1) {$this->SetLanguage('en'); // set the default language}if(isset($this->language[$key])) {return $this->language[$key];} else {return 'Language string failed to load: ' . $key;}}/*** Returns true if an error occurred.* @access public* @return bool*/public function IsError() {return ($this->error_count > 0);}/*** Changes every end of line from CR or LF to CRLF.* @access public* @return string*/public function FixEOL($str) {$str = str_replace("\r\n", "\n", $str);$str = str_replace("\r", "\n", $str);$str = str_replace("\n", $this->LE, $str);return $str;}/*** Adds a custom header.* @access public* @return void*/public function AddCustomHeader($custom_header) {$this->CustomHeader[] = explode(':', $custom_header, 2);}/*** Evaluates the message and returns modifications for inline p_w_picpaths and backgrounds* @access public* @return $message*/public function MsgHTML($message, $basedir = '') {preg_match_all("/(src|background)=[\"'](.*)[\"']/Ui", $message, $p_w_picpaths);if(isset($p_w_picpaths[2])) {foreach($p_w_picpaths[2] as $i => $url) {// do not change urls for absolute p_w_picpaths (thanks to corvuscorax)if (!preg_match('#^[A-z]+://#', $url)) {$filename = basename($url);$directory = dirname($url);($directory == '.') ? $directory='': '';$cid = 'cid:' . md5($filename);$ext = pathinfo($filename, PATHINFO_EXTENSION);$mimeType  = self::_mime_types($ext);if ( strlen($basedir) > 1 && substr($basedir, -1) != '/') { $basedir .= '/'; }if ( strlen($directory) > 1 && substr($directory, -1) != '/') { $directory .= '/'; }if ( $this->AddEmbeddedImage($basedir.$directory.$filename, md5($filename), $filename, 'base64', $mimeType) ) {$message = preg_replace("/".$p_w_picpaths[1][$i]."=[\"']".preg_quote($url, '/')."[\"']/Ui", $p_w_picpaths[1][$i]."=\"".$cid."\"", $message);}}}}$this->IsHTML(true);$this->Body = $message;if (empty($this->AltBody)) {$textMsg = trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/s', '', $message)));if (!empty($textMsg)) {$this->AltBody = html_entity_decode($textMsg, ENT_QUOTES, $this->CharSet);}}if (empty($this->AltBody)) {$this->AltBody = 'To view this email message, open it in a program that understands HTML!' . "\n\n";}return $message;}/*** Gets the MIME type of the embedded or inline p_w_picpath* @param string File extension* @access public* @return string MIME type of ext* @static*/public static function _mime_types($ext = '') {$mimes = array('hqx'   =>  'application/mac-binhex40','cpt'   =>  'application/mac-compactpro','doc'   =>  'application/msword','bin'   =>  'application/macbinary','dms'   =>  'application/octet-stream','lha'   =>  'application/octet-stream','lzh'   =>  'application/octet-stream','exe'   =>  'application/octet-stream','class' =>  'application/octet-stream','psd'   =>  'application/octet-stream','so'    =>  'application/octet-stream','sea'   =>  'application/octet-stream','dll'   =>  'application/octet-stream','oda'   =>  'application/oda','pdf'   =>  'application/pdf','ai'    =>  'application/postscript','eps'   =>  'application/postscript','ps'    =>  'application/postscript','smi'   =>  'application/smil','smil'  =>  'application/smil','mif'   =>  'application/vnd.mif','xls'   =>  'application/vnd.ms-excel','ppt'   =>  'application/vnd.ms-powerpoint','wbxml' =>  'application/vnd.wap.wbxml','wmlc'  =>  'application/vnd.wap.wmlc','dcr'   =>  'application/x-director','dir'   =>  'application/x-director','dxr'   =>  'application/x-director','dvi'   =>  'application/x-dvi','gtar'  =>  'application/x-gtar','php'   =>  'application/x-httpd-php','php4'  =>  'application/x-httpd-php','php3'  =>  'application/x-httpd-php','phtml' =>  'application/x-httpd-php','phps'  =>  'application/x-httpd-php-source','js'    =>  'application/x-javascript','swf'   =>  'application/x-shockwave-flash','sit'   =>  'application/x-stuffit','tar'   =>  'application/x-tar','tgz'   =>  'application/x-tar','xhtml' =>  'application/xhtml+xml','xht'   =>  'application/xhtml+xml','zip'   =>  'application/zip','mid'   =>  'audio/midi','midi'  =>  'audio/midi','mpga'  =>  'audio/mpeg','mp2'   =>  'audio/mpeg','mp3'   =>  'audio/mpeg','aif'   =>  'audio/x-aiff','aiff'  =>  'audio/x-aiff','aifc'  =>  'audio/x-aiff','ram'   =>  'audio/x-pn-realaudio','rm'    =>  'audio/x-pn-realaudio','rpm'   =>  'audio/x-pn-realaudio-plugin','ra'    =>  'audio/x-realaudio','rv'    =>  'video/vnd.rn-realvideo','wav'   =>  'audio/x-wav','bmp'   =>  'p_w_picpath/bmp','gif'   =>  'p_w_picpath/gif','jpeg'  =>  'p_w_picpath/jpeg','jpg'   =>  'p_w_picpath/jpeg','jpe'   =>  'p_w_picpath/jpeg','png'   =>  'p_w_picpath/png','tiff'  =>  'p_w_picpath/tiff','tif'   =>  'p_w_picpath/tiff','css'   =>  'text/css','html'  =>  'text/html','htm'   =>  'text/html','shtml' =>  'text/html','txt'   =>  'text/plain','text'  =>  'text/plain','log'   =>  'text/plain','rtx'   =>  'text/richtext','rtf'   =>  'text/rtf','xml'   =>  'text/xml','xsl'   =>  'text/xml','mpeg'  =>  'video/mpeg','mpg'   =>  'video/mpeg','mpe'   =>  'video/mpeg','qt'    =>  'video/quicktime','mov'   =>  'video/quicktime','avi'   =>  'video/x-msvideo','movie' =>  'video/x-sgi-movie','doc'   =>  'application/msword','word'  =>  'application/msword','xl'    =>  'application/excel','eml'   =>  'message/rfc822');return (!isset($mimes[strtolower($ext)])) ? 'application/octet-stream' : $mimes[strtolower($ext)];}/*** Set (or reset) Class Objects (variables)** Usage Example:* $page->set('X-Priority', '3');** @access public* @param string $name Parameter Name* @param mixed $value Parameter Value* NOTE: will not work with arrays, there are no arrays to set/reset* @todo Should this not be using __set() magic function?*/public function set($name, $value = '') {try {if (isset($this->$name) ) {$this->$name = $value;} else {throw new phpmailerException($this->Lang('variable_set') . $name, self::STOP_CRITICAL);}} catch (Exception $e) {$this->SetError($e->getMessage());if ($e->getCode() == self::STOP_CRITICAL) {return false;}}return true;}/*** Strips newlines to prevent header injection.* @access public* @param string $str String* @return string*/public function SecureHeader($str) {$str = str_replace("\r", '', $str);$str = str_replace("\n", '', $str);return trim($str);}/*** Set the private key file and password to sign the message.** @access public* @param string $key_filename Parameter File Name* @param string $key_pass Password for private key*/public function Sign($cert_filename, $key_filename, $key_pass) {$this->sign_cert_file = $cert_filename;$this->sign_key_file = $key_filename;$this->sign_key_pass = $key_pass;}/*** Set the private key file and password to sign the message.** @access public* @param string $key_filename Parameter File Name* @param string $key_pass Password for private key*/public function DKIM_QP($txt) {$tmp = '';$line = '';for ($i = 0; $i < strlen($txt); $i++) {$ord = ord($txt[$i]);if ( ((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E)) ) {$line .= $txt[$i];} else {$line .= "=".sprintf("%02X", $ord);}}return $line;}/*** Generate DKIM signature** @access public* @param string $s Header*/public function DKIM_Sign($s) {$privKeyStr = file_get_contents($this->DKIM_private);if ($this->DKIM_passphrase != '') {$privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);} else {$privKey = $privKeyStr;}if (openssl_sign($s, $signature, $privKey)) {return base64_encode($signature);}}/*** Generate DKIM Canonicalization Header** @access public* @param string $s Header*/public function DKIM_HeaderC($s) {$s = preg_replace("/\r\n\s+/", " ", $s);$lines = explode("\r\n", $s);foreach ($lines as $key => $line) {list($heading, $value) = explode(":", $line, 2);$heading = strtolower($heading);$value = preg_replace("/\s+/", " ", $value) ; // Compress useless spaces$lines[$key] = $heading.":".trim($value) ; // Don't forget to remove WSP around the value}$s = implode("\r\n", $lines);return $s;}/*** Generate DKIM Canonicalization Body** @access public* @param string $body Message Body*/public function DKIM_BodyC($body) {if ($body == '') return "\r\n";// stabilize line endings$body = str_replace("\r\n", "\n", $body);$body = str_replace("\n", "\r\n", $body);// END stabilize line endingswhile (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {$body = substr($body, 0, strlen($body) - 2);}return $body;}/*** Create the DKIM header, body, as new header** @access public* @param string $headers_line Header lines* @param string $subject Subject* @param string $body Body*/public function DKIM_Add($headers_line, $subject, $body) {$DKIMsignatureType    = 'rsa-sha1'; // Signature & hash algorithms$DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body$DKIMquery            = 'dns/txt'; // Query method$DKIMtime             = time() ; // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)$subject_header       = "Subject: $subject";$headers              = explode($this->LE, $headers_line);foreach($headers as $header) {if (strpos($header, 'From:') === 0) {$from_header = $header;} elseif (strpos($header, 'To:') === 0) {$to_header = $header;}}$from     = str_replace('|', '=7C', $this->DKIM_QP($from_header));$to       = str_replace('|', '=7C', $this->DKIM_QP($to_header));$subject  = str_replace('|', '=7C', $this->DKIM_QP($subject_header)) ; // Copied header fields (dkim-quoted-printable$body     = $this->DKIM_BodyC($body);$DKIMlen  = strlen($body) ; // Length of body$DKIMb64  = base64_encode(pack("H*", sha1($body))) ; // Base64 of packed binary SHA-1 hash of body$ident    = ($this->DKIM_identity == '')? '' : " i=" . $this->DKIM_identity . ";";$dkimhdrs = "DKIM-Signature: v=1; a=" . $DKIMsignatureType . "; q=" . $DKIMquery . "; l=" . $DKIMlen . "; s=" . $this->DKIM_selector . ";\r\n"."\tt=" . $DKIMtime . "; c=" . $DKIMcanonicalization . ";\r\n"."\th=From:To:Subject;\r\n"."\td=" . $this->DKIM_domain . ";" . $ident . "\r\n"."\tz=$from\r\n"."\t|$to\r\n"."\t|$subject;\r\n"."\tbh=" . $DKIMb64 . ";\r\n"."\tb=";$toSign   = $this->DKIM_HeaderC($from_header . "\r\n" . $to_header . "\r\n" . $subject_header . "\r\n" . $dkimhdrs);$signed   = $this->DKIM_Sign($toSign);return "X-PHPMAILER-DKIM: phpmailer.worxware.com\r\n".$dkimhdrs.$signed."\r\n";}protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body) {if (!empty($this->action_function) && function_exists($this->action_function)) {$params = array($isSent, $to, $cc, $bcc, $subject, $body);call_user_func_array($this->action_function, $params);}}
}
class phpmailerException extends Exception {public function errorMessage() {$errorMsg = '<strong>' . $this->getMessage() . "</strong><br />\n";return $errorMsg;}
}
?>

转载于:https://blog.51cto.com/8335914/1340933

PHP实现邮件自动发送相关推荐

  1. day6邮件自动发送

    一.邮件发送基本流程 生活中发送邮件的步骤: 注册邮箱的账号 打开登录邮箱的网址(连接邮箱服务器) 输入账号和密码完成登录 构建邮件 发送邮件 # 连接邮箱服务器,登录邮箱和发送邮件的模块 impor ...

  2. day06 代码实现邮件自动发送

    目录 一. 邮件发送基本流程 二. 添加文件附件 三. 发送富文本 四. 发送图片 五. 认识前端 HTML --------- 获取邮箱授权码--------- 一. 邮件发送基本流程 生活中发送邮 ...

  3. 第二十三天-邮件自动发送

    第二十三天-邮件自动发送 一.邮件自动发送基本流程 准备工作 准备邮箱账号和密码(密码有时候不一定是邮箱密码,有可能是授权码) 登陆邮箱 1)连接邮箱服务器 import smtplib con = ...

  4. 自动化办公【邮件自动发送】

    自动化办公[邮件自动发送] 一.邮件发送基本流程 1.准备一个邮箱账号和密码(授权码) 账号:417xxx359@qq.com 授权码:在qq邮箱设置里面stml打开得到授权码 2.连接邮箱服务器(相 ...

  5. 使用Navicat定时备份mysql数据库和创建报表并邮件自动发送

    数据库备份在现代计算机高速发展的今日变得日益重要,程序员往往因为不重视而忽略备份数据,导致数据丢失,造成非常严重的后果.定时备份无疑是解决备份的最好的途径,本文主要使用Navicat来自动备份数据库和 ...

  6. zabbix生成资源性能报表+邮件自动发送

    使用python调去zabbix数据库groups,hosts_groups,hosts,items,trends,trends_uint表格中的数据组个而成的字典形式,并将其写入excel表格中. ...

  7. java 发送邮件添加附件_java邮件自动发送时添加网络附件

    查了很多资料都是使用本地资源作为附件发送.但是数据和程序分开时,还需要先下载数据,保存到本地再发送邮件.查了很多资料后,发现apach提供了很好的一个commons-mail.jar包,做了很好的封装 ...

  8. mysql navicat报表_使用Navicat定时备份mysql数据库和创建报表并邮件自动发送

    数据库备份在现代计算机高速发展的今日变得日益重要,程序员往往因为不重视而忽略备份数据,导致数据丢失,造成非常严重的后果.定时备份无疑是解决备份的最好的途径,本文主要使用Navicat来自动备份数据库和 ...

  9. 基于Python实现自动慢查询分析,邮件自动发送

    由两个程序文件组成,第一个程序实现慢查询分析,文件上传 #!/usr/local/python27/bin/python2.7 from fabric.api import * from fabric ...

  10. 邮局解决方案 发邮件邮箱使用 系统邮件自动发送 邮件发送提醒 网易免费企业邮 设置自己的域名邮箱

    环境介绍 搭建的系统与自建网站会用到邮件注册,邮件提醒 想过自己搭建邮件服务器,但是云商不给开邮件的端口 有人推荐使用QQ邮箱,或者其他第三方白嫖邮箱 ,可能会造成屏蔽或者用户泄露 实现 使用自己的域 ...

最新文章

  1. Git Bash Cmd命令笔记
  2. vs 2010 下使用VLD工具
  3. 苹果mac休眠快捷键_Mac技巧|如何高效使用苹果便笺?用便笺快捷键快速完成操作...
  4. js change事件 获取新值和旧值_前端总结(JS篇)
  5. python安装pillow图形处理库
  6. Hive中文乱码(JDBC连接HiveServer2)问题解决
  7. RK30SDK系统重启源码分析
  8. asp.net mvc 之旅—— 第一站 从简单的razor入手
  9. Linux系统下apt-get命令详解
  10. ADO ( 问数据库数据 的编程 接口)
  11. hadoop配置流程
  12. HTML+CSS+JavaScript仿京东购物商城网站 web前端制作服装购物商城 html电商购物网站...
  13. 2008和2016哪个服务器系统好,windows2012和windows2016哪个好还是win2019、win2008
  14. 关于电脑端如何下载云班课资源---将云班课资源下载到本地
  15. redis数据库创建
  16. Page Visibility(页面可见性) API介绍、微拓展
  17. 蒙特卡罗MCNP学习汇总(二)--几何体基础,构建几何体
  18. 如何让应用支持64位 Android,Sailfish OS 4.1终于拥抱64位 Android10应用支持API等级
  19. win10超级用户(Aministrators)删除后出现你要允许此应用对你的设备进行更改吗 ? 点开只有否。/提升你账户为超级账户(Aministrators)
  20. 博主在阿里笔试中拿了0分,竟是因为分不清楚 Java 输入类 nextLine 与 next 两个方法的区别

热门文章

  1. java-net-php-python-jspm设备维修保养计划管理系统计算机毕业设计程序
  2. 浮点数和整数的区别python_成语什么浮什么是
  3. 2020年华为鸿蒙,华为2020开发者大会:鸿蒙、EMUI 11、HMS缺一不可
  4. Java实现 蓝桥杯 算法提高 三角形
  5. 网站搭建一------windows+iis+asp+access
  6. 如何运用python爬游戏皮肤_用Python爬取英雄联盟(lol)全部皮肤
  7. 数据加密---之KMS
  8. 有限状态机解DP问题
  9. Photoshop-制作一个简单的闪电效果
  10. 游侠一直显示连接服务器,在游侠平台自己开的服务器 朋友第二次以后就无法进入...