Version 4.7.23

This commit is contained in:
Neo committed 2025-12-19 16:21:27 -08:00
1 parent 7124a02564
commit 25ddeb65d6
1791 files changed
+76990 -44452

No files matched your search

+66 -10
View File
@@ -10,6 +10,14 @@
namespace IPS\Email\Outgoing;
use IPS\Helpers\Form\Number;
use IPS\Helpers\Form\Password;
use IPS\Helpers\Form\Select;
use IPS\Helpers\Form\Text;
use IPS\Login;
use IPS\Http\Url;
use IPS\Settings;
/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
@@ -97,7 +105,7 @@ class _SMTP extends \IPS\Email
}
/* Connect */
$connection = @fsockopen( ( ( $this->smtpProtocol == 'ssl' ) ? 'ssl://' : '' ) . $this->smtpHost, $this->smtpPort, $errno, $errstr );
$connection = @fsockopen( ( ( $this->smtpProtocol == 'ssl' ) ? 'ssl://' : '' ) . $this->smtpHost, $this->smtpPort, $errno, $errstr, \IPS\Request::isCliEnvironment() ? \IPS\VERY_LONG_REQUEST_TIMEOUT : \IPS\DEFAULT_REQUEST_TIMEOUT );
if ( !$connection )
{
throw new \IPS\Email\Outgoing\Exception( $errstr, $errno );
@@ -118,15 +126,16 @@ class _SMTP extends \IPS\Email
}
/* HELO/EHLO */
$ehloFqdn = \IPS\Http\Url::internal('')->data['host'];
try
{
$helo = 'EHLO';
$responseCode = $this->_sendCommand( 'EHLO ' . $this->smtpHost, 250 );
$responseCode = $this->_sendCommand( 'EHLO ' . $ehloFqdn, 250 );
}
catch ( \IPS\Email\Outgoing\Exception $e )
{
$helo = 'HELO';
$responseCode = $this->_sendCommand( 'HELO ' . $this->smtpHost, 250 );
$responseCode = $this->_sendCommand( 'HELO ' . $ehloFqdn, 250 );
}
/* Is TLS being used? */
@@ -153,7 +162,7 @@ class _SMTP extends \IPS\Email
}
/* Exchange server (at least) wants EHLO resending for STARTTLS */
$this->_sendCommand( $helo . ' ' . $this->smtpHost, 250 );
$this->_sendCommand( $helo . ' ' . $ehloFqdn, 250 );
}
/* Authenticate */
@@ -180,22 +189,27 @@ class _SMTP extends \IPS\Email
public function _send( $to, $cc=array(), $bcc=array(), $fromEmail = NULL, $fromName = NULL, $additionalHeaders = array() )
{
/* Get the from email */
$fromEmail = $fromEmail ?: \IPS\Settings::i()->email_out;
$fromEmail = $fromEmail ?: Settings::i()->email_out;
/* SMTP requires you to do CC/BCC by sending a RCPT TO command for each recipient. We'll hide BCC by not actually setting that header */
$recipieintsForSmtp = explode( ',', static::_parseRecipients( $to, TRUE ) );
$recipientsForSmtp = explode( ',', static::_parseRecipients( $to, TRUE ) );
if ( $cc )
{
$recipieintsForSmtp = array_merge( $recipieintsForSmtp, explode( ',', static::_parseRecipients( $cc, TRUE ) ) );
$recipientsForSmtp = array_merge( $recipientsForSmtp, explode( ',', static::_parseRecipients( $cc, TRUE ) ) );
}
if ( $bcc )
{
$recipieintsForSmtp = array_merge( $recipieintsForSmtp, explode( ',', static::_parseRecipients( $bcc, TRUE ) ) );
$recipientsForSmtp = array_merge( $recipientsForSmtp, explode( ',', static::_parseRecipients( $bcc, TRUE ) ) );
}
$recipientsForSmtp = array_unique( array_map( 'trim', $recipientsForSmtp ) );
if( empty( $additonalHeaders['Message-ID'] ) )
{
$additionalHeaders['Message-ID'] = $this->generateMessageId();
}
$recipieintsForSmtp = array_unique( array_map( 'trim', $recipieintsForSmtp ) );
/* Send */
$this->_sendCompiled( $fromEmail, $recipieintsForSmtp, $this->compileFullEmail( $to, $cc, array(), $fromEmail, $fromName, $additionalHeaders ) );
$this->_sendCompiled( $fromEmail, $recipientsForSmtp, $this->compileFullEmail( $to, $cc, array(), $fromEmail, $fromName, $additionalHeaders ) );
}
/**
@@ -282,6 +296,18 @@ class _SMTP extends \IPS\Email
/* Return */
return $response;
}
/**
* Generate random message-id
*
* @return string
*/
public function generateMessageId(): string
{
$randomString = base_convert( microtime(false ) . '.' . Login::generateRandomString(), 10, 36 );
return '<' . $randomString . '@' . Url::internal('')->data[ Url::COMPONENT_HOST ] . '>';
}
/**
* Return the SMTP log
@@ -292,4 +318,34 @@ class _SMTP extends \IPS\Email
{
return $this->log;
}
/**
* Form fields for email handler
* These will automatically toggle on when the email handler is selected to be used
*
* @return array
*/
public static function form(): array
{
$form = [];
$options = array( 'plain' => 'smtp_plaintext', 'ssl' => 'smtp_ssl', 'tls' => 'smtp_tls' );
$form['smtp_host'] = new Text( 'smtp_host', Settings::i()->smtp_host, FALSE, [], NULL, NULL, NULL, 'smtp_host' );
$form['smtp_protocol'] = new Select( 'smtp_protocol', Settings::i()->smtp_protocol, FALSE, [ 'options' => $options ], NULL, NULL, NULL, 'smtp_protocol' );
$form['smtp_port'] = new Number( 'smtp_port', Settings::i()->smtp_port, FALSE, [], NULL, NULL, NULL, 'smtp_port' );
$form['smtp_user'] = new Text( 'smtp_user', Settings::i()->smtp_user, FALSE, [], NULL, NULL, NULL, 'smtp_user' );
$form['smtp_pass'] = new Password( 'smtp_pass', Settings::i()->smtp_pass, FALSE, [ 'enforceMaxLimit' => FALSE ], NULL, NULL, NULL, 'smtp_pass' ) ;
return $form;
}
/**
* Is this email class usable?
*
* @param string $type Email Type
* @return bool
*/
public static function isUsable( string $type ): bool
{
return true;
}
}