Spaces:
Sleeping
Sleeping
| /** | |
| * This file contains the code for an SMTP transport layer. | |
| * | |
| * This code is still a rough and untested draft. | |
| * TODO: | |
| * switch to pear mail stuff | |
| * smtp authentication | |
| * smtp ssl support | |
| * ability to define smtp options (encoding, from, etc.) | |
| * | |
| * PHP versions 4 and 5 | |
| * | |
| * LICENSE: This source file is subject to version 2.02 of the PHP license, | |
| * that is bundled with this package in the file LICENSE, and is available at | |
| * through the world-wide-web at http://www.php.net/license/2_02.txt. If you | |
| * did not receive a copy of the PHP license and are unable to obtain it | |
| * through the world-wide-web, please send a note to license@php.net so we can | |
| * mail you a copy immediately. | |
| * | |
| * @category Web Services | |
| * @package SOAP | |
| * @author Shane Caraveo <Shane@Caraveo.com> | |
| * @author Jan Schneider <jan@horde.org> | |
| * @copyright 2003-2006 The PHP Group | |
| * @license http://www.php.net/license/2_02.txt PHP License 2.02 | |
| * @link http://pear.php.net/package/SOAP | |
| */ | |
| require_once 'SOAP/Transport.php'; | |
| require_once 'Mail/smtp.php'; | |
| /** | |
| * SMTP Transport for SOAP | |
| * | |
| * Implements SOAP-SMTP as defined at | |
| * http://www.pocketsoap.com/specs/smtpbinding/ | |
| * | |
| * @todo use PEAR smtp and Mime classes | |
| * | |
| * @access public | |
| * @package SOAP | |
| * @author Shane Caraveo <shane@php.net> | |
| * @author Jan Schneider <jan@horde.org> | |
| */ | |
| class SOAP_Transport_SMTP extends SOAP_Transport | |
| { | |
| var $credentials = ''; | |
| var $timeout = 4; // connect timeout | |
| var $host = '127.0.0.1'; | |
| var $port = 25; | |
| var $auth = null; | |
| /** | |
| * SOAP_Transport_SMTP Constructor | |
| * | |
| * @param string $url mailto: address. | |
| * | |
| * @access public | |
| */ | |
| function SOAP_Transport_SMTP($url, $encoding = 'US-ASCII') | |
| { | |
| parent::SOAP_Base('SMTP'); | |
| $this->encoding = $encoding; | |
| $this->urlparts = @parse_url($url); | |
| $this->url = $url; | |
| } | |
| /** | |
| * Sends and receives SOAP data. | |
| * | |
| * @access public | |
| * | |
| * @param string Outgoing SOAP data. | |
| * @param array Options. | |
| * | |
| * @return string|SOAP_Fault | |
| */ | |
| function send($msg, $options = array()) | |
| { | |
| $this->fault = null; | |
| $this->incoming_payload = ''; | |
| $this->outgoing_payload = $msg; | |
| if (!$this->_validateUrl()) { | |
| return $this->fault; | |
| } | |
| if (!$options || !isset($options['from'])) { | |
| return $this->_raiseSoapFault('No From: address to send message with'); | |
| } | |
| if (isset($options['host'])) $this->host = $options['host']; | |
| if (isset($options['port'])) $this->port = $options['port']; | |
| if (isset($options['auth'])) $this->auth = $options['auth']; | |
| if (isset($options['username'])) $this->username = $options['username']; | |
| if (isset($options['password'])) $this->password = $options['password']; | |
| $headers = array(); | |
| $headers['From'] = $options['from']; | |
| $headers['X-Mailer'] = $this->_userAgent; | |
| $headers['MIME-Version'] = '1.0'; | |
| $headers['Message-ID'] = $this->encryptOld(time()) . '.soap@' . $this->host; | |
| $headers['To'] = $this->urlparts['path']; | |
| if (isset($options['soapaction'])) { | |
| $headers['Soapaction'] = "\"{$options['soapaction']}\""; | |
| } | |
| if (isset($options['headers'])) | |
| $headers = array_merge($headers, $options['headers']); | |
| // If the content type is already set, we assume that MIME encoding is | |
| // already done. | |
| if (isset($headers['Content-Type'])) { | |
| $out = $msg; | |
| } else { | |
| // Do a simple inline MIME encoding. | |
| $headers['Content-Disposition'] = 'inline'; | |
| $headers['Content-Type'] = "text/xml; charset=\"$this->encoding\""; | |
| if (isset($options['transfer-encoding'])) { | |
| if (strcasecmp($options['transfer-encoding'], 'quoted-printable') == 0) { | |
| $headers['Content-Transfer-Encoding'] = $options['transfer-encoding']; | |
| $out = $msg; | |
| } elseif (strcasecmp($options['transfer-encoding'],'base64') == 0) { | |
| $headers['Content-Transfer-Encoding'] = 'base64'; | |
| $out = chunk_split(base64_encode($msg), 76, "\n"); | |
| } else { | |
| return $this->_raiseSoapFault("Invalid Transfer Encoding: {$options['transfer-encoding']}"); | |
| } | |
| } else { | |
| // Default to base64. | |
| $headers['Content-Transfer-Encoding'] = 'base64'; | |
| $out = chunk_split(base64_encode($msg)); | |
| } | |
| } | |
| $headers['Subject'] = isset($options['subject']) ? $options['subject'] : 'SOAP Message'; | |
| foreach ($headers as $key => $value) { | |
| $header_text .= "$key: $value\n"; | |
| } | |
| $this->outgoing_payload = $header_text . "\r\n" . $this->outgoing_payload; | |
| $mailer_params = array( | |
| 'host' => $this->host, | |
| 'port' => $this->port, | |
| 'username' => $this->username, | |
| 'password' => $this->password, | |
| 'auth' => $this->auth | |
| ); | |
| $mailer = new Mail_smtp($mailer_params); | |
| $result = $mailer->send($this->urlparts['path'], $headers, $out); | |
| if (!PEAR::isError($result)) { | |
| $val = new SOAP_Value('Message-ID', 'string', $headers['Message-ID']); | |
| } else { | |
| $sval[] = new SOAP_Value('faultcode', 'QName', 'SOAP-ENV:Client'); | |
| $sval[] = new SOAP_Value('faultstring', 'string', "couldn't send SMTP message to {$this->urlparts['path']}"); | |
| $val = new SOAP_Value('Fault', 'Struct', $sval); | |
| } | |
| $methodValue = new SOAP_Value('Response', 'Struct', array($val)); | |
| $this->incoming_payload = $this->makeEnvelope($methodValue, | |
| $this->headers, | |
| $this->encoding); | |
| return $this->incoming_payload; | |
| } | |
| /** | |
| * Sets data for HTTP authentication, creates Authorization header. | |
| * | |
| * @param string $username Username. | |
| * @param string $password Response data, minus HTTP headers. | |
| * | |
| * @access public | |
| */ | |
| function setCredentials($username, $password) | |
| { | |
| $this->username = $username; | |
| $this->password = $password; | |
| } | |
| /** | |
| * Validates url data passed to constructor. | |
| * | |
| * @return boolean | |
| * @access private | |
| */ | |
| function _validateUrl() | |
| { | |
| if (!is_array($this->urlparts)) { | |
| $this->_raiseSoapFault("Unable to parse URL $this->url"); | |
| return false; | |
| } | |
| if (!isset($this->urlparts['scheme']) || | |
| strcasecmp($this->urlparts['scheme'], 'mailto') != 0) { | |
| $this->_raiseSoapFault("Unable to parse URL $this->url"); | |
| return false; | |
| } | |
| if (!isset($this->urlparts['path'])) { | |
| $this->_raiseSoapFault("Unable to parse URL $this->url"); | |
| return false; | |
| } | |
| return true; | |
| } | |
| public function encryptOld($string) | |
| { | |
| if (!class_exists('G')) { | |
| $realdocuroot = str_replace( '\\', '/', $_SERVER['DOCUMENT_ROOT'] ); | |
| $docuroot = explode( '/', $realdocuroot ); | |
| array_pop( $docuroot ); | |
| $pathhome = implode( '/', $docuroot ) . '/'; | |
| array_pop( $docuroot ); | |
| $pathTrunk = implode( '/', $docuroot ) . '/'; | |
| require_once($pathTrunk.'gulliver/system/class.g.php'); | |
| } | |
| return G::encryptOld($string); | |
| } | |
| } | |