PHP Cross Reference of WordPress Subversion HEAD |
| [ Index ] [ Classes ] [ Functions ] [ Variables ] [ Constants ] |
[Summary view] [Print] [Text view]
1 <?php 2 //////////////////////////////////////////////////// 3 // PHPMailer - PHP email class 4 // 5 // Class for sending email using either 6 // sendmail, PHP mail(), or SMTP. Methods are 7 // based upon the standard AspEmail(tm) classes. 8 // 9 // Copyright (C) 2001 - 2003 Brent R. Matzelle 10 // 11 // License: LGPL, see LICENSE 12 //////////////////////////////////////////////////// 13 14 /** 15 * PHPMailer - PHP email transport class 16 * @package PHPMailer 17 * @author Brent R. Matzelle 18 * @copyright 2001 - 2003 Brent R. Matzelle 19 */ 20 class PHPMailer 21 { 22 ///////////////////////////////////////////////// 23 // PUBLIC VARIABLES 24 ///////////////////////////////////////////////// 25 26 /** 27 * Email priority (1 = High, 3 = Normal, 5 = low). 28 * @var int 29 */ 30 var $Priority = 3; 31 32 /** 33 * Sets the CharSet of the message. 34 * @var string 35 */ 36 var $CharSet = "UTF-8"; 37 38 /** 39 * Sets the Content-type of the message. 40 * @var string 41 */ 42 var $ContentType = "text/plain"; 43 44 /** 45 * Sets the Encoding of the message. Options for this are "8bit", 46 * "7bit", "binary", "base64", and "quoted-printable". 47 * @var string 48 */ 49 var $Encoding = "8bit"; 50 51 /** 52 * Holds the most recent mailer error message. 53 * @var string 54 */ 55 var $ErrorInfo = ""; 56 57 /** 58 * Sets the From email address for the message. 59 * @var string 60 */ 61 var $From = "support@wordpress.com"; 62 63 /** 64 * Sets the From name of the message. 65 * @var string 66 */ 67 var $FromName = "Support"; 68 69 /** 70 * Sets the Sender email (Return-Path) of the message. If not empty, 71 * will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode. 72 * @var string 73 */ 74 var $Sender = ""; 75 76 /** 77 * Sets the Subject of the message. 78 * @var string 79 */ 80 var $Subject = ""; 81 82 /** 83 * Sets the Body of the message. This can be either an HTML or text body. 84 * If HTML then run IsHTML(true). 85 * @var string 86 */ 87 var $Body = ""; 88 89 /** 90 * Sets the text-only body of the message. This automatically sets the 91 * email to multipart/alternative. This body can be read by mail 92 * clients that do not have HTML email capability such as mutt. Clients 93 * that can read HTML will view the normal Body. 94 * @var string 95 */ 96 var $AltBody = ""; 97 98 /** 99 * Sets word wrapping on the body of the message to a given number of 100 * characters. 101 * @var int 102 */ 103 var $WordWrap = 0; 104 105 /** 106 * Method to send mail: ("mail", "sendmail", or "smtp"). 107 * @var string 108 */ 109 var $Mailer = "mail"; 110 111 /** 112 * Sets the path of the sendmail program. 113 * @var string 114 */ 115 var $Sendmail = "/usr/sbin/sendmail"; 116 117 /** 118 * Path to PHPMailer plugins. This is now only useful if the SMTP class 119 * is in a different directory than the PHP include path. 120 * @var string 121 */ 122 var $PluginDir = ""; 123 124 /** 125 * Holds PHPMailer version. 126 * @var string 127 */ 128 var $Version = "1.73"; 129 130 /** 131 * Sets the email address that a reading confirmation will be sent. 132 * @var string 133 */ 134 var $ConfirmReadingTo = ""; 135 136 /** 137 * Sets the hostname to use in Message-Id and Received headers 138 * and as default HELO string. If empty, the value returned 139 * by SERVER_NAME is used or 'localhost.localdomain'. 140 * @var string 141 */ 142 var $Hostname = ""; 143 144 ///////////////////////////////////////////////// 145 // SMTP VARIABLES 146 ///////////////////////////////////////////////// 147 148 /** 149 * Sets the SMTP hosts. All hosts must be separated by a 150 * semicolon. You can also specify a different port 151 * for each host by using this format: [hostname:port] 152 * (e.g. "smtp1.example.com:25;smtp2.example.com"). 153 * Hosts will be tried in order. 154 * @var string 155 */ 156 var $Host = "localhost"; 157 158 /** 159 * Sets the default SMTP server port. 160 * @var int 161 */ 162 var $Port = 25; 163 164 /** 165 * Sets the SMTP HELO of the message (Default is $Hostname). 166 * @var string 167 */ 168 var $Helo = ""; 169 170 /** 171 * Sets SMTP authentication. Utilizes the Username and Password variables. 172 * @var bool 173 */ 174 var $SMTPAuth = false; 175 176 /** 177 * Sets SMTP username. 178 * @var string 179 */ 180 var $Username = ""; 181 182 /** 183 * Sets SMTP password. 184 * @var string 185 */ 186 var $Password = ""; 187 188 /** 189 * Sets the SMTP server timeout in seconds. This function will not 190 * work with the win32 version. 191 * @var int 192 */ 193 var $Timeout = 10; 194 195 /** 196 * Sets SMTP class debugging on or off. 197 * @var bool 198 */ 199 var $SMTPDebug = false; 200 201 /** 202 * Prevents the SMTP connection from being closed after each mail 203 * sending. If this is set to true then to close the connection 204 * requires an explicit call to SmtpClose(). 205 * @var bool 206 */ 207 var $SMTPKeepAlive = false; 208 209 /**#@+ 210 * @access private 211 */ 212 var $smtp = NULL; 213 var $to = array(); 214 var $cc = array(); 215 var $bcc = array(); 216 var $ReplyTo = array(); 217 var $attachment = array(); 218 var $CustomHeader = array(); 219 var $message_type = ""; 220 var $boundary = array(); 221 var $language = array(); 222 var $error_count = 0; 223 var $LE = "\n"; 224 /**#@-*/ 225 226 ///////////////////////////////////////////////// 227 // VARIABLE METHODS 228 ///////////////////////////////////////////////// 229 230 /** 231 * Sets message type to HTML. 232 * @param bool $bool 233 * @return void 234 */ 235 function IsHTML($bool) { 236 if($bool == true) 237 $this->ContentType = "text/html"; 238 else 239 $this->ContentType = "text/plain"; 240 } 241 242 /** 243 * Sets Mailer to send message using SMTP. 244 * @return void 245 */ 246 function IsSMTP() { 247 $this->Mailer = "smtp"; 248 } 249 250 /** 251 * Sets Mailer to send message using PHP mail() function. 252 * @return void 253 */ 254 function IsMail() { 255 $this->Mailer = "mail"; 256 } 257 258 /** 259 * Sets Mailer to send message using the $Sendmail program. 260 * @return void 261 */ 262 function IsSendmail() { 263 $this->Mailer = "sendmail"; 264 } 265 266 /** 267 * Sets Mailer to send message using the qmail MTA. 268 * @return void 269 */ 270 function IsQmail() { 271 $this->Sendmail = "/var/qmail/bin/sendmail"; 272 $this->Mailer = "sendmail"; 273 } 274 275 276 ///////////////////////////////////////////////// 277 // RECIPIENT METHODS 278 ///////////////////////////////////////////////// 279 280 /** 281 * Adds a "To" address. 282 * @param string $address 283 * @param string $name 284 * @return void 285 */ 286 function AddAddress($address, $name = "") { 287 $cur = count($this->to); 288 $this->to[$cur][0] = trim($address); 289 $this->to[$cur][1] = $name; 290 } 291 292 /** 293 * Adds a "Cc" address. Note: this function works 294 * with the SMTP mailer on win32, not with the "mail" 295 * mailer. 296 * @param string $address 297 * @param string $name 298 * @return void 299 */ 300 function AddCC($address, $name = "") { 301 $cur = count($this->cc); 302 $this->cc[$cur][0] = trim($address); 303 $this->cc[$cur][1] = $name; 304 } 305 306 /** 307 * Adds a "Bcc" address. Note: this function works 308 * with the SMTP mailer on win32, not with the "mail" 309 * mailer. 310 * @param string $address 311 * @param string $name 312 * @return void 313 */ 314 function AddBCC($address, $name = "") { 315 $cur = count($this->bcc); 316 $this->bcc[$cur][0] = trim($address); 317 $this->bcc[$cur][1] = $name; 318 } 319 320 /** 321 * Adds a "Reply-to" address. 322 * @param string $address 323 * @param string $name 324 * @return void 325 */ 326 function AddReplyTo($address, $name = "") { 327 $cur = count($this->ReplyTo); 328 $this->ReplyTo[$cur][0] = trim($address); 329 $this->ReplyTo[$cur][1] = $name; 330 } 331 332 333 ///////////////////////////////////////////////// 334 // MAIL SENDING METHODS 335 ///////////////////////////////////////////////// 336 337 /** 338 * Creates message and assigns Mailer. If the message is 339 * not sent successfully then it returns false. Use the ErrorInfo 340 * variable to view description of the error. 341 * @return bool 342 */ 343 function Send() { 344 $header = ""; 345 $body = ""; 346 $result = true; 347 348 if((count($this->to) + count($this->cc) + count($this->bcc)) < 1) 349 { 350 $this->SetError($this->Lang("provide_address")); 351 return false; 352 } 353 354 // Set whether the message is multipart/alternative 355 if(!empty($this->AltBody)) 356 $this->ContentType = "multipart/alternative"; 357 358 $this->error_count = 0; // reset errors 359 $this->SetMessageType(); 360 $header .= $this->CreateHeader(); 361 $body = $this->CreateBody(); 362 363 if($body == "") { return false; } 364 365 // Choose the mailer 366 switch($this->Mailer) 367 { 368 case "sendmail": 369 $result = $this->SendmailSend($header, $body); 370 break; 371 case "mail": 372 $result = $this->MailSend($header, $body); 373 break; 374 case "smtp": 375 $result = $this->SmtpSend($header, $body); 376 break; 377 default: 378 $this->SetError($this->Mailer . $this->Lang("mailer_not_supported")); 379 $result = false; 380 break; 381 } 382 383 return $result; 384 } 385 386 /** 387 * Sends mail using the $Sendmail program. 388 * @access private 389 * @return bool 390 */ 391 function SendmailSend($header, $body) { 392 if ($this->Sender != "") 393 $sendmail = sprintf("%s -oi -f %s -t", $this->Sendmail, escapeshellarg($this->Sender)); 394 else 395 $sendmail = sprintf("%s -oi -t", $this->Sendmail); 396 397 if(!@$mail = popen($sendmail, "w")) 398 { 399 $this->SetError($this->Lang("execute") . $this->Sendmail); 400 return false; 401 } 402 403 fputs($mail, $header); 404 fputs($mail, $body); 405 406 $result = pclose($mail) >> 8 & 0xFF; 407 if($result != 0) 408 { 409 $this->SetError($this->Lang("execute") . $this->Sendmail); 410 return false; 411 } 412 413 return true; 414 } 415 416 /** 417 * Sends mail using the PHP mail() function. 418 * @access private 419 * @return bool 420 */ 421 function MailSend($header, $body) { 422 $to = ""; 423 for($i = 0; $i < count($this->to); $i++) 424 { 425 if($i != 0) { $to .= ", "; } 426 $to .= $this->to[$i][0]; 427 } 428 429 if ($this->Sender != "" && strlen(ini_get("safe_mode"))< 1) 430 { 431 $old_from = ini_get("sendmail_from"); 432 ini_set("sendmail_from", $this->Sender); 433 $params = sprintf("-oi -f %s", $this->Sender); 434 $rt = @mail($to, $this->EncodeHeader($this->Subject), $body, 435 $header, $params); 436 } 437 else 438 $rt = @mail($to, $this->EncodeHeader($this->Subject), $body, $header); 439 440 if (isset($old_from)) 441 ini_set("sendmail_from", $old_from); 442 443 if(!$rt) 444 { 445 $this->SetError($this->Lang("instantiate")); 446 return false; 447 } 448 449 return true; 450 } 451 452 /** 453 * Sends mail via SMTP using PhpSMTP (Author: 454 * Chris Ryan). Returns bool. Returns false if there is a 455 * bad MAIL FROM, RCPT, or DATA input. 456 * @access private 457 * @return bool 458 */ 459 function SmtpSend($header, $body) { 460 include_once($this->PluginDir . "class-smtp.php"); 461 $error = ""; 462 $bad_rcpt = array(); 463 464 if(!$this->SmtpConnect()) 465 return false; 466 467 $smtp_from = ($this->Sender == "") ? $this->From : $this->Sender; 468 if(!$this->smtp->Mail($smtp_from)) 469 { 470 $error = $this->Lang("from_failed") . $smtp_from; 471 $this->SetError($error); 472 $this->smtp->Reset(); 473 return false; 474 } 475 476 // Attempt to send attach all recipients 477 for($i = 0; $i < count($this->to); $i++) 478 { 479 if(!$this->smtp->Recipient($this->to[$i][0])) 480 $bad_rcpt[] = $this->to[$i][0]; 481 } 482 for($i = 0; $i < count($this->cc); $i++) 483 { 484 if(!$this->smtp->Recipient($this->cc[$i][0])) 485 $bad_rcpt[] = $this->cc[$i][0]; 486 } 487 for($i = 0; $i < count($this->bcc); $i++) 488 { 489 if(!$this->smtp->Recipient($this->bcc[$i][0])) 490 $bad_rcpt[] = $this->bcc[$i][0]; 491 } 492 493 if(count($bad_rcpt) > 0) // Create error message 494 { 495 for($i = 0; $i < count($bad_rcpt); $i++) 496 { 497 if($i != 0) { $error .= ", "; } 498 $error .= $bad_rcpt[$i]; 499 } 500 $error = $this->Lang("recipients_failed") . $error; 501 $this->SetError($error); 502 $this->smtp->Reset(); 503 return false; 504 } 505 506 if(!$this->smtp->Data($header . $body)) 507 { 508 $this->SetError($this->Lang("data_not_accepted")); 509 $this->smtp->Reset(); 510 return false; 511 } 512 if($this->SMTPKeepAlive == true) 513 $this->smtp->Reset(); 514 else 515 $this->SmtpClose(); 516 517 return true; 518 } 519 520 /** 521 * Initiates a connection to an SMTP server. Returns false if the 522 * operation failed. 523 * @access private 524 * @return bool 525 */ 526 function SmtpConnect() { 527 if($this->smtp == NULL) { $this->smtp = new SMTP(); } 528 529 $this->smtp->do_debug = $this->SMTPDebug; 530 $hosts = explode(";", $this->Host); 531 $index = 0; 532 $connection = ($this->smtp->Connected()); 533 534 // Retry while there is no connection 535 while($index < count($hosts) && $connection == false) 536 { 537 if(strstr($hosts[$index], ":")) 538 list($host, $port) = explode(":", $hosts[$index]); 539 else 540 { 541 $host = $hosts[$index]; 542 $port = $this->Port; 543 } 544 545 if($this->smtp->Connect($host, $port, $this->Timeout)) 546 { 547 if ($this->Helo != '') 548 $this->smtp->Hello($this->Helo); 549 else 550 $this->smtp->Hello($this->ServerHostname()); 551 552 if($this->SMTPAuth) 553 { 554 if(!$this->smtp->Authenticate($this->Username, 555 $this->Password)) 556 { 557 $this->SetError($this->Lang("authenticate")); 558 $this->smtp->Reset(); 559 $connection = false; 560 } 561 } 562 $connection = true; 563 } 564 $index++; 565 } 566 if(!$connection) 567 $this->SetError($this->Lang("connect_host")); 568 569 return $connection; 570 } 571 572 /** 573 * Closes the active SMTP session if one exists. 574 * @return void 575 */ 576 function SmtpClose() { 577 if($this->smtp != NULL) 578 { 579 if($this->smtp->Connected()) 580 { 581 $this->smtp->Quit(); 582 $this->smtp->Close(); 583 } 584 } 585 } 586 587 /** 588 * Sets the language for all class error messages. Returns false 589 * if it cannot load the language file. The default language type 590 * is English. 591 * @param string $lang_type Type of language (e.g. Portuguese: "br") 592 * @param string $lang_path Path to the language file directory 593 * @access public 594 * @return bool 595 */ 596 function SetLanguage($lang_type, $lang_path = "language/") { 597 if(file_exists($lang_path.'phpmailer.lang-'.$lang_type.'.php')) 598 include($lang_path.'phpmailer.lang-'.$lang_type.'.php'); 599 else if(file_exists($lang_path.'phpmailer.lang-en.php')) 600 include($lang_path.'phpmailer.lang-en.php'); 601 else 602 { 603 $this->SetError("Could not load language file"); 604 return false; 605 } 606 $this->language = $PHPMAILER_LANG; 607 608 return true; 609 } 610 611 /////////////////