利用phpmailer 来发送邮件:需要利用到的类有:class.phpmailer.php ,发送邮件的方式主要有3种 (pop,stmp,sendmail);


一、编写的测试用例

<?phpinclude_once 'class.phpmailer.php';
//echo (extension_loaded('openssl')?' SSL loaded ':' SSL not loaded ')."\n";$mail = new PHPMailer(); //实例化类$mail->IsSMTP();  //使用STMP 方式//$mail->IsMail();//使用sengmail方式$mail->SMTPAuth = true; //开启SMTP认证$mail->IsHTML(true);//$mail->MailDebug = 2;  //是否开始debug模式//$mail->SMTPSecure = 'tls'; //加密协议 (ssl /tls) 设置启用加密 $mail->CharSet ="UTF-8";$mail->Encoding = "base64";$mail->AddAddress("接收人地址");$mail->Subject = 'Test ... ';$mail->Body = 'Test Mail...';$host = '邮件服务器地址';$username = '发送人用户名称';$password = '发送人密码';$from = '发送人邮箱';$fromname = "=?UTF-8?B?".base64_encode(stripslashes('天马博客'))."?="; //$mail->AddReplyTo("", ""); //$mail->AddAttachment("ok.jpg"); //附件 // 以下设置 - 不要更改!$mail->Host = $host;$mail->Username = $username;$mail->Password = $password;$mail->From = $from;$mail->FromName = $fromname; echo "Email Result Info:";if(!$mail->Send()){ echo $mail->ErrorInfo;}else{echo "good!";}
?>

二 、注意事项:

1.利用Stmp 方式来发送邮件时:

a.如使用加密协议发送邮件,windows下需要在php.ini 中配置:extension =php_openssl.dll .(linux 需安装openssl模块)

b.未使用加密协议,需在邮件服务器配置相关的白名单

2.利用sendmail 发送邮件时:

a.php.ini  中 配置sendmail 的路径属性:sendmail_path=“ d:\sendmail \sendmail.exe -t"

b.sendmail.ini 中配置邮箱的stmp 服务器及相应的用户名密码:

smtp_server=mail.sohu.com    #smtp服务器地址
error_logfile=error.log    #错误日志文件
auth_username=xxxx@sohu.com    #邮箱用户名
auth_password=xxxxxx    #邮箱登陆密码

三、常见问题:

解决方法: 开启debug 模式($mail->MailDebug = 2),确认具体的错误信息。

1.  提示错误:"Language string faild to Load: connect_host"

1.1.   AUTH not accept from  server:504 5.7.4 Unrecognized authentication type:  ---非加密发送,开启白名单验证

1.2 .  SMTP -> ERROR: Failed to connect to server: (0)          ---tls 加密发送失败 , 检查 class.phpmailer.php 是否被更改了(SmtpConnect() 方法)

1.3.  此外,邮件服务器,用户名,密码 没有定义或者错误时,也报此错误。

2.  提示错误:"Language string faild to Load: instantiate"

             2.1    ---phpsendmail 调用 MailSend() 报错;                 ----php.ini 及 sendmail.ini  未配置相关信息(见注意事项)

     3.提示错误:"Language string faild to Load: provide_address"  及"Language string failed to load: recipients_failed test@chinastor.com"

----没有定义邮箱($mail->From / $mail->AddAddress )或格式不正确.


四、附录:

1.class.phpmailer.php

