setHost($host);
}
/**
*
* get local server name
*
* @return string
*/
public function getName()
{
return $this->_name;
}
/**
*
* set local server name
*
* @param string $name
*/
public function setName($name)
{
$this->_name = $name;
}
/**
*
* get remote smtp hostname
*
* @return string
*/
public function getHost()
{
return $this->_host;
}
/**
*
* set remote smtp hostname
*
* @param string $host
*
* @return $this
*/
public function setHost($host)
{
$this->_host = $host;
return $this;
}
/**
*
* get smtp port
*
* @return int
*/
public function getPort()
{
return $this->_port;
}
/**
*
* set remote smtp port
*
* 7.8: if port is 465, use ssl
*
* @param int $port
*
* @return $this
*/
public function setPort($port)
{
$this->_port = $port;
if ($port == '465') {
$this->setProtocol('ssl');
}
return $this;
}
/**
*
* get secure string
*
* @return string
*/
public function getProtocol()
{
return $this->_protocol;
}
/**
*
* set protocol
*
* @param string $protocol
*
* @return $this
*/
public function setProtocol($protocol)
{
if ('tls' == $protocol) {
$this->_protocol = 'tcp';
$this->_tls = true;
}
else {
$this->_protocol = $protocol;
$this->_tls = false;
}
return $this;
}
/**
*
* get smtp username
*
* @return string
*/
public function getUsername()
{
return $this->_username;
}
/**
*
* set smtp username
*
* @param string $username
*
* @return $this
*/
public function setUsername($username)
{
$this->_username = $username;
return $this;
}
/**
*
* get smtp password
*
* @return string
*/
public function getPassword()
{
return $this->_password;
}
/**
*
* set smtp password
*
* @param string $password
*
* @return $this
*/
public function setPassword($password)
{
$this->_password = $password;
return $this;
}
/**
*
* get output messages from the smtp server
*
* @return string
*/
public function getDebug()
{
return (string)$this->_debug;
}
/**
*
* connect method
*
* @return bool
*/
public function connect()
{
$hostname = (($this->_protocol == 'ssl') ? 'ssl://' : '') . $this->_host;
$this->_connection = fsockopen($hostname, $this->_port, $errno, $errstr, 30);
// response
if ($this->_getCode() !== 220) {
return false;
}
fputs($this->_connection, 'EHLO ' . $this->_name . "\r\n");
if ($this->_getCode() !== 250) {
fputs($this->_connection, 'HELO ' . $this->_name . "\r\n");
if ($this->_getCode() !== 250) {
return false;
}
}
if ($this->_tls === true) {
fputs($this->_connection, 'STARTTLS' . "\r\n");
if ($this->_getCode() !== 220) {
return false;
}
stream_socket_enable_crypto($this->_connection, true, STREAM_CRYPTO_METHOD_TLS_CLIENT);
fputs($this->_connection, 'EHLO ' . $this->_name . "\r\n");
if ($this->_getCode() !== 250) {
fputs($this->_connection, 'HELO ' . $this->_name . "\r\n");
if ($this->_getCode() !== 250) {
return false;
}
}
}
if ($this->_host != 'localhost') {
fputs($this->_connection, 'AUTH LOGIN' . "\r\n");
if ($this->_getCode() !== 334) {
return false;
}
fputs($this->_connection, base64_encode($this->_username) . "\r\n");
if ($this->_getCode() !== 334) {
return false;
}
fputs($this->_connection, base64_encode($this->_password) . "\r\n");
if ($this->_getCode() !== 235) {
return false;
}
}
return true;
}
/**
*
* disconnect method
*
* @return $this
*/
public function disconnect()
{
if ($this->isConnection()) {
$this->_command('QUIT');
fclose($this->_connection);
}
return $this;
}
/**
*
* check if we have an open connection
*
* @1.9: add additional headers
* @1.9: if message is in html, generate text/plain version as well
*
* @return bool
*/
public function isConnection()
{
return ($this->_connection) ? true : false;
}
/**
*
* send mail method
*
* @return bool
*/
public function send()
{
$result = false;
if ($this->connect()) {
// deliver the email
$mail = $this->getMail();
$from = $mail->getFrom();
$replyTo = $mail->getReplyTo();
$cc = $mail->getCc();
$bcc = $mail->getBcc();
$contentType = $mail->getContentType();
$charset = $mail->getCharset();
$body = $mail->getBody();
foreach ($mail->getTo() as $to) {
$this->_command("MAIL FROM:<{$from['address']}>");
$this->_command("RCPT TO:<" . $to['address'] . ">");
$this->_command("DATA");
fputs($this->_connection, "To: " . $this->_formatAddress($to) . self::CRLF
. "From: " . $this->_formatAddress($from) . self::CRLF
. "Subject: " . $mail->getSubject() . self::CRLF);
if (count($cc) > 0) {
fputs($this->_connection, "Cc: {$cc['address']}" . self::CRLF);
}
if (count($bcc) > 0) {
fputs($this->_connection, "Bcc: {$cc['address']}" . self::CRLF);
}
if (count($replyTo) > 0) {
fputs($this->_connection, "Reply-to: {$replyTo['address']}" . self::CRLF);
}
fputs($this->_connection, "X-Sender: <{$from['address']}>" . self::CRLF
. "Return-Path: <{$from['address']}>" . self::CRLF
. "Errors-To: <{$from['address']}>" . self::CRLF
. "Date: " . $mail->getDate() . self::CRLF
. "Message-ID: " . $mail->getMessageId() . self::CRLF
. "X-Mailer: Cube Framework/SMTP" . self::CRLF
. "X-Priority: 3" . self::CRLF
. "MIME-Version: 1.0" . self::CRLF
. "Content-Type: " . sprintf('%s; charset="%s"', $contentType, $charset) . self::CRLF
. self::CRLF
. $body . self::CRLF
. "." . self::CRLF);
$this->_getServerResponse();
}
$result = true;
}
// disconnect
$this->disconnect();
// return
return $result;
}
protected function _command($command, $description = null, $result = null)
{
$code = null;
if ($this->isConnection()) {
fputs($this->_connection, $command . self::CRLF);
if ($description === null) {
$description = $command;
}
$this->_debug .= '' . $description . '
';
$code = $this->_getCode();
}
return ($code === $result) ? true : false;
}
/**
*
* format an address field
*
* @param array $data array of data
*
* @return string formatted address
*/
protected function _formatAddress($data)
{
$address = array();
if (array_key_exists('address', $data)) {
$data = array($data);
}
foreach ((array)$data as $field) {
if (isset($field['name'])) {
$address[] = $field['name'] . ' <' . $field['address'] . '>';
}
else {
$address[] = $field['address'];
}
}
return implode('; ', $address);
}
/**
*
* get server response
*
* @return string
*/
protected function _getServerResponse()
{
$response = "";
while ($str = fgets($this->_connection, 4096)) {
$response .= $str;
if (substr($str, 3, 1) == " ") {
break;
}
}
$this->_debug .= '' . $response . '
';
return $response;
}
/**
*
* get the code from the server response
*
* @return int
*/
protected function _getCode()
{
// filter code from response
return (int)substr($this->_getServerResponse(), 0, 3);
}
}