<?php
/*~ class.phpmailer.php
.---------------------------------------------------------------------------.
|  Software: PHPMailer - PHP email class                                    |
|   Version: 2.0.0 rc3                                                      |
|   Contact: via sourceforge.net support pages (also www.codeworxtech.com)  |
|      Info: http://phpmailer.sourceforge.net                               |
|   Support: http://sourceforge.net/projects/phpmailer/                     |
| ------------------------------------------------------------------------- |
|    Author: Andy Prevost (project admininistrator)                         |
|    Author: Brent R. Matzelle (original founder)                           |
| Copyright (c) 2004-2007, 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.                                         |
| ------------------------------------------------------------------------- |
| We offer a number of paid services (www.codeworxtech.com):                |
| - Web Hosting on highly optimized fast and secure servers                 |
| - Technology Consulting                                                   |
| - Oursourcing (highly qualified programmers and graphic designers)        |
'---------------------------------------------------------------------------'/*** PHPMailer - PHP email transport class* @package PHPMailer* @author Andy Prevost* @copyright 2004 - 2007 Andy Prevost*/class PHPMailer {/// PROPERTIES, PUBLIC//*** Email priority (1 = High, 3 = Normal, 5 = low).* @var int*/var $Priority          = 3;/*** Sets the CharSet of the message.* @var string*/var $CharSet           = 'iso-8859-1';/*** Sets the Content-type of the message.* @var string*/var $ContentType        = 'text/plain';/*** Sets the Encoding of the message. Options for this are "8bit",* "7bit", "binary", "base64", and "quoted-printable".* @var string*/var $Encoding          = '8bit';/*** Holds the most recent mailer error message.* @var string*/var $ErrorInfo         = '';/*** Sets the From email address for the message.* @var string*/var $From              = 'root@localhost';/*** Sets the From name of the message.* @var string*/var $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*/var $Sender            = '';/*** Sets the Subject of the message.* @var string*/var $Subject           = '';/*** Sets the Body of the message.  This can be either an HTML or text body.* If HTML then run IsHTML(true).* @var string*/var $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*/var $AltBody           = '';/*** Sets word wrapping on the body of the message to a given number of* characters.* @var int*/var $WordWrap          = 0;/*** Method to send mail: ("mail", "sendmail", or "smtp").* @var string*/var $Mailer            = 'mail';/*** Sets the path of the sendmail program.* @var string*/var $Sendmail          = '/usr/sbin/sendmail';/*** Path to PHPMailer plugins.  This is now only useful if the SMTP class* is in a different directory than the PHP include path.* @var string*/var $PluginDir         = '';/*** Holds PHPMailer version.* @var string*/var $Version           = "2.0.0 rc3";/*** Sets the email address that a reading confirmation will be sent.* @var string*/var $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*/var $Hostname          = '';/// 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*/var $Host        = 'localhost';/*** Sets the default SMTP server port.* @var int*/var $Port        = 25;/*** Sets the SMTP HELO of the message (Default is $Hostname).* @var string*/var $Helo        = '';/*** Sets connection prefix.* Options are "", "ssl" or "tls"* @var string*/var $SMTPSecure = "";/*** Sets SMTP authentication. Utilizes the Username and Password variables.* @var bool*/var $SMTPAuth     = false;/*** Sets SMTP username.* @var string*/var $Username     = '';/*** Sets SMTP password.* @var string*/var $Password     = '';/*** Sets the SMTP server timeout in seconds. This function will not* work with the win32 version.* @var int*/var $Timeout      = 10;/*** Sets SMTP class debugging on or off.* @var bool*/var $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*/var $SMTPKeepAlive = false;/*** Provides the ability to have the TO field process individual* emails, instead of sending to entire TO addresses* @var bool*/var $SingleTo = false;/// PROPERTIES, PRIVATE/var $smtp            = NULL;var $to              = array();var $cc              = array();var $bcc             = array();var $ReplyTo         = array();var $attachment      = array();var $CustomHeader    = array();var $message_type    = '';var $boundary        = array();var $language        = array();var $error_count     = 0;var $LE              = "\n";/// METHODS, VARIABLES//*** Sets message type to HTML.* @param bool $bool* @return void*/function IsHTML($bool) {if($bool == true) {$this->ContentType = 'text/html';} else {$this->ContentType = 'text/plain';}}/*** Sets Mailer to send message using SMTP.* @return void*/function IsSMTP() {$this->Mailer = 'smtp';}/*** Sets Mailer to send message using PHP mail() function.* @return void*/function IsMail() {$this->Mailer = 'mail';}/*** Sets Mailer to send message using the $Sendmail program.* @return void*/function IsSendmail() {$this->Mailer = 'sendmail';}/*** Sets Mailer to send message using the qmail MTA.* @return void*/function IsQmail() {$this->Sendmail = '/var/qmail/bin/sendmail';$this->Mailer = 'sendmail';}/// METHODS, RECIPIENTS//*** Adds a "To" address.* @param string $address* @param string $name* @return void*/function AddAddress($address, $name = '') {$cur = count($this->to);$this->to[$cur][0] = trim($address);$this->to[$cur][1] = $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 void*/function AddCC($address, $name = '') {$cur = count($this->cc);$this->cc[$cur][0] = trim($address);$this->cc[$cur][1] = $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 void*/function AddBCC($address, $name = '') {$cur = count($this->bcc);$this->bcc[$cur][0] = trim($address);$this->bcc[$cur][1] = $name;}/*** Adds a "Reply-To" address.* @param string $address* @param string $name* @return void*/function AddReplyTo($address, $name = '') {$cur = count($this->ReplyTo);$this->ReplyTo[$cur][0] = trim($address);$this->ReplyTo[$cur][1] = $name;}/// 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*/function Send() {$header = '';$body = '';$result = true;if((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {$this->SetError($this->Lang('provide_address'));return false;}/* Set whether the message is multipart/alternative */if(!empty($this->AltBody)) {$this->ContentType = 'multipart/alternative';}$this->error_count = 0; // reset errors$this->SetMessageType();$header .= $this->CreateHeader();$body = $this->CreateBody();if($body == '') {return false;}/* Choose the mailer */switch($this->Mailer) {case 'sendmail':$result = $this->SendmailSend($header, $body);break;case 'smtp':$result = $this->SmtpSend($header, $body);break;case 'mail':$result = $this->MailSend($header, $body);break;default:$result = $this->MailSend($header, $body);break;//$this->SetError($this->Mailer . $this->Lang('mailer_not_supported'));//$result = false;//break;}return $result;}/*** Sends mail using the $Sendmail program.* @access private* @return bool*/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(!@$mail = popen($sendmail, 'w')) {$this->SetError($this->Lang('execute') . $this->Sendmail);return false;}fputs($mail, $header);fputs($mail, $body);$result = pclose($mail) >> 8 & 0xFF;if($result != 0) {$this->SetError($this->Lang('execute') . $this->Sendmail);return false;}return true;}/*** Sends mail using the PHP mail() function.* @access private* @return bool*/function MailSend($header, $body) {$to = '';for($i = 0; $i < count($this->to); $i++) {if($i != 0) { $to .= ', '; }$to .= $this->AddrFormat($this->to[$i]);}$toArr = split(',', $to);if ($this->Sender != '' && strlen(ini_get('safe_mode'))< 1) {$old_from = ini_get('sendmail_from');ini_set('sendmail_from', $this->Sender);$params = sprintf("-oi -f %s", $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);}} else {$rt = @mail($to, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params);}} 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);}} else {$rt = @mail($to, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header);}}if (isset($old_from)) {ini_set('sendmail_from', $old_from);}if(!$rt) {$this->SetError($this->Lang('instantiate'));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 SmtpSend($header, $body) {include_once($this->PluginDir . 'class.smtp.php');$error = '';$bad_rcpt = array();if(!$this->SmtpConnect()) {return false;}$smtp_from = ($this->Sender == '') ? $this->From : $this->Sender;if(!$this->smtp->Mail($smtp_from)) {$error = $this->Lang('from_failed') . $smtp_from;$this->SetError($error);$this->smtp->Reset();return false;}/* Attempt to send attach all recipients */for($i = 0; $i < count($this->to); $i++) {if(!$this->smtp->Recipient($this->to[$i][0])) {$bad_rcpt[] = $this->to[$i][0];}}for($i = 0; $i < count($this->cc); $i++) {if(!$this->smtp->Recipient($this->cc[$i][0])) {$bad_rcpt[] = $this->cc[$i][0];}}for($i = 0; $i < count($this->bcc); $i++) {if(!$this->smtp->Recipient($this->bcc[$i][0])) {$bad_rcpt[] = $this->bcc[$i][0];}}if(count($bad_rcpt) > 0) { // Create error messagefor($i = 0; $i < count($bad_rcpt); $i++) {if($i != 0) {$error .= ', ';}$error .= $bad_rcpt[$i];}$error = $this->Lang('recipients_failed') . $error;$this->SetError($error);$this->smtp->Reset();return false;}if(!$this->smtp->Data($header . $body)) {$this->SetError($this->Lang('data_not_accepted'));$this->smtp->Reset();return false;}if($this->SMTPKeepAlive == true) {$this->smtp->Reset();} else {$this->SmtpClose();}return true;}/*** Initiates a connection to an SMTP server.  Returns false if the* operation failed.* @access private* @return bool*/function SmtpConnect() {if($this->smtp == NULL) {$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 connection */while($index < count($hosts) && $connection == false) {$hostinfo = array();if(preg_match('/^(.+):([0-9]+)$/i', $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()) {   $this->SetError($this->Lang('tls'));$this->smtp->Reset();$connection = false;}  //We must resend HELO after tls negotiation  $this->smtp->Hello($hello);  }  $connection = true;  if ($this->SMTPAuth) {  if (!$this->smtp->Authenticate($this->Username, $this->Password)) {  $this->SetError($this->Lang('authenticate'));$this->smtp->Reset();$connection = false;}  }  } $index++;}if(!$connection) {$this->SetError($this->Lang('connect_host'));}return $connection;}/*** Closes the active SMTP session if one exists.* @return void*/function SmtpClose() {if($this->smtp != NULL) {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 type* is English.* @param string $lang_type Type of language (e.g. Portuguese: "br")* @param string $lang_path Path to the language file directory* @access public* @return bool*/function SetLanguage($lang_type, $lang_path = 'language/') {if(file_exists($lang_path.'phpmailer.lang-'.$lang_type.'.php')) {include($lang_path.'phpmailer.lang-'.$lang_type.'.php');} elseif (file_exists($lang_path.'phpmailer.lang-en.php')) {include($lang_path.'phpmailer.lang-en.php');} else {$this->SetError('Could not load language file');return false;}$this->language = $PHPMAILER_LANG;return true;}/// METHODS, MESSAGE CREATION//*** Creates recipient headers.* @access private* @return string*/function AddrAppend($type, $addr) {$addr_str = $type . ': ';$addr_str .= $this->AddrFormat($addr[0]);if(count($addr) > 1) {for($i = 1; $i < count($addr); $i++) {$addr_str .= ', ' . $this->AddrFormat($addr[$i]);}}$addr_str .= $this->LE;return $addr_str;}/*** Formats an address correctly.* @access private* @return string*/function AddrFormat($addr) {if(empty($addr[1])) {$formatted = $this->SecureHeader($addr[0]);} else {$formatted = $this->EncodeHeader($this->SecureHeader($addr[1]), 'phrase') . " <" . $this->SecureHeader($addr[0]) . ">";}return $formatted;}/*** Wraps message for use with mailers that do not* automatically perform wrapping and for quoted-printable.* Original written by philippe.* @access private* @return string*/function WrapText($message, $length, $qp_mode = false) {$soft_break = ($qp_mode) ? sprintf(" =%s", $this->LE) : $this->LE;$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 (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);} 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;}/*** Set the body wrapping.* @access private* @return void*/function SetWordWrap() {if($this->WordWrap < 1) {return;}switch($this->message_type) {case 'alt':/* fall through */case 'alt_attachments':$this->AltBody = $this->WrapText($this->AltBody, $this->WordWrap);break;default:$this->Body = $this->WrapText($this->Body, $this->WordWrap);break;}}/*** Assembles message header.* @access private* @return string*/function CreateHeader() {$result = '';/* Set the boundaries */$uniq_id = md5(uniqid(time()));$this->boundary[1] = 'b1_' . $uniq_id;$this->boundary[2] = 'b2_' . $uniq_id;$result .= $this->HeaderLine('Date', $this->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(count($this->to) > 0) {$result .= $this->AddrAppend('To', $this->to);} elseif (count($this->cc) == 0) {$result .= $this->HeaderLine('To', 'undisclosed-recipients:;');}if(count($this->cc) > 0) {$result .= $this->AddrAppend('Cc', $this->cc);}}$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 sending */if((($this->Mailer == 'sendmail') || ($this->Mailer == 'mail')) && (count($this->cc) > 0)) {$result .= $this->AddrAppend('Cc', $this->cc);}/* sendmail and mail() extract Bcc from the header before sending */if((($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 itself */if($this->Mailer != 'mail') {$result .= $this->HeaderLine('Subject', $this->EncodeHeader($this->SecureHeader($this->Subject)));}$result .= sprintf("Message-ID: <%s@%s>%s", $uniq_id, $this->ServerHostname(), $this->LE);$result .= $this->HeaderLine('X-Priority', $this->Priority);$result .= $this->HeaderLine('X-Mailer', 'PHPMailer (phpmailer.sourceforge.net) [version ' . $this->Version . ']');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])));}$result .= $this->HeaderLine('MIME-Version', '1.0');switch($this->message_type) {case 'plain':$result .= $this->HeaderLine('Content-Transfer-Encoding', $this->Encoding);$result .= sprintf("Content-Type: %s; charset=\"%s\"", $this->ContentType, $this->CharSet);break;case 'attachments':/* fall through */case 'alt_attachments':if($this->InlineImageExists()){$result .= sprintf("Content-Type: %s;%s\ttype=\"text/html\";%s\tboundary=\"%s\"%s", 'multipart/related', $this->LE, $this->LE, $this->boundary[1], $this->LE);} else {$result .= $this->HeaderLine('Content-Type', 'multipart/mixed;');$result .= $this->TextLine("\tboundary=\"" . $this->boundary[1] . '"');}break;case 'alt':$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;}/*** Assembles the message body.  Returns an empty string on failure.* @access private* @return string*/function CreateBody() {$result = '';$this->SetWordWrap();switch($this->message_type) {case 'alt':$result .= $this->GetBoundary($this->boundary[1], '', 'text/plain', '');$result .= $this->EncodeString($this->AltBody, $this->Encoding);$result .= $this->LE.$this->LE;$result .= $this->GetBoundary($this->boundary[1], '', 'text/html', '');$result .= $this->EncodeString($this->Body, $this->Encoding);$result .= $this->LE.$this->LE;$result .= $this->EndBoundary($this->boundary[1]);break;case 'plain':$result .= $this->EncodeString($this->Body, $this->Encoding);break;case 'attachments':$result .= $this->GetBoundary($this->boundary[1], '', '', '');$result .= $this->EncodeString($this->Body, $this->Encoding);$result .= $this->LE;$result .= $this->AttachAll();break;case 'alt_attachments':$result .= sprintf("--%s%s", $this->boundary[1], $this->LE);$result .= sprintf("Content-Type: %s;%s" . "\tboundary=\"%s\"%s", 'multipart/alternative', $this->LE, $this->boundary[2], $this->LE.$this->LE);$result .= $this->GetBoundary($this->boundary[2], '', 'text/plain', '') . $this->LE; // Create text body$result .= $this->EncodeString($this->AltBody, $this->Encoding);$result .= $this->LE.$this->LE;$result .= $this->GetBoundary($this->boundary[2], '', 'text/html', '') . $this->LE; // Create the HTML body$result .= $this->EncodeString($this->Body, $this->Encoding);$result .= $this->LE.$this->LE;$result .= $this->EndBoundary($this->boundary[2]);$result .= $this->AttachAll();break;}if($this->IsError()) {$result = '';}return $result;}/*** Returns the start of a message boundary.* @access private*/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 private*/function EndBoundary($boundary) {return $this->LE . '--' . $boundary . '--' . $this->LE;}/*** Sets the message type.* @access private* @return void*/function SetMessageType() {if(count($this->attachment) < 1 && strlen($this->AltBody) < 1) {$this->message_type = 'plain';} else {if(count($this->attachment) > 0) {$this->message_type = 'attachments';}if(strlen($this->AltBody) > 0 && count($this->attachment) < 1) {$this->message_type = 'alt';}if(strlen($this->AltBody) > 0 && count($this->attachment) > 0) {$this->message_type = 'alt_attachments';}}}/* Returns a formatted header line.* @access private* @return string*/function HeaderLine($name, $value) {return $name . ': ' . $value . $this->LE;}/*** Returns a formatted mail line.* @access private* @return string*/function TextLine($value) {return $value . $this->LE;}/// CLASS METHODS, ATTACHMENTS//*** Adds an attachment from a path on the filesystem.* Returns false if the file could not be found* or accessed.* @param string $path Path to the attachment.* @param string $name Overrides the attachment name.* @param string $encoding File encoding (see $Encoding).* @param string $type File extension (MIME) type.* @return bool*/function AddAttachment($path, $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;}$cur = count($this->attachment);$this->attachment[$cur][0] = $path;$this->attachment[$cur][1] = $filename;$this->attachment[$cur][2] = $name;$this->attachment[$cur][3] = $encoding;$this->attachment[$cur][4] = $type;$this->attachment[$cur][5] = false; // isStringAttachment$this->attachment[$cur][6] = 'attachment';$this->attachment[$cur][7] = 0;return true;}/*** Attaches all fs, string, and binary attachments to the message.* Returns an empty string on failure.* @access private* @return string*/function AttachAll() {/* Return text of body */$mime = array();/* Add all attachments */for($i = 0; $i < count($this->attachment); $i++) {/* Check for string attachment */$bString = $this->attachment[$i][5];if ($bString) {$string = $this->attachment[$i][0];} else {$path = $this->attachment[$i][0];}$filename    = $this->attachment[$i][1];$name        = $this->attachment[$i][2];$encoding    = $this->attachment[$i][3];$type        = $this->attachment[$i][4];$disposition = $this->attachment[$i][6];$cid         = $this->attachment[$i][7];$mime[] = sprintf("--%s%s", $this->boundary[1], $this->LE);$mime[] = sprintf("Content-Type: %s; name=\"%s\"%s", $type, $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, $name, $this->LE.$this->LE);/* Encode as string attachment */if($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", $this->boundary[1], $this->LE);return join('', $mime);}/*** Encodes attachment in requested format.  Returns an* empty string on failure.* @access private* @return string*/function EncodeFile ($path, $encoding = 'base64') {if(!@$fd = fopen($path, 'rb')) {$this->SetError($this->Lang('file_open') . $path);return '';}$magic_quotes = get_magic_quotes_runtime();set_magic_quotes_runtime(0);$file_buffer = fread($fd, filesize($path));$file_buffer = $this->EncodeString($file_buffer, $encoding);fclose($fd);set_magic_quotes_runtime($magic_quotes);return $file_buffer;}/*** Encodes string to requested format. Returns an* empty string on failure.* @access private* @return string*/function EncodeString ($str, $encoding = 'base64') {$encoded = '';switch(strtolower($encoding)) {case 'base64':/* chunk_split is found in PHP >= 3.0.6 */$encoded = chunk_split(base64_encode($str), 76, $this->LE);break;case '7bit':case '8bit':$encoded = $this->FixEOL($str);if (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 of Q, B, quoted or none.* @access private* @return string*/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-through */case '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 output */if (strlen($str)/3 < $x) {$encoding = 'B';$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;}/*** Encode string to quoted-printable.* @access private* @return string*/function EncodeQP( $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 trim($output);}/*** Encode string to q encoding.* @access private* @return string*/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 */$encoded = preg_replace('/([\000-\011\013\014\016-\037\075\077\137\177-\377])/e',"'='.sprintf('%02X', ord('\\1'))", $encoded);break;}/* Replace every spaces to _ (more readable than =20) */$encoded = str_replace(' ', '_', $encoded);return $encoded;}/*** Adds a string or binary attachment (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 attachment data.* @param string $filename Name of the attachment.* @param string $encoding File encoding (see $Encoding).* @param string $type File extension (MIME) type.* @return void*/function AddStringAttachment($string, $filename, $encoding = 'base64', $type = 'application/octet-stream') {/* Append to $attachment array */$cur = count($this->attachment);$this->attachment[$cur][0] = $string;$this->attachment[$cur][1] = $filename;$this->attachment[$cur][2] = $filename;$this->attachment[$cur][3] = $encoding;$this->attachment[$cur][4] = $type;$this->attachment[$cur][5] = true; // isString$this->attachment[$cur][6] = 'attachment';$this->attachment[$cur][7] = 0;}/*** Adds an embedded attachment.  This can include images, sounds, and* just about any other document.  Make sure to set the $type to an* image type.  For JPEG images use "image/jpeg" and for GIF images* use "image/gif".* @param string $path Path to the attachment.* @param string $cid Content ID of the attachment.  Use this to identify*        the Id for accessing the image in an HTML form.* @param string $name Overrides the attachment name.* @param string $encoding File encoding (see $Encoding).* @param string $type File extension (MIME) type.* @return bool*/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 $attachment array */$cur = count($this->attachment);$this->attachment[$cur][0] = $path;$this->attachment[$cur][1] = $filename;$this->attachment[$cur][2] = $name;$this->attachment[$cur][3] = $encoding;$this->attachment[$cur][4] = $type;$this->attachment[$cur][5] = false;$this->attachment[$cur][6] = 'inline';$this->attachment[$cur][7] = $cid;return true;}/*** Returns true if an inline attachment is present.* @access private* @return bool*/function InlineImageExists() {$result = false;for($i = 0; $i < count($this->attachment); $i++) {if($this->attachment[$i][6] == 'inline') {$result = true;break;}}return $result;}/// CLASS METHODS, MESSAGE RESET//*** Clears all recipients assigned in the TO array.  Returns void.* @return void*/function ClearAddresses() {$this->to = array();}/*** Clears all recipients assigned in the CC array.  Returns void.* @return void*/function ClearCCs() {$this->cc = array();}/*** Clears all recipients assigned in the BCC array.  Returns void.* @return void*/function ClearBCCs() {$this->bcc = array();}/*** Clears all recipients assigned in the ReplyTo array.  Returns void.* @return void*/function ClearReplyTos() {$this->ReplyTo = array();}/*** Clears all recipients assigned in the TO, CC and BCC* array.  Returns void.* @return void*/function ClearAllRecipients() {$this->to = array();$this->cc = array();$this->bcc = array();}/*** Clears all previously set filesystem, string, and binary* attachments.  Returns void.* @return void*/function ClearAttachments() {$this->attachment = array();}/*** Clears all custom headers.  Returns void.* @return void*/function ClearCustomHeaders() {$this->CustomHeader = array();}/// CLASS METHODS, MISCELLANEOUS//*** Adds the error message to the error container.* Returns void.* @access private* @return void*/function SetError($msg) {$this->error_count++;$this->ErrorInfo = $msg;}/*** Returns the proper RFC 822 formatted date.* @access private* @return string*/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 appropriate server variable.  Should work with both* PHP 4.1.0+ as well as older versions.  Returns an empty string* if nothing is found.* @access private* @return mixed*/function ServerVar($varName) {global $HTTP_SERVER_VARS;global $HTTP_ENV_VARS;if(!isset($_SERVER)) {$_SERVER = $HTTP_SERVER_VARS;if(!isset($_SERVER['REMOTE_ADDR'])) {$_SERVER = $HTTP_ENV_VARS; // must be Apache}}if(isset($_SERVER[$varName])) {return $_SERVER[$varName];} else {return '';}}/*** Returns the server hostname or 'localhost.localdomain' if unknown.* @access private* @return string*/function ServerHostname() {if ($this->Hostname != '') {$result = $this->Hostname;} elseif ($this->ServerVar('SERVER_NAME') != '') {$result = $this->ServerVar('SERVER_NAME');} else {$result = 'localhost.localdomain';}return $result;}/*** Returns a message in the appropriate language.* @access private* @return string*/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.* @return bool*/function IsError() {return ($this->error_count > 0);}/*** Changes every end of line from CR or LF to CRLF.* @access private* @return string*/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.* @return void*/function AddCustomHeader($custom_header) {$this->CustomHeader[] = explode(':', $custom_header, 2);}/*** Evaluates the message and returns modifications for inline images and backgrounds* @access public* @return $message*/function MsgHTML($message) {preg_match_all("/(src|background)=\"(.*)\"/Ui", $message, $images);if(isset($images[2])) {foreach($images[2] as $i => $url) {$filename  = basename($url);$directory = dirname($url);$cid       = 'cid:' . md5($filename);$fileParts = split("\.", $filename);$ext       = $fileParts[1];$mimeType  = $this->_mime_types($ext);$message = preg_replace("/".$images[1][$i]."=\"".preg_quote($url, '/')."\"/Ui", $images[1][$i]."=\"".$cid."\"", $message);$this->AddEmbeddedImage($url, md5($filename), $filename, 'base64', $mimeType);}}$this->IsHTML(true);$this->Body = $message;$textMsg = trim(strip_tags($message));if ( !empty($textMsg) && empty($this->AltBody) ) {$this->AltBody = $textMsg;}if ( empty($this->AltBody) ) {$this->AltBody = 'To view this email message, open the email in with HTML compatibility!' . "\n\n";}}/*** Gets the mime type of the embedded or inline image* @access private* @return mime type of ext*/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'   =>  'image/bmp','gif'   =>  'image/gif','jpeg'  =>  'image/jpeg','jpg'   =>  'image/jpeg','jpe'   =>  'image/jpeg','png'   =>  'image/png','tiff'  =>  'image/tiff','tif'   =>  'image/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/x-unknown-content-type' : $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*/function set ( $name, $value = '' ) {if ( isset($this->$name) ) {$this->$name = $value;} else {$this->SetError('Cannot set or reset variable ' . $name);return false;}}/*** Read a file from a supplied filename and return it.** @access public* @param string $filename Parameter File Name*/function getFile($filename) {$return = '';if ($fp = fopen($filename, 'rb')) {while (!feof($fp)) {$return .= fread($fp, 1024);}fclose($fp);return $return;} else {return false;}}/*** Strips newlines to prevent header injection.* @access private* @param string $str String* @return string*/function SecureHeader($str) {$str = trim($str);$str = str_replace("\r", "", $str);$str = str_replace("\n", "", $str);return $str;}}?>

2.class.smtp.php

<?php
/*~ class.smtp.php
.---------------------------------------------------------------------------.
|  Software: PHPMailer - PHP email class                                    |
|   Version: 5.0.0                                                          |
|   Contact: via sourceforge.net support pages (also www.codeworxtech.com)  |
|      Info: http://phpmailer.sourceforge.net                               |
|   Support: http://sourceforge.net/projects/phpmailer/                     |
| ------------------------------------------------------------------------- |
|     Admin: Andy Prevost (project admininistrator)                         |
|   Authors: Andy Prevost (codeworxtech) codeworxtech@users.sourceforge.net |
|          : Marcus Bointon (coolbru) coolbru@users.sourceforge.net         |
|   Founder: Brent R. Matzelle (original founder)                           |
| 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.                                         |
| ------------------------------------------------------------------------- |
| We offer a number of paid services (www.codeworxtech.com):                |
| - Web Hosting on highly optimized fast and secure servers                 |
| - Technology Consulting                                                   |
| - Oursourcing (highly qualified programmers and graphic designers)        |
'---------------------------------------------------------------------------'
*//*** PHPMailer - PHP SMTP email transport class* NOTE: Designed for use with PHP version 5 and up* @package PHPMailer* @author Andy Prevost* @author Marcus Bointon* @copyright 2004 - 2008 Andy Prevost* @license http://www.gnu.org/copyleft/lesser.html Distributed under the Lesser General Public License (LGPL)* @version $Id: class.smtp.php 240 2009-03-31 04:40:33Z codeworxtech $*//*** SMTP is rfc 821 compliant and implements all the rfc 821 SMTP* commands except TURN which will always return a not implemented* error. SMTP also provides some utility methods for sending mail* to an SMTP server.* original author: Chris Ryan*/class SMTP {/***  SMTP server port*  @var int*/public $SMTP_PORT = 25;/***  SMTP reply line ending*  @var string*/public $CRLF = "\r\n";/***  Sets whether debugging is turned on*  @var bool*/public $do_debug;       // the level of debug to perform/***  Sets VERP use on/off (default is off)*  @var bool*/public $do_verp = false;/// PROPERTIES, PRIVATE AND PROTECTED/private $smtp_conn; // the socket to the serverprivate $error;     // error if any on the last callprivate $helo_rply; // the reply the server sent to us for HELO/*** Initialize the class so that the data is in a known state.* @access public* @return void*/public function __construct() {$this->smtp_conn = 0;$this->error = null;$this->helo_rply = null;$this->do_debug = 0;}/// CONNECTION FUNCTIONS//*** Connect to the server specified on the port specified.* If the port is not specified use the default SMTP_PORT.* If tval is specified then a connection will try and be* established with the server for that number of seconds.* If tval is not specified the default is 30 seconds to* try on the connection.** SMTP CODE SUCCESS: 220* SMTP CODE FAILURE: 421* @access public* @return bool*/public function Connect($host, $port = 0, $tval = 30) {// set the error val to null so there is no confusion$this->error = null;// make sure we are __not__ connectedif($this->connected()) {// already connected, generate error$this->error = array("error" => "Already connected to a server");return false;}if(empty($port)) {$port = $this->SMTP_PORT;}// connect to the smtp server$this->smtp_conn = @fsockopen($host,    // the host of the server$port,    // the port to use$errno,   // error number if any$errstr,  // error message if any$tval);   // give up after ? secs// verify we connected properlyif(empty($this->smtp_conn)) {$this->error = array("error" => "Failed to connect to server","errno" => $errno,"errstr" => $errstr);if($this->do_debug >= 1) {echo "SMTP -> ERROR: " . $this->error["error"] . ": $errstr ($errno)" . $this->CRLF . '<br />';}return false;}// SMTP server can take longer to respond, give longer timeout for first read// Windows does not have support for this timeout functionif(substr(PHP_OS, 0, 3) != "WIN")socket_set_timeout($this->smtp_conn, $tval, 0);// get any announcement$announce = $this->get_lines();if($this->do_debug >= 2) {echo "SMTP -> FROM SERVER:" . $announce . $this->CRLF . '<br />';}return true;}/*** Initiate a TLS communication with the server.** SMTP CODE 220 Ready to start TLS* SMTP CODE 501 Syntax error (no parameters allowed)* SMTP CODE 454 TLS not available due to temporary reason* @access public* @return bool success*/public function StartTLS() {$this->error = null; # to avoid confusionif(!$this->connected()) {$this->error = array("error" => "Called StartTLS() without being connected");return false;}fputs($this->smtp_conn,"STARTTLS" . $this->CRLF);$rply = $this->get_lines();$code = substr($rply,0,3);if($this->do_debug >= 2) {echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '<br />';}if($code != 220) {$this->error =array("error"     => "STARTTLS not accepted from server","smtp_code" => $code,"smtp_msg"  => substr($rply,4));if($this->do_debug >= 1) {echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />';}return false;}// Begin encrypted connectionif(!stream_socket_enable_crypto($this->smtp_conn, true, STREAM_CRYPTO_METHOD_TLS_CLIENT)) {return false;}return true;}/*** Performs SMTP authentication.  Must be run after running the* Hello() method.  Returns true if successfully authenticated.* @access public* @return bool*/public function Authenticate($username, $password) {// Start authenticationif(!empty($this->smtp_conn)) fputs($this->smtp_conn,"AUTH LOGIN" . $this->CRLF);$rply = $this->get_lines();$code = substr($rply,0,3);if($code != 334) {$this->error =array("error" => "AUTH not accepted from server","smtp_code" => $code,"smtp_msg" => substr($rply,4));if($this->do_debug >= 1) {echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />';}return false;}// Send encoded usernamefputs($this->smtp_conn, base64_encode($username) . $this->CRLF);$rply = $this->get_lines();$code = substr($rply,0,3);if($code != 334) {$this->error =array("error" => "Username not accepted from server","smtp_code" => $code,"smtp_msg" => substr($rply,4));if($this->do_debug >= 1) {echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />';}return false;}// Send encoded passwordfputs($this->smtp_conn, base64_encode($password) . $this->CRLF);$rply = $this->get_lines();$code = substr($rply,0,3);if($code != 235) {$this->error =array("error" => "Password not accepted from server","smtp_code" => $code,"smtp_msg" => substr($rply,4));if($this->do_debug >= 1) {echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />';}return false;}return true;}/*** Returns true if connected to a server otherwise false* @access public* @return bool*/public function Connected() {if(!empty($this->smtp_conn)) {$sock_status = socket_get_status($this->smtp_conn);if($sock_status["eof"]) {// the socket is valid but we are not connectedif($this->do_debug >= 1) {echo "SMTP -> NOTICE:" . $this->CRLF . "EOF caught while checking if connected";}$this->Close();return false;}return true; // everything looks good}return false;}/*** Closes the socket and cleans up the state of the class.* It is not considered good to use this function without* first trying to use QUIT.* @access public* @return void*/public function Close() {$this->error = null; // so there is no confusion$this->helo_rply = null;if(!empty($this->smtp_conn)) {// close the connection and cleanupfclose($this->smtp_conn);$this->smtp_conn = 0;}}/// SMTP COMMANDS//*** Issues a data command and sends the msg_data to the server* finializing the mail transaction. $msg_data is the message* that is to be send with the headers. Each header needs to be* on a single line followed by a <CRLF> with the message headers* and the message body being seperated by and additional <CRLF>.** Implements rfc 821: DATA <CRLF>** SMTP CODE INTERMEDIATE: 354*     [data]*     <CRLF>.<CRLF>*     SMTP CODE SUCCESS: 250*     SMTP CODE FAILURE: 552,554,451,452* SMTP CODE FAILURE: 451,554* SMTP CODE ERROR  : 500,501,503,421* @access public* @return bool*/public function Data($msg_data) {$this->error = null; // so no confusion is causedif(!$this->connected()) {$this->error = array("error" => "Called Data() without being connected");return false;}fputs($this->smtp_conn,"DATA" . $this->CRLF);$rply = $this->get_lines();$code = substr($rply,0,3);if($this->do_debug >= 2) {echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '<br />';}if($code != 354) {$this->error =array("error" => "DATA command not accepted from server","smtp_code" => $code,"smtp_msg" => substr($rply,4));if($this->do_debug >= 1) {echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />';}return false;}/* the server is ready to accept data!* according to rfc 821 we should not send more than 1000* including the CRLF* characters on a single line so we will break the data up* into lines by \r and/or \n then if needed we will break* each of those into smaller lines to fit within the limit.* in addition we will be looking for lines that start with* a period '.' and append and additional period '.' to that* line. NOTE: this does not count towards limit.*/// normalize the line breaks so we know the explode works$msg_data = str_replace("\r\n","\n",$msg_data);$msg_data = str_replace("\r","\n",$msg_data);$lines = explode("\n",$msg_data);/* we need to find a good way to determine is headers are* in the msg_data or if it is a straight msg body* currently I am assuming rfc 822 definitions of msg headers* and if the first field of the first line (':' sperated)* does not contain a space then it _should_ be a header* and we can process all lines before a blank "" line as* headers.*/$field = substr($lines[0],0,strpos($lines[0],":"));$in_headers = false;if(!empty($field) && !strstr($field," ")) {$in_headers = true;}$max_line_length = 998; // used below; set here for ease in changewhile(list(,$line) = @each($lines)) {$lines_out = null;if($line == "" && $in_headers) {$in_headers = false;}// ok we need to break this line up into several smaller lineswhile(strlen($line) > $max_line_length) {$pos = strrpos(substr($line,0,$max_line_length)," ");// Patch to fix DOS attackif(!$pos) {$pos = $max_line_length - 1;$lines_out[] = substr($line,0,$pos);$line = substr($line,$pos);} else {$lines_out[] = substr($line,0,$pos);$line = substr($line,$pos + 1);}/* if processing headers add a LWSP-char to the front of new line* rfc 822 on long msg headers*/if($in_headers) {$line = "\t" . $line;}}$lines_out[] = $line;// send the lines to the serverwhile(list(,$line_out) = @each($lines_out)) {if(strlen($line_out) > 0){if(substr($line_out, 0, 1) == ".") {$line_out = "." . $line_out;}}fputs($this->smtp_conn,$line_out . $this->CRLF);}}// message data has been sentfputs($this->smtp_conn, $this->CRLF . "." . $this->CRLF);$rply = $this->get_lines();$code = substr($rply,0,3);if($this->do_debug >= 2) {echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '<br />';}if($code != 250) {$this->error =array("error" => "DATA not accepted from server","smtp_code" => $code,"smtp_msg" => substr($rply,4));if($this->do_debug >= 1) {echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />';}return false;}return true;}/*** Sends the HELO command to the smtp server.* This makes sure that we and the server are in* the same known state.** Implements from rfc 821: HELO <SP> <domain> <CRLF>** SMTP CODE SUCCESS: 250* SMTP CODE ERROR  : 500, 501, 504, 421* @access public* @return bool*/public function Hello($host = '') {$this->error = null; // so no confusion is causedif(!$this->connected()) {$this->error = array("error" => "Called Hello() without being connected");return false;}// if hostname for HELO was not specified send defaultif(empty($host)) {// determine appropriate default to send to server$host = "localhost";}// Send extended hello first (RFC 2821)if(!$this->SendHello("EHLO", $host)) {if(!$this->SendHello("HELO", $host)) {return false;}}return true;}/*** Sends a HELO/EHLO command.* @access private* @return bool*/private function SendHello($hello, $host) {fputs($this->smtp_conn, $hello . " " . $host . $this->CRLF);$rply = $this->get_lines();$code = substr($rply,0,3);if($this->do_debug >= 2) {echo "SMTP -> FROM SERVER: " . $rply . $this->CRLF . '<br />';}if($code != 250) {$this->error =array("error" => $hello . " not accepted from server","smtp_code" => $code,"smtp_msg" => substr($rply,4));if($this->do_debug >= 1) {echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />';}return false;}$this->helo_rply = $rply;return true;}/*** Starts a mail transaction from the email address specified in* $from. Returns true if successful or false otherwise. If True* the mail transaction is started and then one or more Recipient* commands may be called followed by a Data command.** Implements rfc 821: MAIL <SP> FROM:<reverse-path> <CRLF>** SMTP CODE SUCCESS: 250* SMTP CODE SUCCESS: 552,451,452* SMTP CODE SUCCESS: 500,501,421* @access public* @return bool*/public function Mail($from) {$this->error = null; // so no confusion is causedif(!$this->connected()) {$this->error = array("error" => "Called Mail() without being connected");return false;}$useVerp = ($this->do_verp ? "XVERP" : "");fputs($this->smtp_conn,"MAIL FROM:<" . $from . ">" . $useVerp . $this->CRLF);$rply = $this->get_lines();$code = substr($rply,0,3);if($this->do_debug >= 2) {echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '<br />';}if($code != 250) {$this->error =array("error" => "MAIL not accepted from server","smtp_code" => $code,"smtp_msg" => substr($rply,4));if($this->do_debug >= 1) {echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />';}return false;}return true;}/*** Sends the quit command to the server and then closes the socket* if there is no error or the $close_on_error argument is true.** Implements from rfc 821: QUIT <CRLF>** SMTP CODE SUCCESS: 221* SMTP CODE ERROR  : 500* @access public* @return bool*/public function Quit($close_on_error = true) {$this->error = null; // so there is no confusionif(!$this->connected()) {$this->error = array("error" => "Called Quit() without being connected");return false;}// send the quit command to the serverfputs($this->smtp_conn,"quit" . $this->CRLF);// get any good-bye messages$byemsg = $this->get_lines();if($this->do_debug >= 2) {echo "SMTP -> FROM SERVER:" . $byemsg . $this->CRLF . '<br />';}$rval = true;$e = null;$code = substr($byemsg,0,3);if($code != 221) {// use e as a tmp var cause Close will overwrite $this->error$e = array("error" => "SMTP server rejected quit command","smtp_code" => $code,"smtp_rply" => substr($byemsg,4));$rval = false;if($this->do_debug >= 1) {echo "SMTP -> ERROR: " . $e["error"] . ": " . $byemsg . $this->CRLF . '<br />';}}if(empty($e) || $close_on_error) {$this->Close();}return $rval;}/*** Sends the command RCPT to the SMTP server with the TO: argument of $to.* Returns true if the recipient was accepted false if it was rejected.** Implements from rfc 821: RCPT <SP> TO:<forward-path> <CRLF>** SMTP CODE SUCCESS: 250,251* SMTP CODE FAILURE: 550,551,552,553,450,451,452* SMTP CODE ERROR  : 500,501,503,421* @access public* @return bool*/public function Recipient($to) {$this->error = null; // so no confusion is causedif(!$this->connected()) {$this->error = array("error" => "Called Recipient() without being connected");return false;}fputs($this->smtp_conn,"RCPT TO:<" . $to . ">" . $this->CRLF);$rply = $this->get_lines();$code = substr($rply,0,3);if($this->do_debug >= 2) {echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '<br />';}if($code != 250 && $code != 251) {$this->error =array("error" => "RCPT not accepted from server","smtp_code" => $code,"smtp_msg" => substr($rply,4));if($this->do_debug >= 1) {echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />';}return false;}return true;}/*** Sends the RSET command to abort and transaction that is* currently in progress. Returns true if successful false* otherwise.** Implements rfc 821: RSET <CRLF>** SMTP CODE SUCCESS: 250* SMTP CODE ERROR  : 500,501,504,421* @access public* @return bool*/public function Reset() {$this->error = null; // so no confusion is causedif(!$this->connected()) {$this->error = array("error" => "Called Reset() without being connected");return false;}fputs($this->smtp_conn,"RSET" . $this->CRLF);$rply = $this->get_lines();$code = substr($rply,0,3);if($this->do_debug >= 2) {echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '<br />';}if($code != 250) {$this->error =array("error" => "RSET failed","smtp_code" => $code,"smtp_msg" => substr($rply,4));if($this->do_debug >= 1) {echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />';}return false;}return true;}/*** Starts a mail transaction from the email address specified in* $from. Returns true if successful or false otherwise. If True* the mail transaction is started and then one or more Recipient* commands may be called followed by a Data command. This command* will send the message to the users terminal if they are logged* in and send them an email.** Implements rfc 821: SAML <SP> FROM:<reverse-path> <CRLF>** SMTP CODE SUCCESS: 250* SMTP CODE SUCCESS: 552,451,452* SMTP CODE SUCCESS: 500,501,502,421* @access public* @return bool*/public function SendAndMail($from) {$this->error = null; // so no confusion is causedif(!$this->connected()) {$this->error = array("error" => "Called SendAndMail() without being connected");return false;}fputs($this->smtp_conn,"SAML FROM:" . $from . $this->CRLF);$rply = $this->get_lines();$code = substr($rply,0,3);if($this->do_debug >= 2) {echo "SMTP -> FROM SERVER:" . $rply . $this->CRLF . '<br />';}if($code != 250) {$this->error =array("error" => "SAML not accepted from server","smtp_code" => $code,"smtp_msg" => substr($rply,4));if($this->do_debug >= 1) {echo "SMTP -> ERROR: " . $this->error["error"] . ": " . $rply . $this->CRLF . '<br />';}return false;}return true;}/*** This is an optional command for SMTP that this class does not* support. This method is here to make the RFC821 Definition* complete for this class and __may__ be implimented in the future** Implements from rfc 821: TURN <CRLF>** SMTP CODE SUCCESS: 250* SMTP CODE FAILURE: 502* SMTP CODE ERROR  : 500, 503* @access public* @return bool*/public function Turn() {$this->error = array("error" => "This method, TURN, of the SMTP "."is not implemented");if($this->do_debug >= 1) {echo "SMTP -> NOTICE: " . $this->error["error"] . $this->CRLF . '<br />';}return false;}/*** Get the current error* @access public* @return array*/public function getError() {return $this->error;}/// INTERNAL FUNCTIONS//*** Read in as many lines as possible* either before eof or socket timeout occurs on the operation.* With SMTP we can tell if we have more lines to read if the* 4th character is '-' symbol. If it is a space then we don't* need to read anything else.* @access private* @return string*/private function get_lines() {$data = "";while($str = @fgets($this->smtp_conn,515)) {if($this->do_debug >= 4) {echo "SMTP -> get_lines(): \$data was \"$data\"" . $this->CRLF . '<br />';echo "SMTP -> get_lines(): \$str is \"$str\"" . $this->CRLF . '<br />';}$data .= $str;if($this->do_debug >= 4) {echo "SMTP -> get_lines(): \$data is \"$data\"" . $this->CRLF . '<br />';}// if 4th character is a space, we are done reading, break the loopif(substr($str,3,1) == " ") { break; }}return $data;}}?>

3.class.pop3.php

<?php
/*~ class.pop3.php
.---------------------------------------------------------------------------.
|  Software: PHPMailer - PHP email class                                    |
|   Version: 5.0.0                                                          |
|   Contact: via sourceforge.net support pages (also www.codeworxtech.com)  |
|      Info: http://phpmailer.sourceforge.net                               |
|   Support: http://sourceforge.net/projects/phpmailer/                     |
| ------------------------------------------------------------------------- |
|     Admin: Andy Prevost (project admininistrator)                         |
|   Authors: Andy Prevost (codeworxtech) codeworxtech@users.sourceforge.net |
|          : Marcus Bointon (coolbru) coolbru@users.sourceforge.net         |
|   Founder: Brent R. Matzelle (original founder)                           |
| 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.                                         |
| ------------------------------------------------------------------------- |
| We offer a number of paid services (www.codeworxtech.com):                |
| - Web Hosting on highly optimized fast and secure servers                 |
| - Technology Consulting                                                   |
| - Oursourcing (highly qualified programmers and graphic designers)        |
'---------------------------------------------------------------------------'
*//*** PHPMailer - PHP POP Before SMTP Authentication Class* NOTE: Designed for use with PHP version 5 and up* @package PHPMailer* @author Andy Prevost* @author Marcus Bointon* @copyright 2004 - 2009 Andy Prevost* @license http://www.gnu.org/copyleft/lesser.html Distributed under the Lesser General Public License (LGPL)* @version $Id: class.pop3.php 241 2009-03-31 04:44:24Z codeworxtech $*//*** POP Before SMTP Authentication Class* Version 5.0.0** Author: Richard Davey (rich@corephp.co.uk)* Modifications: Andy Prevost* License: LGPL, see PHPMailer License** Specifically for PHPMailer to allow POP before SMTP authentication.* Does not yet work with APOP - if you have an APOP account, contact Richard Davey* and we can test changes to this script.** This class is based on the structure of the SMTP class originally authored by Chris Ryan** This class is rfc 1939 compliant and implements all the commands* required for POP3 connection, authentication and disconnection.** @package PHPMailer* @author Richard Davey*/class POP3 {/*** Default POP3 port* @var int*/public $POP3_PORT = 110;/*** Default Timeout* @var int*/public $POP3_TIMEOUT = 30;/*** POP3 Carriage Return + Line Feed* @var string*/public $CRLF = "\r\n";/*** Displaying Debug warnings? (0 = now, 1+ = yes)* @var int*/public $do_debug = 2;/*** POP3 Mail Server* @var string*/public $host;/*** POP3 Port* @var int*/public $port;/*** POP3 Timeout Value* @var int*/public $tval;/*** POP3 Username* @var string*/public $username;/*** POP3 Password* @var string*/public $password;/// PROPERTIES, PRIVATE AND PROTECTED/private $pop_conn;private $connected;private $error;     //  Error log array/*** Constructor, sets the initial values* @access public* @return POP3*/public function __construct() {$this->pop_conn  = 0;$this->connected = false;$this->error     = null;}/*** Combination of public events - connect, login, disconnect* @access public* @param string $host* @param integer $port* @param integer $tval* @param string $username* @param string $password*/public function Authorise ($host, $port = false, $tval = false, $username, $password, $debug_level = 0) {$this->host = $host;//  If no port value is passed, retrieve itif ($port == false) {$this->port = $this->POP3_PORT;} else {$this->port = $port;}//  If no port value is passed, retrieve itif ($tval == false) {$this->tval = $this->POP3_TIMEOUT;} else {$this->tval = $tval;}$this->do_debug = $debug_level;$this->username = $username;$this->password = $password;//  Refresh the error log$this->error = null;//  Connect$result = $this->Connect($this->host, $this->port, $this->tval);if ($result) {$login_result = $this->Login($this->username, $this->password);if ($login_result) {$this->Disconnect();return true;}}//  We need to disconnect regardless if the login succeeded$this->Disconnect();return false;}/*** Connect to the POP3 server* @access public* @param string $host* @param integer $port* @param integer $tval* @return boolean*/public function Connect ($host, $port = false, $tval = 30) {//  Are we already connected?if ($this->connected) {return true;}/*On Windows this will raise a PHP Warning error if the hostname doesn't exist.Rather than supress it with @fsockopen, let's capture it cleanly instead*/set_error_handler(array(&$this, 'catchWarning'));//  Connect to the POP3 server$this->pop_conn = fsockopen($host,    //  POP3 Host$port,    //  Port #$errno,   //  Error Number$errstr,  //  Error Message$tval);   //  Timeout (seconds)//  Restore the error handlerrestore_error_handler();//  Does the Error Log now contain anything?if ($this->error && $this->do_debug >= 1) {$this->displayErrors();}//  Did we connect?if ($this->pop_conn == false) {//  It would appear not...$this->error = array('error' => "Failed to connect to server $host on port $port",'errno' => $errno,'errstr' => $errstr);if ($this->do_debug >= 1) {$this->displayErrors();}return false;}//  Increase the stream time-out//  Check for PHP 4.3.0 or laterif (version_compare(phpversion(), '5.0.0', 'ge')) {stream_set_timeout($this->pop_conn, $tval, 0);} else {//  Does not work on Windowsif (substr(PHP_OS, 0, 3) !== 'WIN') {socket_set_timeout($this->pop_conn, $tval, 0);}}//  Get the POP3 server response$pop3_response = $this->getResponse();//  Check for the +OKif ($this->checkResponse($pop3_response)) {//  The connection is established and the POP3 server is talking$this->connected = true;return true;}}/*** Login to the POP3 server (does not support APOP yet)* @access public* @param string $username* @param string $password* @return boolean*/public function Login ($username = '', $password = '') {if ($this->connected == false) {$this->error = 'Not connected to POP3 server';if ($this->do_debug >= 1) {$this->displayErrors();}}if (empty($username)) {$username = $this->username;}if (empty($password)) {$password = $this->password;}$pop_username = "USER $username" . $this->CRLF;$pop_password = "PASS $password" . $this->CRLF;//  Send the Username$this->sendString($pop_username);$pop3_response = $this->getResponse();if ($this->checkResponse($pop3_response)) {//  Send the Password$this->sendString($pop_password);$pop3_response = $this->getResponse();if ($this->checkResponse($pop3_response)) {return true;} else {return false;}} else {return false;}}/*** Disconnect from the POP3 server* @access public*/public function Disconnect () {$this->sendString('QUIT');fclose($this->pop_conn);}///  Private Methods//*** Get the socket response back.* $size is the maximum number of bytes to retrieve* @access private* @param integer $size* @return string*/private function getResponse ($size = 128) {$pop3_response = fgets($this->pop_conn, $size);return $pop3_response;}/*** Send a string down the open socket connection to the POP3 server* @access private* @param string $string* @return integer*/private function sendString ($string) {$bytes_sent = fwrite($this->pop_conn, $string, strlen($string));return $bytes_sent;}/*** Checks the POP3 server response for +OK or -ERR* @access private* @param string $string* @return boolean*/private function checkResponse ($string) {if (substr($string, 0, 3) !== '+OK') {$this->error = array('error' => "Server reported an error: $string",'errno' => 0,'errstr' => '');if ($this->do_debug >= 1) {$this->displayErrors();}return false;} else {return true;}}/*** If debug is enabled, display the error message array* @access private*/private function displayErrors () {echo '<pre>';foreach ($this->error as $single_error) {print_r($single_error);}echo '</pre>';}/*** Takes over from PHP for the socket warning handler* @access private* @param integer $errno* @param string $errstr* @param string $errfile* @param integer $errline*/private function catchWarning ($errno, $errstr, $errfile, $errline) {$this->error[] = array('error' => "Connecting to the POP3 server raised a PHP warning: ",'errno' => $errno,'errstr' => $errstr);}//  End of class
}
?>

php 利用phpmailer 发送邮件相关推荐

  1. php phpmailer qq邮箱,QQ邮箱利用PHPmailer发送邮件

    require_once("class.phpmailer.php"); $mail = new PHPMailer(); //是否启用smtp的debug进行调试 开发环境建议开 ...

  2. thinkphp5.1 利用 PHPMailer 发送邮件

    1.composer 下载 PHPMailer 类 composer require phpmailer/phpmailer 下完后在 vendor 文件夹下会有 phpmailer 文件夹,如果不使 ...

  3. PHP下利用PHPMailer配合QQ邮箱下的域名邮箱发送邮件

    作为PHP入门开发者,常常有这种述求:自己的网站中需要添加一个使用自己的域名作为发件人邮件地址的自动发送邮件的方法,用于诸如给用户发送验证码.通知信息等.比如:我的某个用户注册模块,需要使用regis ...

  4. 板邓:PHP下利用PHPMailer配合QQ邮箱下的域名邮箱发送邮件(转)

    作为PHP入门开发者,常常有这种述求:自己的网站中需要添加一个使用自己的域名作为发件人邮件地址的自动发送邮件的方法,用于诸如给用户发送验证码.通知信息等.比如:我的某个用户注册模块,需要使用regis ...

  5. php mail发送邮件,PHP中利用PHPMailer实现发邮件

    下面以QQ邮箱为例,按照这四个方面来介绍PHPMaIiler的使用: PHPMailer的介绍 步骤一:使QQ邮箱能够发送邮件 步骤二:使PHP能够使用QQ邮箱发送邮件 步骤三:编写发送邮件代码 Th ...

  6. phpmail通过qq发邮箱失败_PHP中利用PHPMailer配合QQ邮箱实现发邮件

    phpmailer实现给网站用户发送邮件,WordPress好像禁用了mail()函数,也不能直接使用自带的发送邮件,以防止暴露IP PHPMailer的介绍: 可运行在任何平台之上 支持SMTP验证 ...

  7. PHP中利用PHPMailer配合QQ邮箱实现发邮件

    前言: 由于作业的需要,要实现给我们的网站用户发送邮件,于是就有了这篇博客.以下的内容是我结合网上的例子加上自己的实践的出来的.希望对大家有帮助. PHPMailer的介绍: 优点: 可运行在任何平台 ...

  8. php fsockopen smtp,PHPmailer发送邮件 出现无法连接服务器、函数 fsockopen()被禁用 解决办法 Subjectn...

    发现使用PHPmailer发送邮件不成功,提示"不能连接SMTP服务器."(Error: Could not connect to SMTP host). 找了很多的方法花费了很多 ...

  9. php邮件发送tp,在Thinkphp3.2 中使用PHPMailer 发送邮件

    phpmailer发送邮件是php开发者首选的一个邮件发送插件了,下面我来介绍怎么集成phpmailer到thinkphp框架了,有需要了解的朋友可参考. phpmailer发送邮件功能很强大,今天真 ...

最新文章

  1. 你的裸照,一键生成,令人害怕的不是算法,是人心!
  2. pymysq向mysql写数据 为什么本地无法查看_从运维角度浅谈MySQL数据库优化,中小企业DBA必会...
  3. JVM新生代老年代GC分析
  4. oracle同步恢复目录,Oracle创建恢复目录(catalog)
  5. oppoJava面试题,java声明全局变量的关键字
  6. 20190501-编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串...
  7. linux 自动安装系统,cobbler 自动安装linux系统
  8. 多语言跨平台远程过程调用【Avro】
  9. 基于map函数生成星战片头动画
  10. tp ajax 多图上传,TP5 Ajax上传图片
  11. sql 财务科目余额表写法
  12. PAT练习集L1之四(10分题之不仔细看头铁wa题)
  13. ps图案叠加怎么添加图案?Photoshop图案如何使用?
  14. 《大象--Thinking in UML 第二版》已于近日在当当首发,同时邀请各位加入新浪微博[大象-thinkinginUml群]:http://q.weibo.com/1483929
  15. JAVA 生成二维码并写到EXCEL中导出
  16. 常用颜色代码表以及中国传统颜色名录
  17. 常见的网站攻击方式和防护方式
  18. php开发多用户商城用什么技术,php多用户商城系统有什么特点?
  19. 微信小程序驾考驾校考试预约信息管理系统SSM-JAVA【数据库设计、论文、源码、开题报告】
  20. Mybatis3基础示例

热门文章

  1. English--基础知识点--4--使役动词
  2. 源码安装mysql,详细
  3. kubernetes1.8.5集群安装(带证书)
  4. steam解锁未购买游戏工具
  5. 【学习cmake】cmake如何使用链接库 (link_directories, LINK_LIBRARIES, target_link_libraries,FIND_PACKAGE)实践篇2
  6. Error processing condition on org.springframework.boot.autoconfigure.context.PropertyPlaceholderAuto
  7. AD设计图纸模板创建(转)
  8. Python_ML-Day04: 深度学习、Tensorflow
  9. 北邮数据挖掘文本分类实验
  10. 微信公众号授权(获取用户信息)